什么是 DCI,它如何适应 Rails?

Posted

技术标签:

【中文标题】什么是 DCI,它如何适应 Rails?【英文标题】:What is DCI and how can it fit with Rails? 【发布时间】:2012-03-29 11:49:39 【问题描述】:

最近与一位同事就在 Rails 应用程序中设计和编码模型的不同方法进行了辩论,这让我想到了DCI in the context of Rails。

但是,我似乎无法完全理解整个概念,即使在查看了this example application 之后也是如此。

目前,在编写 Rails 应用程序时,我倾向于或多或少地使用“by the book”。

所以我想问几件事--

什么是 DCI,与 MVC 一起实施时,与普通的旧 MVC(以及 Rails 中的普通 ActiveRecord)相比,它有什么优势? 如何在 Rails 中实现它(或者换句话说,所有模块的作用)?

编辑

我想在 RoR 的上下文中进一步扩展我的问题 - 是否推荐 Rails 中的模型和控制器之间的另一个抽象级别?它在不同规模的应用中的普及程度如何?

【问题讨论】:

您的问题非常广泛,很难回答。在很多地方,您似乎还没有完全了解 DCI 导致在 DCI 环境中回答某些问题变得更加困难。如果这是目标,我可以帮助你处理 DCI 的问题,但你需要缩小范围 我最想了解 DCI。至于 Rails 的实现,一个简单的例子,甚至两行解释都很好。 好问题。直到读到这篇文章,我才知道我最近一直渴望的范式有一个名字。我一直在查看我维护的代码(我没有编写)并思考“这需要的是数据和行为之间的分类分离。”我想这正是 DCI 想要做的。 不是专门针对 DCI,而是通过谷歌搜索“Rails 服务对象”将体验如何应用类似 DCI 的概念。并自我推销:sitepoint.com/using-wisper-to-decompose-applications 如果您仍在寻找与 RUby 相关的 DCI 示例,请查看受几个 DCI 问题启发的演示文稿(这是其中之一)youtube.com/watch?v=ZUADinlqHwk 【参考方案1】:

DCI 是一种范式,因此不仅仅是一种设计应用程序的方式。这是一种思考建模和结构化代码的方式。 DCI 的重要部分之一是将系统是什么(域模型)和系统做什么(功能)分开。 DCI 不是解决与 MVC 相同问题的不同方法,因此无法真正回答您的第一个问题。您可以同时使用 MVC 和 DCI,这并非巧合,因为 Trygve Renskaug 是 MVC 和 DCI 之父。他最近在 google 群组 'object-composition' 上回复了 similar question。

您链接到的示例违反了一些基本思想,例如将角色对上下文保持私有,我实际上也找不到单个上下文,但这可能是因为只花了很短的时间浏览代码。

我自己不了解 RoR,所以我不能给你一个 RoR 的例子,但是如果你去 fullOO 你会发现用不同的语言编写的例子,包括 Ruby 和 Marvin,这是为 DCI 设计的第一种语言。

编辑 对于“什么是 DCI”这个问题没有简单的答案 DCI 是一种范式,就像 OOP 是一种范式一样。它们都有相同的根源,回答上述问题就像回答“什么是面向对象编程”一样复杂。由于 DCI 是面向对象的,而所有主要 OO 语言中的 OOP 实际上是面向类而不是面向对象的,事情变得更加复杂。 DCI 旨在生成运行时对象 之间的交互在编译时在代码中可见的代码,并且更一般地说,试图通过阅读代码更容易地推断运行时行为。我在上面链接到的site 专门用于解释 DCI 的全部内容,并列出了多种语言的示例。 Ruby 就是其中之一

编辑 ruby​​ 上有一个book,DCI 即将发布。作者在对象组合和洞察力方面非常活跃

【讨论】:

我必须说fullOO上的Ruby示例看起来有点奇怪,例如线程变量的使用。有没有更接近惯用 Ruby 的 DCI 示例,或者这不可能? @MatijsvanZuijlen 具体是哪个例子。其中一些是使用 gem 编写的,有些是用纯 Ruby 编写的。 gem 修复了一些问题,因为 Ruby 不支持 DCI 的范围规则,但是使用该 gem 的调试体验有些欠缺。然后,纯 Ruby 示例违反了 DCI 的范围规则,因此两者都是 RUby 中 DCI 的近似值,但它们中的任何一个都不是真正的 DCI(因为这在 Ruby 中是不可能的,尽管你可以非常接近) 我只找到了一个例子:fulloo.info/Examples/RubyExamples/Dijkstra/DijkstraListing.html 我确信至少有栗色的 dijkstra 示例。对此感到抱歉。你可以在这里找到一些栗色的例子github.com/runefs/maroon/tree/master/test/examples。从提交日志中可以看出,我很长时间没有在栗色上做太多事情,但至少代码仍然应该提供这个想法。一个更复杂的例子是栗色本身。它是完全自举的,即我用栗色写了栗色 感谢@rune-fs,这些例子更有意义!【参考方案2】:

对于那些想知道 DCI 代表什么的人..

DCI 代表Data Context Interaction

【讨论】:

【参考方案3】:

DCI 的核心是它为开发人员提供的认知工具。我不确定您是否看过所有精彩的 James Coplien/Trygve Reenskaug 讲座,但我会尝试为任何刚接触这些概念的人提炼它的要点。它是关于将系统行为从系统的交互域对象(数据实体或系统是什么)中移出,并作为一等公民进入行为对象(系统做什么),通过向对象注入功能来调解对象之间的协作在即时用例的上下文中。

想想 BDD。我们对行为进行编码不是跨越许多对象,例如分布在我们与持久层高度耦合的数据对象中的功能微粒,而是在仅为用例(故事)而存在的内聚对象中,并将功能注入和协调这些哑数据对象的交互。就像物理架构的纯粹层一样,缓慢变化的数据对象不会加载它们一直携带的快速变化的功能实现。相反,Ruby 为我们提供了在运行时轻松地将行为注入对象的能力,当/如果仅在用例的上下文中需要时。

作为 ROR 中的示例,如果您在一个用例中涉及控制器操作,其中有一个事件概率矩阵,其中大多数条目可能仅在一小部分请求中触发,然后实例化一个臃肿行为网络 -不需要知道为每个可能的数据用例执行每个事件的重对象。此外,不必在我的文本编辑器中挖掘 18 个文件来了解交互是如何工作的,而不是将所有逻辑清晰地抽象为上下文对象提供的接口中的模式,这也是一个明确的优势。

关于您关于 Rails 中控制器和模型之间的“另一个”抽象层的问题,我不确定您指的是哪一个。无论如何,是的。无论如何。没问题。 Design patterns 和 Uncle Bobs 的 SOLID 原则几乎是 OO 设计中普遍接受的最佳实践。这两者都强烈鼓励策略和实现之间松散耦合的抽象。它们都有助于避免罗马帝国毁灭性的灾难性脑残,因为它们提供了一个每个人都理解的通用框架。对我来说,DCI 提供了相同类型的认知框架,但用于使系统更易于理解和有效处理,这是任何面向对象设计人员的圣杯。

【讨论】:

【参考方案4】:

有一本书(目前正在编写中)介绍在 Ruby/Rails 中使用 DCI:Clean Ruby。我强烈建议您将自己放在通知列表中 - 我已经阅读了这本书的部分内容,它看起来真的很好。

DCI 正在 Rails 世界中获得认可 - 在过去 3 个月左右的时间里,有许多有趣的博客文章介绍了它。

【讨论】:

以上是关于什么是 DCI,它如何适应 Rails?的主要内容,如果未能解决你的问题,请参考以下文章

如何理解 DCI 模式

Ruby 示例中的 DCI 中的 Thread.current 是啥?

如何在 Rails 4 中使用关注点

[深入研究4G/5G/6G专题-48]: 5G Link Adaption链路自适应-4-下行链路自适应DLLA-PDCCH信道

如何使用 DCI 模式测试行为?

DCI架构是如何解决DDD战术建模缺点的?