Объект-значение (Value Object)
Как след ует спроектировать объект, который буд ет широко
использоваться, но д ля которого ид ентификация не имеет о собого
значения? Настройте со стояние объекта в момент его созд ания и
никогд а не меняйте его. В результате выполнения любых операций с
д анным объектом д олжен получаться новый объект.
Объектно-ориентированный под ход – это великолепная вещь.
Над еюсь, я имею право написать эту фразу в д анной книге. Объекты
являются отличным спо собом организации логики д ля по след ующего
понимания и ро ста. Од нако существует од на маленькая проблема
(хорошо, хорошо, вообще-то проблем больше, од нако сейчас мы
ко снемся только од ной из них).
Пред ставьте, что я – объект и у меня есть прямоугольник
(Rectangle). Я вычисляю некоторое значение, зависящее от этого
прямоугольника, например его площад ь. Чуть позже некто (например,
д ругой объект) вежливо про сит меня пред о ставить ему мой
прямоугольник д ля выполнения некоторой операции. Чтобы не
показаться невежливым, я пред о ставляю ему мой прямоугольник. А
через пару мгновений, вы только по смотрите, прямоугольник был
мод ифицирован у меня за спиной! Значение площад и, которое я
вычислил ранее, теперь не соответствует д ействительно сти, и не
существует спо соба известить меня об этом.
Это классический пример проблемы наложения имен (aliasing). Если
д ва объекта ссылаются на од ин и тот же третий объект и если од ин из
первых д вух тем или иным образом изменяет третий, общий д ля них,
объект, второму объекту лучше не полагаться на текущее со стояние
общего объекта.
Существует несколько спо собов решения проблемы наложения
имен. Во-первых, вы можете никому не отд авать объект, от со стояния
которого вы зависите. Вместо этого в случае необход имо сти вы можете
созд авать копии этого объекта. Такой под ход может потребовать
слишком много времени и слишком много про странства, кроме того,
игнорируется ситуация, когд а вы хотите сд елать изменения некоторого
объекта общими д ля нескольких д ругих объектов, зависящих от его
со стояния. Еще од но решение – шаблон «Наблюд атель» (Observer). В
этом случае, если вы зависите от со стояния некоторого объекта, вы
д олжны пред варительно сообщить ему об этом, иначе говоря,
зарегистрироваться. Объект, за со стоянием которого след ят, оповещает
все зарегистрированные им объекты-наблюд атели о своем изменении.
Шаблон «Наблюд атель» (Observer) может затруд нить понимание
по след овательно сти выполнения операций, кроме того, логика
формирования и уд аления зависимо стей межд у объектами выгляд ит
д алеко не ид еальной.
Еще од но решение пред лагает несколько ограничить возможно сти,
которыми облад ает типичный объект в рамках ООП. Образно говоря,
объект становится «менее чем объектом». Что это значит? Обычные
объекты облад ают со стоянием, которое изменяется с течением времени.
Если мы захотим, мы можем запретить им меняться. Если у меня есть
объект и я знаю, что он не может измениться, я могу перед авать ссылки
на этот объект любому д ругому объекту, не беспокоясь при этом о
проблеме наложения имен. Если объект не под д ерживает возможно сти
своего изменения, никаких мод ификаций у меня за спиной не может
произойти.
Я помню, как похожая ситуация возникла с целыми числами, когд а я
впервые изучал язык Smalltalk. Если я изменяю бит 2 на 1, почему все
д войки не становятся шестерками?
a:= 2.
b:= a.
a:= a bitAt: 2 put: 1.
Do'stlaringiz bilan baham: |