DCI, проблемы с понятием «контекст» и какие роли внутри знают друг о друге - PullRequest
1 голос
/ 04 августа 2011

Возможно, мне здесь не хватает ключевой концепции. Я понимаю «тупые» объекты данных. Я также понимаю, что роли - это наборы методов без сохранения состояния, применяемые к тупому объекту, когда он выполняет эту роль. Я также понимаю, что контекст собирает участников, которые будут иметь место в реализуемом алгоритме. Но то, что роли знают друг о друге, и погода, которую они должны быть определены в контексте, или вне этого, мне неизвестно.

Скажем, контекст имеет 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

  1. Контекст вызывает метод Role для первого объекта, чтобы принять участие в сценарии использования.
  2. С этого момента Роли вызывают методы друг друга для реализации варианта использования.

1 Ответ

4 голосов
/ 05 августа 2011

В DCI роли обычно осведомлены о контексте, и контекст может действовать как хранилище для всех соответствующих ролей.Т.е. случай номер два, где роль может получить доступ к контексту и запросить у нее объекты, играющие другие роли, в которых она нуждается.Это детали реализации, хотя.Передача необходимых объектов в ролевые методы тоже может работать.Важным моментом является то, что роли взаимодействуют друг с другом с помощью ролевых методов (то есть не с помощью ролевых методов, поскольку это создает неудачное соединение).Роли, вообще говоря, не должны быть кандидатами на повторное использование в разных контекстах.Контекст примерно соответствует варианту использования, а роли реализуют поведение варианта использования.В общем, эта логика не может быть повторно использована во всех случаях использования.

Надеюсь, это поможет.

Также вы можете проверить статью artima, представляющую DCI, и группу google group по составу объектов.

...