Я ржавый программист, пытающийся снова научиться в этой области. Я обнаружил, что мое самоучка и формальное образование породили некоторые вредные привычки. В связи с этим я пытаюсь сосредоточиться на хороших шаблонах проектирования и, соответственно, когда они ошибаются. Язык - Java, и вот моя проблема:
Я пытаюсь написать программное обеспечение для пивоварения. В пивоварении иногда необходимо заменить определенное разнообразие хмеля тем, что требуется в рецепте. Например, у вас может быть рецепт, который требует хмеля «Амарилло», но все, что вы можете получить, это «Каскад», который имеет достаточно похожий аромат для замены; хмель имеет количество альфа-кислоты (на данную массу), и соотношение между двумя хмелями является частью формулы замещения. Я пытаюсь смоделировать это (правильно) в моей программе.
Мой первоначальный вариант - иметь два объекта. Один HopVariety
, который содержит общую описательную информацию о множестве прыжков, и один HopIngredient
, который является конкретным экземпляром HopVariety
и также включает количество, используемое в данном рецепте. HopIngredient
должен знать о своем разнообразии, а HopVariety
должен знать, что можно использовать вместо него (не все замены симметричны). Это похоже на хороший ООП.
Проблема заключается в следующем: я пытаюсь следовать хорошей практике и сделать свои ценностные объекты неизменными. (В моей голове я классифицирую HopVariety
и HopIngredient
как объекты-значения, а не как «актеры».) Однако мне нужно, чтобы пользователь мог обновлять данное HopVariety новыми жизнеспособными заменами. Если я буду следовать неизменности, эти изменения не будут распространяться на отдельные ингредиенты. Если выбрать изменчивость, я плохо себя веду , потенциально вводя побочные эффекты, разделяя изменяемый объект значения.
Итак, вариант B: ввести сортовую коллекцию сортов и свободно объединить ингредиенты и разновидности по имени или уникальному идентификатору. И затем VarietySubstitutionManager, так что сорта не содержат ссылок на другие сорта, только на их идентификаторы. Это идет вразрез с тем, что я хочу сделать, потому что наличие ссылки на объект разнообразия имеет интуитивный смысл, и теперь я представляю то, что кажется чрезмерным уровнем абстракции, а также отделяю функции от данных.
Итак, как мне правильно распределить состояние среди того, что составляет конкретные экземпляры? Какой правильный или, по крайней мере, самый разумный способ решить проблему?