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