DCI,“背景”概念的问题以及彼此了解的角色

时间:2011-08-04 05:13:56

标签: interaction dci

我可能只是错过了一个关键概念。我理解'哑'数据对象。我也理解角色是在承担该角色时应用于哑对象的无状态方法集合。我也理解上下文汇集将在正在实现的算法中发生的actor。但是角色对彼此的了解,以及必须在上下文中或在我之外定义的天气是我所不知道的。

假设一个上下文有两个角色,即开始和结束。我们的用例是字符串连接,因此我们将为每个角色分配一个字符串。

一些psudocode:

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. Context调用第一个对象上的Role方法来参与用例。
  2.   
  3. 从那时起,Roles会调用彼此的方法来执行用例。
  4.   

1 个答案:

答案 0 :(得分:4)

在DCI中,角色通常知道上下文,上下文可以作为所有相关角色的存储库。即第二种情况,角色可以访问上下文,并询问对象是否正在播放所需的其他角​​色。 这是实现细节。将所需对象传递给角色方法也可以。重要的是角色通过角色方法相互作用(即,不通过角色扮演方法,因为这会产生不幸的耦合)。 一般而言,角色不会成为跨背景重用的候选者。上下文大致对应于用例,角色实现用例的行为。通常,逻辑在用例中不可重用。

希望这有帮助。

另外,您可能需要查看引入DCI的artima文章和对象组合Google群组。

相关问题