1

私はさびついたプログラマーで、再び現場で学ぼうとしています。ふさわしく、独学と正式な教育の両方がいくつかの悪い習慣を引き起こしていることを発見しました. そういうわけで、私は良いデザイン パターン、ひいては、それらが間違っている場合について頭を悩ませようとしています。言語はJavaで、これが私の問題です:

ビール醸造を支援するソフトウェアを作成しようとしています。醸造では、レシピで求められているものを特定の種類のホップで代用しなければならないことがあります. たとえば、「アマリロ」ホップを必要とするレシピがあるかもしれませんが、代わりに十分に類似した香りを持つ「カスケード」しか得られません。ホップには(所定の質量あたりの)アルファ酸量があり、2 つのホップ間の比率は置換式の一部です。私は自分のプログラムでこれを(適切に)モデル化しようとしています。

私の最初の目的は、2 つのオブジェクトを持つことです。1HopVarietyつはさまざまなホップに関する一般的な説明情報を含む a で、もう 1 つHopIngredientは a の特定のインスタンス化であり、特定のHopVarietyレシピで使用される量も含まれます。HopIngredientその多様性についての知識が必要であり、そのHopVariety代わりに何が使用できるかについての知識が必要です (すべての置換が対称的であるとは限りません)。これは良いOOPのようです。

問題はこれです: 私は良い習慣に従い、値オブジェクトを不変にしようとしています。(私の頭では、 and を「アクター」ではなく値オブジェクトとして分類HopVarietyHopIngredientています。)ただし、ユーザーが特定の HopVariety を新しい実行可能な置換で更新できるようにする必要があります。不変性に従うと、これらの変更は個々の成分に伝播しません。可変性を選択した場合、可変値オブジェクトを共有することで副作用が発生する可能性があるため、動作がおかしくなりました。

したがって、オプション B: ある種の VarietyCollection を導入し、名前または一意の識別子を使用して材料と品種を緩やかに結合します。そして、VarietySubstitutionManager は、品種が他の品種への参照を保持せず、ID のみを保持するようにします。多様性オブジェクトへの参照を保持することは直感的に理にかなっているため、これは私がやりたいこととは反対です。そして今、過剰なレベルの抽象化のように感じるものを導入し、関数をデータから分離しています。

では、特定のインスタンスに相当するものの間で状態を適切に共有するにはどうすればよいでしょうか? 問題を解決するための適切な、または少なくとも最も健全な方法は何ですか?

4

3 に答える 3

1

本当にHopVariety値オブジェクトであるべきですか? 私にはエンティティのように聞こえます。「アマリロ」ホップの種類は唯一無二なので、一意に識別可能なオブジェクトである必要があります。「トニー・ウースター」が唯一無二のように(厳密には違いますが、要点はわかります ;))

ドメイン駆動設計と、エンティティと値オブジェクトの違いについて読むことをお勧めします。

ところで:DDDの本には、あなたのような状況の例とその対処方法がたくさんあります.

于 2009-04-08T05:48:10.477 に答える
0

あなたの選択はどちらかだと思います

  • 「さまざまな更新」機能を使用して既存のオブジェクト グラフをウォークし、すべての構成要素を更新して新しいオブジェクト グラフを作成する、または
  • 可変性を使い続ける

手元にある情報では、どちらがあなたの状況に適しているかはわかりません.

于 2009-04-08T05:38:45.447 に答える
0

複数の参照を持つオブジェクトのミューテーションをどの程度回避したいですか?

レシピ コレクションにユーザーの更新をさまざまなセットに反映させたい場合、およびオブジェクト内の変更可能なフィールドを回避したい場合は、関数オブジェクトの更新を使用してユーザー入力を処理する必要があります。

その道の終わりにI/O モナドがあります。その方向にどこまで行きたいですか?

S/ML などのミューテーションの副作用を許容する関数型言語を使用すると、バラエティと食材のオブジェクトを純粋に保ち、単一のミュータブルに格納されている最新のバラエティ コレクションから現在のバラエティ オブジェクトを返す関数を保存することを選択できます。参照セル。これは、違いを分割するための合理的な方法のように思えるかもしれません。

于 2009-05-26T22:12:32.170 に答える