1

ここで重要な概念が欠けているだけかもしれません。「ダム」データ オブジェクトを理解しています。また、ロールは、ダム オブジェクトがそのロールを引き受けるときに適用されるメソッドのステートレス コレクションであることも理解しています。また、コンテキストが、実装されるアルゴリズムで行われるアクターを組み立てることも理解しています。しかし、役割がお互いについて何を知っているか、そしてそれらが文脈の中で定義されなければならないか、それとも文脈の外で定義されなければならないかは、私にはわかりません.

コンテキストに start と end の 2 つの役割があるとします。私たちのユースケースは文字列連結なので、各ロールに文字列を割り当てます。

いくつかの疑似コード:

context concat {
    role start {
        method concat() {...}
        method get_value {self->as_string}
    }
    role end {
        method get_value {self->as_string}
    }

    // According to the docs I have read, the context simply kicks off a method in
    // a role, the role handles the rest.
    start.concat(?)    
}

concat() (メソッド) と start.concat(?) (呼び出し) の 3 つの異なる組み合わせが必要になる場合があります。

ロールは、同じコンテキスト内の他のロールを認識しています (ロールを他のコンテキストで再利用できないようにすることは、私には間違っているようです)。

concat{ self.get_value + end.get_value }
start.concat() // Not passing 'end' as an argument, 
               // it is already aware of end because
               // it is defined in the same context

ロールはコンテキスト内の他のロールを認識しないため、それらを引数として渡す必要があります (コンテキストが任意の数のロールを持つ可能性があるため、30 を渡す必要があるメソッドを開始することでコンテキストが開始される場合、これは苦痛に思えます) 'roles' を 1 つのメソッド呼び出しに引数として入れ、それらをずっと連鎖させてください!) (注: この例では、ロールの定義をコンテキストの外に移動して、複数のコンテキストで再利用することができます)

concat( end x ) { self.get_value + x.get_value )
start.concat(x)

私にとって最も明白な選択は、コンテキストに強制的にメソッドを開始させないようにすることです。次に、インタラクション ロジックをコンテキストに配置し、非インタラクティブな部分をロールに配置します。(注: この例では、役割の定義がコンテキストの外に移動され、いくつかのコンテキストで再利用される場合があります)

concat() UNDEFINED
start.get_value + x.get_value

ただし、これはこれと矛盾しているようです: http://en.wikipedia.org/wiki/Data,_Context_and_Interaction#Execution_Model

  1. Context は、ユース ケースに参加する最初のオブジェクトで Role メソッドを呼び出します。
  2. その時点から、ロールは互いのメソッドを呼び出してユース ケースを実行します。
4

1 に答える 1

4

DCI では、ロールは通常、コンテキストを認識しており、コンテキストは関連するすべてのロールのリポジトリとして機能できます。つまり、ロールがコンテキストにアクセスできるケース 2 であり、必要な他のロールを演じるオブジェクトを要求します。ただし、これは実装の詳細です。必要なオブジェクトをロール メソッドに渡すこともできます。重要な部分は、ロールがロール メソッドを介して相互に作用することです (つまり、ロール プレイヤー メソッドを介してではなく、不幸な結合が作成されるため)。ロールは、一般的に言えば、コンテキスト全体での再利用の候補になることは期待されていません。コンテキストはユース ケースにほぼ対応し、ロールはユース ケースの動作を実装します。一般に、そのロジックはユースケース間で再利用できません。

お役に立てれば。

また、DCI を紹介する artima の記事と、object-composition の Google グループもチェックしてください。

于 2011-08-05T09:53:26.160 に答える