我最近看到了Trygve Reenskaug关于DCI的以下演示:https://vimeo.com/43536416这有点让我大吃一惊。嗯,在代码中看到软件不同组件之间的交互是一个很有吸引力的想法。
我试图在javascript中找到DCI的例子,但没有成功。然后我开始怀疑。DCI模式不是与事件编程模式相反吗?
事件编程在javascript中很流行,我想是因为它允许解耦,而且经典的继承概念不是js的固有概念。我想我理解事件编程的好处,但我也注意到,当需要遵循事件消息时,调试可能会非常困难。
说这两个概念是对立的是正确的吗?还是我弄错了?js中有没有遗漏一些DCI的示例实现?为了挖掘这个概念,我应该看什么?
首先,事件编程或继承与DCI正交。您可以在没有继承和事件编程(或没有)的情况下进行DCI。
JavaScript在某种程度上是进行DCI的最佳语言之一。大多数语言在以下DCI方面都存在一些问题。在JavaScript中,如果有终结器,问题是可以解决的,但缺少终结器意味着你将不得不"处理"你自己的一些恶意代码。
我用JavaScript写了一个例子,我将把它放到网上http://fullOO.info在那里你会发现Trygve、Jim和我以及其他一些人一起创建的例子。
fullOO.info也是一个答案,你可以去哪里更熟悉DCI,或者你可以加入对象组合谷歌小组讨论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/