Учитывая инкапсуляцию объекта, должны ли получатели возвращать неизменное свойство? - PullRequest
18 голосов
/ 22 сентября 2008

Когда получатель возвращает свойство, например, возвращает List других связанных объектов, если этот список и его объекты неизменны, чтобы предотвратить код за пределами класса, изменяя состояние этих объектов, без основного родительского объекта познающий

Например, если у объекта Contact есть получатель getDetails, который возвращает List из ContactDetails объектов, то любой код, вызывающий этот получатель:

  1. может удалить ContactDetail объекты из этого списка, но объект Contact не знает об этом.
  2. может изменить каждый ContactDetail объект, не зная об этом Contact объекта.

Так что нам здесь делать? Должны ли мы просто доверять вызывающему коду и возвращать легко изменяемые объекты или идти сложным путем и создавать неизменный класс для каждого изменяемого класса?

Ответы [ 11 ]

0 голосов
/ 22 сентября 2008

Когда я начинал, я все еще находился под сильным влиянием HIDE YOUR DATA OO PRINCIPALS LOL. Я бы сидел и размышлял о том, что произойдет, если кто-нибудь изменит состояние одного из объектов, выставленных в собственность. Должен ли я заставить их читать только для внешних абонентов? Я не должен выставлять их вообще?

Коллекции довели эти тревоги до крайности. Я имею в виду, что кто-то может удалить все объекты в коллекции, пока я не смотрю!

В конце концов я понял, что если ваши объекты так сильно зависят от их внешне видимых свойств и их типов, что, если кто-то прикоснется к ним в плохом месте, вы начнете бумить, ваша архитектура будет испорчена.

Существуют веские причины сделать ваши внешние свойства доступными только для чтения, а их типы неизменяемыми. Но это угловой случай, а не типичный, imho.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...