问题标签 [dci]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
oop - DCI 架构有哪些可能的设计?
用不同的 OOP 语言实现 DCI(数据、上下文、交互)架构的可能设计是什么?我想到了 C++ 的基于策略的设计 (Andrei Alexandrescu),Java 的 DI 和 AOP。但是,我也考虑过使用状态设计模式来表示角色和某种模板方法来进行交互......还有哪些其他可能性?
persistence - DCI(数据、上下文、交互)持久化示例
我见过的所有 DCI 的例子似乎都是基于对象作为信息的最终持有者,并且在方法内部定义了事务边界。
我想看一个持久性应用程序的示例,其中有某种持久性层,即可以有底层持久性存储的重复对象副本,并且对对象的更改是对稍后将要更改的副本的更改被坚持。DCI 是否适用于该模型?
architecture - DCI 架构的例子?
我一直试图通过阅读精益软件架构来理解DCI架构。我觉得我需要看更多的例子来巩固我对它的理解,但我只能找到书中提到的账户间转账案例的变体。
如果网上有,请告诉我。或者,如果您自己创建了一个不在网络上的好示例,您可以在此处发布。
任何语言都可以。
reflection - 在 F# 中输入通用鸭子?
使用 let 内联和成员约束,我将能够为已知成员进行鸭式输入,但如果我想定义一个像这样的通用函数怎么办:
让鸭包装器<'a>鸭= ...
带有签名 'b -> 'a 并且返回的值将是一个实现 'a 的对象(这将是一个接口)并将调用转发给鸭子。
我已经在 C# 中使用 Reflection.Emit 完成了这项工作,但我想知道 F# 反射、引用或其他构造是否会使其更容易。
关于如何做到这一点的任何建议?
阅读蒂姆斯回答后编辑 我想我会提供更多细节
当我写关于使用引用来帮助时,我的想法是这样的:
!!是将引用转换为函数的运算符,%expr 是该方法的工作单元。我可以将表达式转换为函数(我猜)但不知道如何
当然,这也不能完全做到这一点,因为 IInterface 将是 'a,我希望 F# 反射可能有一些方便的功能,以便我可以基于类型对象和一些函数值构造一个类型
编辑 作为 Tomas Petricek 答案的更新,我将提供一些代码来解释我的需求
这是在 F#中移植“ DCI ”教科书示例的尝试。源和目标是 DCI 角色。这个想法是任何遵守特定合同的数据对象都可以播放这些。在这种情况下,合同很简单。source 需要一个名为 reduceBalance 的成员函数,destination 需要一个名为 increaseBalance 的成员函数。对于这种特定情况,我可以使用 let inline 和 member 约束来实现这一点。但是我想写一组给定接口和对象的函数。在这种情况下,它可能是源(作为对象)和
作为类型。结果将是一个 sourceContract 类型的对象,它将方法调用通过管道传递给源对象上具有相同名称的方法。
use-case - DCI 和用例切片
在他的“用例面向方面的软件开发”一书中, Ivar Jacobson 介绍了“用例切片”。似乎 DCI 和用例切片基于相同(或至少相似)的想法。
DCI 和用例切片之间有什么区别?
interaction - DCI,“上下文”概念的问题以及相互了解的角色
我可能只是在这里遗漏了一个关键概念。我了解“愚蠢”的数据对象。我也明白,角色是当一个哑对象担任该角色时应用到该对象的方法的无状态集合。我也明白,上下文集合了将在正在实现的算法中发生的参与者。但是角色对彼此的了解以及天气必须在上下文中定义,或者在上下文之外对我来说是未知的。
假设一个上下文有 2 个角色,开始和结束。我们的用例是字符串连接,因此我们将为每个角色分配一个字符串。
一些伪代码:
现在对于 concat() (方法)和 start.concat(?) (调用)可能需要的 3 种不同组合:
角色知道同一上下文中的其他角色(强制角色在其他上下文中不可重用,这对我来说似乎是错误的。)
角色不知道上下文中的其他角色,因此需要将它们作为参数传递(这似乎很痛苦,因为上下文可以有任意数量的角色,如果上下文从启动一个方法开始,我们可能需要传递 30 “角色”作为参数进入一个方法调用,然后将它们一直链接起来!)(注意:在这一个中,角色定义可以移出上下文,并在多个上下文中重新使用)
对我来说,最明显的选择似乎是不强制上下文启动一个方法,仅此而已。然后将交互逻辑放入上下文中,将非交互部分放入角色中。(注意:在这一个中,角色定义可能会移到上下文之外,并在几个上下文中重新使用)
这似乎与此相矛盾: http ://en.wikipedia.org/wiki/Data,_Context_and_Interaction#Execution_Model
- Context 在第一个对象上调用 Role 方法以参与用例。
- 从那时起,角色调用彼此的方法来执行用例。
domain-driven-design - 如何结合DDD(Domain-driven design) DCI来设计一个应用
DDD是领域驱动设计,它是一种方法论,包括无处不在的语言、根实体、值对象和聚合。
DCI:数据、上下文、交互是 Trygve Reenskaug 发明的一种编程范式。
如何在新系统中与它们结合?
ruby - 使用多个模块扩展的对象中方法的 Ruby 优先级
鉴于以下情况:
有没有办法设置优先级User#default_context
?也就是说,我可以说无论扩展的顺序如何,Admin#default_context
总是优先吗?RegisteredUser#default_context
current_user
ruby-on-rails - 如何使用 DCI 模式测试行为?
我正在编写一个简单的网页游戏来试验 DCI 模式,我想知道如何正确测试上下文。
https://gist.github.com/1718889
我有一个上下文CharacterAttacksAnotherCharacter
,它接受两个字符并用两个角色(Attacker
和Target
)扩展它们。然后执行上下文。
但是,我怎样才能测试这个执行而不是实现的行为呢?
谢谢!