Я пытаюсь начать работу с OOAD, эта проблема пришла мне на ум, и я не уверен, что смогу найти хорошее решение: (это суперсимметричная версия реального мира).
Рыбак ловит рыбу у пруда с удочкой. При каждом запуске лески есть вероятность поймать рыбу равной 1/10 при солнечном свете и 1/20 ночью.
Какие классы определить? Я бы ответил: Рыбак, Рыбалка, Понд, День (для моделирования ночью и днем).
Какие методы? Я бы ответил: Fisherman.Launch(FishingRod), FIshingRod.TryToFish(Pond) возвращает boolean
Как моделировать вероятность?. У кого есть ответственность правдоподобия? Он не принадлежит рыбаку или пруду. В этом примере есть связь только с дневным светом, в реальном мире это, вероятно, связано также с рыбаком, рыболовом и прудом.
Как смоделировать внешний фактор (дневной свет)?
Любые комментарии приветствуются. Также образцы кода.
UPDATE: Первый комментарий к вопросу и ответы на вопрос, чтобы заставить меня быть более конкретным. Как я уже писал выше, "это суперсимметричная версия реального мира", в любом случае позвольте сказать, что я хочу увеличить сложность позже, а не увеличивать ее, допустим, увеличить ее достаточно, чтобы было хорошо, чтобы все классы, перечисленные мной выше (например, потому что я отслеживаю, сколько рыб есть в пруду, как устал рыбак,...). В любом случае наиболее интересными для меня вопросами являются "как моделировать вероятность" и "внешние факторы". Рассматривайте это как вопрос новичков для людей, которые не имеют большого количества навыков в OOAD.
У меня были бы Рыбак, Рыбалка, Рыбалка, Пруд, Рыба и "Небо" (или "Окружающая среда" ).
В объектно-ориентированной земле объекты обычно оказываются умнее, чем вы думаете. Рыбак "имеет" (содержит) FishingRod. Он бросает FishingLine (компонент FishingRod) в пруд. Пруд "смотрит" на Небо, чтобы определить, день или ночь, затем бросает кости, чтобы определить, должен ли он поместить Рыбу в Линию.
Иерархия объектов, которая встряхивается, заключается в том, что FishingLine может дополнительно содержать Рыбу и принадлежит Рыболовству, принадлежащему Рыбаку. Пруд содержит рыбу, получает FishingLines, но не "владеет" ими, а также знает, но не владеет Sky.
Следующие методы будут выглядеть примерно так:
Fisherman.FishingRod - свойство инициализации (или пара методов getter/setter), используемое для того, чтобы дать Рыбаку FishingRod для FishAt() пруд с. Это необязательно; Рыбак может создать свой собственный FishingRod, или он сам может выбрать его из коллекции FishingRods, вместо того, чтобы дать ему FishingRod.
Fisherman.FishAt(Pond) - сообщите Рыбаку, чтобы он использовал свой FishingRod для запуска() FishingLine в пруд, а затем Retrieve(), чтобы получить Fish.
FishingRod.Launch(Pond) - Освобождает Fishing Fishing RolfLine в пруду.
FishingRod.Retrieve() - Извлекает FishingLine из пруда, возвращая Рыбу, которая также может быть ничего.
Pond.StockWith(Fish []) - дает рыбе пруда для рыбака, чтобы поймать FishingRod. Помните, что в OO-стране все должно либо быть тем, что нужно, либо знать, как это сделать; Пруд может так же легко создать Рыбу, если та модель, которую вы хотите использовать, но рассказ пользователя здесь не сказал, как это происходит (обычно это означает, что это выходит за рамки истории).
Pond.SetFishingLine(FishingLine) - используется FishingRod для размещения своей рыболовной линии в пруду. Это "управляющая функция", которая включает бизнес-логику. Когда это называется, Пруд должен спросить Небо, если он будет днем, и, возможно, поставить Рыбу на Рыболовную лодку, исходя из шансов, предоставленных времени суток.
Sky.IsDay() - метод, который возвращает true, если он день и false, если он ночной.
Если вы считаете, что Пруд не должен прямо знать точные правила, по которым Рыба попадает на Рыболовную ловушку, это может дать Рыболовной ловушке и ее Рыбе [] то, что называется "чистой фабрикой". Это изготовление, "FishingLogic", было бы тем, кто изучил Небо и применил бы правила. В разработке это часто бывает хорошо, потому что это означает, что FishingLogic может меняться без изменения пруда, если FishingLogic больше не нуждается в Pond (например, температуре воды).
Различные объекты представляют различные базовые "шаблоны" в реальном программировании:
Класс рыбы также может "смотреть на небо", чтобы решить, насколько он голоден. Класс пруда кажется довольно инертным.
Fisherman, Rod, Line, Fish, Sky
Fisherman.cast(), .drinkBeer(), .chooseRod(), .addLineToRod()
Rod.cast()
Line.cast()
Fish.bite()
Fish.checkDay()
Sky.isDay()
Нет классов. Нет методов. Одна функция с тремя аргументами.
bool launch_rod(bool daytime, float chance_daytime, float chance_night) {
float chance = daytime ? chance_daytime : chance_night;
float cast = random_float();
return cast < chance;
}
Вот и все. Возможно, просто, возможно, заверните все это в класс и создайте свойства chance_daytime и chance_night этого класса. Все остальное, учитывая спецификации, является чрезмерным.