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