Возможно, мне здесь не хватает ключевой концепции. Я понимаю «тупые» объекты данных. Я также понимаю, что роли - это наборы методов без сохранения состояния, применяемые к тупому объекту, когда он выполняет эту роль. Я также понимаю, что контекст собирает участников, которые будут иметь место в реализуемом алгоритме. Но то, что роли знают друг о друге, и погода, которую они должны быть определены в контексте, или вне этого, мне неизвестно.
Скажем, контекст имеет 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(?)
}
Теперь для 3 различных комбинаций как concat () (метод) и start.concat (?) (Вызов) может потребоваться:
Роли знают о других ролях в том же контексте (заставляя роли не использоваться повторно в других контекстах, что мне кажется неправильным.)
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 «ролей» в один вызов метода в качестве аргументов, а затем объединить их в цепочку!)
(Примечание. В этом случае определения ролей могут быть перемещены за пределы контекста и использованы повторно в нескольких контекстах)
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
- Контекст вызывает метод Role для первого объекта, чтобы принять участие в сценарии использования.
- С этого момента Роли вызывают методы друг друга для реализации варианта использования.