2016-11-10 5 views
1

DDDに関する多くのJavaチュートリアルでは、エンティティは可変オブジェクトです。上記の例で ScalaのDDD:エンティティは不変であるべきですか?

class Product { 

    private String status; 

    public void prepare() { 
     this.status = "Prepearing"; 
    } 
} 

調製メソッドは、オブジェクトの内部状態を変異します。

しかしScalaで、私は私のエンティティが不変になりたい:代わりにオブジェクトを変異の

case class Product(status: String) { 
    def prepare: Product = { 
     this.copy(status = "Prepearing"); 
    } 
} 

だから、私は新しいエンティティをバック返します。

DDDに関して、不変のエンティティとそれ以上の実装を持つことは大丈夫ですか?

また、より良い方法をお勧めしますか?

+0

を表現することができ、この質問はおそらくhttp://softwareengineering.stackexchange.com – Jubobs

答えて

1

DDDでは、エンティティは自然に異なるライフサイクルステージまたは状態を示します。上記の例では、製品のステータスは「準備中」、「実行中」、「配送中」、「配送中」などとなります。このライフサイクルのために、状態パターンを使用してエンティティをモデル化する誘惑があります。 DDDの専門家の中には、エンティティの状態パターンの自由使用を強く控えるものもある。理由は、エンティティのメソッドが副作用を引き起こす可能性があるからです。副作用はコードをテストするのを困難にする可能性があり、しばしばバグの原因となることがあります。上記のProductクラスは、どの状態を操作する必要があるかを明示的に指定できる必要があります。まだ準備されておらず、履行されていないものは出荷できません。

+0

のためのより良いフィットだろうだから、第二は、正しい例? – Teimuraz

+0

はい。あなたが見たいと思うかもしれないものは、記念碑のパターンです - http://www.dofactory.com/net/memento-design-pattern – alltej

1

エンティティは不変である必要がありますか?

はい、おそらくそうです。あなたのオブジェクトへの参照を保持していて、それを変更すると、それらの変更が表示されます。これは、値ではなくエンティティを使用する理由です。

レビュー投稿者:Vladimir Khorikov投稿:entities vs values; Jimmy Bogard; Martin Fowler ....

あなたはより良いアプローチをお勧めしますか?

エンティティの状態のための別のコンセプトを作成します。その状態を値オブジェクトとしましょう。 Clojure time model

class Product { 

    private State state; 

    public void prepare() { 
     this.state = this.state.updateStatus("Preparing"); 
    } 
} 

スチュアートHalloways'話はここで何が起こっているのかを説明するのに役立ちます。彼のdeckのスライド31には、一連の州としてのアイデンティティの良好な視覚化が含まれています。

また、あなたは完全にオブジェクト指向のアプローチを放棄し、純粋な関数などの変化

newState = theModel.prepare(oldState); 
関連する問題