DCI, проблемы с понятием "контекст" и какие роли внутри знают друг о друге
Я могу просто упустить ключевую концепцию здесь. Я понимаю "тупые" объекты данных. Я также понимаю, что роли - это наборы методов без сохранения состояния, применяемые к тупому объекту, когда он выполняет эту роль. Я также понимаю, что контекст собирает участников, которые будут иметь место в реализуемом алгоритме. Но то, что роли знают друг о друге, и погода, которую они должны быть определены в контексте, или вне этого, мне неизвестно.
Скажем, у контекста две роли: начало и конец. Наш вариант использования - конкатенация строк, поэтому мы будем назначать строку каждой роли.
некоторый псевдокод:
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
- Контекст вызывает метод Role для первого объекта, чтобы принять участие в сценарии использования.
- С этого момента Роли вызывают методы друг друга для реализации варианта использования.
1 ответ
В DCI роли обычно осведомлены о контексте, и контекст может действовать как хранилище для всех соответствующих ролей. Т.е. случай номер два, где роль может получить доступ к контексту и запросить у нее объекты, играющие другие роли, в которых она нуждается. Это детали реализации, хотя. Передача необходимых объектов в ролевые методы тоже может работать. Важная часть заключается в том, что роли взаимодействуют друг с другом с помощью ролевых методов (то есть не с помощью ролевых методов, поскольку это создает неудачное соединение). Роли, вообще говоря, не должны быть кандидатами на повторное использование в разных контекстах. Контекст примерно соответствует варианту использования, а роли реализуют поведение варианта использования. В общем, эта логика не может быть повторно использована во всех случаях использования.
Надеюсь это поможет.
Также вы можете ознакомиться со статьей artima, представляющей DCI, и google group по составлению объектов.