Oli*_*vvv 4 javascript model-view-controller design-patterns event-based-programming dci
我最近看了Trygve Reenskaug在DCI上发表的以下演讲:https ://vimeo.com/43536416 这真让我大吃一惊 。嗯,在代码中看到软件的不同组件之间的交互是一个很有吸引力的想法。
我试图在javascript中找到DCI的示例,但未成功。然后我开始怀疑。DCI模式是否与事件编程模式相反?
我猜事件编程在javascript中是新潮,因为它允许解耦,并且因为经典继承概念不是js固有的。我想我了解事件编程的好处,但是我也注意到,当调试需要遵循事件消息时,调试可能会非常困难。
说两个概念都对吗正确吗?还是我弄错了?我错过了js中DCI的一些示例实现吗?为了理解这个概念,我应该看什么?
首先,事件编程或继承对DCI是正交的。您可以在没有继承和事件编程(或没有事件编程)的情况下进行DCI。
在某些方面,JavaScript是使用DCI的最佳语言之一。大多数语言在严格遵循DCI方面存在一些问题。在JavaScript中,如果有终结器,则可以解决问题,但是缺少终结器意味着您将不得不“处置”自己的含义,这意味着使用一些Noilerplate代码。
我已经用JavaScript编写了一个示例,并将在http://fullOO.info上发布该示例,您将在其中找到Trygve,Jim和我以及其他一些人创建的示例。
fullOO.info也是您可以去更熟悉DCI的答案,或者您可以加入对象组成Google小组来讨论有关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();
Run Code Online (Sandbox Code Playgroud)
其余的可以在http://jsfiddle.net/K543c/17/查看