我最近看到 Trygve Reenskaug 关于 DCI 的以下介绍: https://vimeo.com/43536416 这有点让我震惊。嗯,在代码中看到软件不同组件之间的交互是一个很有吸引力的想法。
我试图在 javascript 中找到 DCI 的示例,但没有成功。然后我开始怀疑。 DCI 模式不是与事件编程模式相对吗?
事件编程在 javascript 中很流行,我猜是因为它允许解耦,并且因为经典的继承概念不是 js 原生的。我想我了解事件编程的好处,但我也注意到,当需要遵循事件消息时,调试可能非常困难。
这两个概念是对立的吗?还是我弄错了?有没有我错过的 js 中 DCI 的一些示例实现?为了挖掘这个概念,我应该看什么?
最佳答案
首先,事件编程或继承与 DCI 是正交的。您可以在没有继承和使用事件编程(或不使用)的情况下进行 DCI。
JavaScript 在某些方面是执行 DCI 的最佳语言之一。大多数语言在严格遵循 DCI 方面都存在一些问题。在 JavaScript 中,如果有一个终结器,问题就可以解决,但是缺少终结器意味着你将不得不“处理”你的 self ,这意味着一些 noilerplate 代码。
我已经用 JavaScript 编写了一个示例,我将在 http://fullOO.info 上发布该示例您可以在其中找到 Trygve、Jim 和我与其他一些人一起创建的示例。
fullOO.info 也是您可以去哪里更熟悉 DCI 的答案,或者您可以加入 object-composition 谷歌群组来讨论有关 DCI 的问题。
我用 JS 编写的示例是规范的 DCI 示例汇款,有趣的部分(除了样板/库代码之外的所有内容)如下所示:
var moneyTransferContext = function(sourcePlayer, destinationPlayer, amount) {
var source = {
withdraw: function() {
var text = "Withdraw: " + amount;
this.log.push(text);
this.balance -= amount;
console.log("Balance: " + this.balance);
}
},
destination = {
deposit: function() {
var text = "Deposit: " + amount;
this.log.push(text);
this.balance += amount;
console.log("Balance: " + this.balance);
}
};
source = assign(source).to(sourcePlayer);
destination = assign(destination).to(destinationPlayer);
return {
transfer: function() {
source.withdraw();
destination.deposit();
return this;
}
};
},
sourceAccount = {
log: [],
balance: 100
},
destinationAccount = {
log: [],
balance: 0
};
moneyTransfer(sourceAccount, destinationAccount, 25).transfer().unbind();
其余的可以在http://jsfiddle.net/K543c/17/看到
关于javascript - javascript 中的数据上下文交互 (DCI) 和事件编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12784276/