DCI 上下文的责任?

Posted

技术标签:

【中文标题】DCI 上下文的责任?【英文标题】:Responsibility of a DCI Context? 【发布时间】:2012-10-18 10:24:05 【问题描述】:

有方法的角色包含实际的算法,但是上下文执行方法除了执行其中一种方法之外应该做什么?

public class SomeContext

    // ... Constructor omitted ...

    public void Execute()
    
        // Is this all?
        someRole.DoStuff(this.anotherRole, this.otherData);
    

看起来很简单,所以我认为上下文应该负责例如数据库查找。这不会简化有条理的角色吗?

【问题讨论】:

【参考方案1】:

上下文的主要职责是将角色绑定到对象。有时一种或多种“执行”方法会很复杂,但通常并非如此。 它们用于捕捉对象之间的交互

角色与对象的绑定是原子的。它发生在上下文中的一个位置,同时适用于所有角色。

【讨论】:

那么使用文本字符串(如搜索查询)实例化 Context,让它使用 ORM 查找域对象并将它们传递给 Role 方法,是它应该承担的责任吗? 当然也可以有其他构造函数,所以可以将 RolePlayers 传递给 Context。 (Execute 方法会测试对象是否存在,所以构造函数中没有做任何工作) @ciscoheat 上下文通过 ORM 找到角色扮演者是完全合理的。但是,您不会将 RolePlayers 传递给角色方法。 RolePlayer 的角色方法类似于任何其他对象的实例方法。所以 someRolePlayer.ARoleMethod() 是你将如何调用它而不是 ARoleMethod(someRolePLayer); @horsdal 有一些很好的例子,说明您可以在 C# 中接近 DCI 但是您不能在 C# 中进行 DCI。一个主要问题是角色方法优先于实例方法,但扩展方法优先于扩展方法。您可以在 fuullOO.info/Examples/Marvin 上查看 Marvin,以了解完全支持 DCI 的非常类似于 C# 的语言。然而,对于这个问题,很少需要访问上下文而不是获得其他角色 @ciscoheat 和 RolePLayers “从不”传递给 Role 方法,您可以比较它以将字段作为参数传递给私有实例方法。你可以这样做,但它不像简单地访问方法中的字段那样常见,我想说你更不可能想要传递 RolePlayer

以上是关于DCI 上下文的责任?的主要内容,如果未能解决你的问题,请参考以下文章

javascript 中的数据上下文交互 (DCI) 和事件编程

DCI 上下文中的错误处理?

Rails 中的 RESTful DCI 上下文

DCI,“上下文”概念的问题以及相互了解的角色

什么是 DCI 上下文中的“纯面向对象语言”?

Web 应用程序中的 DCI 上下文