Очень распространенный паттерн C #, который нарушает очень фундаментальный принцип ООП

Вот очень простой вопрос, который меня до сих пор очень беспокоит:

Почему сейчас широко принято, чтобы класс возвращал ссылку на свой закрытый член через метод доступа? Разве это не нарушает принцип инкапсуляции? Если это нормально, то почему бы просто не сделать члена общедоступным!?

public class EncapsulationViolator
{
  private object abuseMe;

  public object AbuseMe 
  {
    get { return abuseMe; }
  }
}

Изменить Случай, который я рассматривал, таков

EncapsulationViolator ev = new EncapsulationViolator();

object o = ev.AbuseMe;

o.SetValue(newValue);

Теперь состояние ev изменилось за счет транзитивности, потому что изменилось состояние его члена abuseMe.

В контексте DDD это недопустимо, если объект является совокупным корнем. Цитирую

Allow external objects to hold references to the root only. Transient references to internal members can be passed out for use within a single operation only. Because the root controls access, it cannot be blindsided by changes to the internals.

[Domain-Driven Design, Eric Evans]

... сеттеры шметтеры...

14
задан anotherdave 28 May 2014 в 17:52
поделиться