У меня были бы Рыбак, Рыболовная удочка, Рыболовная леска, Пруд, Рыба и "Небо" (или "Окружающая среда").
На объектно-ориентированной земле объекты обычно оказываются умнее, чем вы думаете. Рыбак "имеет" (содержит) FishingRod. Он бросает FishingLine (компонент FishingRod) в Пруд. Пруд «смотрит» на небо, чтобы определить, день это или ночь, а затем бросает кубик, чтобы определить, стоит ли ему ставить рыбу на линию.
Иерархия объектов, которая встряхивает, заключается в том, что FishingLine может по выбору содержать Fish и принадлежит FishingRod, который принадлежит Fisherman. Пруд содержит Рыбу, получает FishingLines, но не «владеет» ими, а также знает о Небе, но не владеет им.
Следующие методы будут выглядеть примерно так:
Fisherman.FishingRod - свойство инициализации (или пара методов получения / установки), используемое, чтобы дать Рыболову FishingRod для FishAt () Pond с. Это необязательно; Рыбак может создать свой собственный FishingRod, или он сам может выбрать его из коллекции FishingRods вместо того, чтобы ему подарили FishingRod.
Fisherman.FishAt (Pond) - скажите Рыбаку, чтобы он использовал FishingRod, чтобы запустить () FishingLine в пруд, затем извлеките () его, чтобы получить рыбу.
FishingRod.Launch (Пруд) - высвобождает рыболовную леску FishingRod в пруд.
FishingRod.Retrieve () - Извлекает FishingLine из пруда, возвращая рыбу, которая также может быть ничем.
Pond.StockWith (Fish []) - Дает Прудовой Рыбе Рыбака, чтобы поймать с FishingRod. Помните, что в ОО-земле все должно быть либо дано, что оно хочет, либо знать, как это сделать; Пруд может так же легко создать Рыбу, если вы хотите следовать этой модели, но пользовательская история здесь не говорит, как это происходит (обычно это означает, что это выходит за рамки этой истории).
Pond.SetFishingLine (FishingLine) - используется FishingRod для помещения своей FishingLine в пруд. Это «движущая функция», которая включает в себя бизнес-логику. Когда это вызывается, Пруд должен спросить Небо, наступил ли день, и, возможно, поставить Рыбку на Леску, основываясь на шансах, указанных во времени дня.
Sky.IsDay () - метод, который возвращает true, если день, и false, если ночь.
Если вы думаете, что Пруд не должен напрямую знать точные правила, согласно которым Рыба попадает на Рыболовную Линию, он может отдать Рыболовную Линию и ее Рыбу [] так называемой «чистой фабрикации». Эта фальсификация, «FishingLogic», будет тем, кто исследует Небо и применяет правила. В процессе разработки это часто полезно, потому что это означает, что FishingLogic может меняться без изменения Pond, если FishingLogic не требуется больше от Pond (например, температура воды).
Различные объекты представляют различные базовые «шаблоны» в реальном программировании:
- Рыбак - «актер», ближайший аналог нашего пользователя. Пользователь такой системы в основном стоит за плечом актера и говорит ему, что делать.
- FishingRod - это «помощник» или «утилита». Это реальный аналог «инструмента» и содержит смесь логики состояния и бизнеса, которая помогает ему выполнять очень специфическую задачу.
- FishingLine в этой модели похож на «запрос» или «команду». Его единственная цель состоит в том, чтобы передаваться от одного объекта к другому, и, когда это происходит, он сигнализирует о том, что получатель должен предпринять конкретное действие.
- Рыба - это «ответ»; ответ на запрос. Может быть один, а может и нет.
- Пруд является "хранилищем"; он содержит вещи и обрабатывает запросы внешних объектов на эти вещи в соответствии с набором логики.
- Небо - это "государственное ведро". Он имеет данные и обеспечивает доступ к этим данным через свой интерфейс.
- FishingLogic - это «чистое изготовление»;он не имеет аналога «существительного» (объекта) в реальном мире, который мы моделируем, и существует для того, чтобы содержать экологические правила или вещи, которые происходят без того, чтобы модельные объекты не знали, как (как рыба решает попасть на крючок?)