私はさびついたプログラマーで、再び現場で学ぼうとしています。ふさわしく、独学と正式な教育の両方がいくつかの悪い習慣を引き起こしていることを発見しました. そういうわけで、私は良いデザイン パターン、ひいては、それらが間違っている場合について頭を悩ませようとしています。言語はJavaで、これが私の問題です:
ビール醸造を支援するソフトウェアを作成しようとしています。醸造では、レシピで求められているものを特定の種類のホップで代用しなければならないことがあります. たとえば、「アマリロ」ホップを必要とするレシピがあるかもしれませんが、代わりに十分に類似した香りを持つ「カスケード」しか得られません。ホップには(所定の質量あたりの)アルファ酸量があり、2 つのホップ間の比率は置換式の一部です。私は自分のプログラムでこれを(適切に)モデル化しようとしています。
私の最初の目的は、2 つのオブジェクトを持つことです。1HopVariety
つはさまざまなホップに関する一般的な説明情報を含む a で、もう 1 つHopIngredient
は a の特定のインスタンス化であり、特定のHopVariety
レシピで使用される量も含まれます。HopIngredient
その多様性についての知識が必要であり、そのHopVariety
代わりに何が使用できるかについての知識が必要です (すべての置換が対称的であるとは限りません)。これは良いOOPのようです。
問題はこれです: 私は良い習慣に従い、値オブジェクトを不変にしようとしています。(私の頭では、 and を「アクター」ではなく値オブジェクトとして分類HopVariety
しHopIngredient
ています。)ただし、ユーザーが特定の HopVariety を新しい実行可能な置換で更新できるようにする必要があります。不変性に従うと、これらの変更は個々の成分に伝播しません。可変性を選択した場合、可変値オブジェクトを共有することで副作用が発生する可能性があるため、動作がおかしくなりました。
したがって、オプション B: ある種の VarietyCollection を導入し、名前または一意の識別子を使用して材料と品種を緩やかに結合します。そして、VarietySubstitutionManager は、品種が他の品種への参照を保持せず、ID のみを保持するようにします。多様性オブジェクトへの参照を保持することは直感的に理にかなっているため、これは私がやりたいこととは反対です。そして今、過剰なレベルの抽象化のように感じるものを導入し、関数をデータから分離しています。
では、特定のインスタンスに相当するものの間で状態を適切に共有するにはどうすればよいでしょうか? 問題を解決するための適切な、または少なくとも最も健全な方法は何ですか?