javascript中的数据上下文交互(DCI)和事件编程

javascript中的数据上下文交互(DCI)和事件编程,javascript,model-view-controller,design-patterns,dci,event-based-programming,Javascript,Model View Controller,Design Patterns,Dci,Event Based Programming,我最近看到了Trygve Reenskagug关于DCI的以下演示: 这有点让我大吃一惊。嗯,在代码中看到软件不同组件之间的交互是一个很有吸引力的想法 我试图在javascript中找到DCI的示例,但没有成功。然后我开始怀疑。DCI模式不是与事件编程模式相反吗 事件编程在javascript中很流行,我想这是因为它允许解耦,而且经典的继承概念不是js固有的。我想我理解事件编程的好处,但我也注意到,当需要遵循事件消息时,调试可能非常困难 说这两个概念是对立的,对吗?还是我弄错了?有没有我错过的j

我最近看到了Trygve Reenskagug关于DCI的以下演示: 这有点让我大吃一惊。嗯,在代码中看到软件不同组件之间的交互是一个很有吸引力的想法

我试图在javascript中找到DCI的示例,但没有成功。然后我开始怀疑。DCI模式不是与事件编程模式相反吗

事件编程在javascript中很流行,我想这是因为它允许解耦,而且经典的继承概念不是js固有的。我想我理解事件编程的好处,但我也注意到,当需要遵循事件消息时,调试可能非常困难


说这两个概念是对立的,对吗?还是我弄错了?有没有我错过的js中DCI的一些示例实现?要挖掘这个概念,我应该看些什么?

首先,事件编程或继承与DCI相关。您可以在没有继承和事件编程(或没有)的情况下执行DCI

JavaScript在某种程度上是进行DCI的最佳语言之一。大多数语言在严格遵循DCI方面都存在一些问题。在JavaScript中,如果有终结器,问题是可以解决的,但是缺少终结器意味着您必须“处理”自己的代码,即一些noilerplate代码

我已经用JavaScript写了一个例子,我将把它放到网上,在那里你可以找到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();

其余的可以在

上看到,非常感谢,非常有趣。我一回到家就会学习密码。但是你能详细说明dci和evented之间的区别吗?由一个组件发送并由另一个组件侦听的事件不是组件之间的交互吗?当我看电影的时候,我脑子里想着一些事情。如今,js webapps中的所有内容都使用事件。它们用于访问其他组件上的方法,而不是直接访问,以实现解耦,并防止应用程序在一个组件损坏时完全损坏。@olivvv事件只是在对象之间发送消息的另一种方式。DCI涉及在代码中捕获哪个对象向哪个对象发送哪个消息。您还可以将事件视为启动上下文的内容。因此,事件驱动与DCI是正交的,但我想你实际上指的是异步,这是一个非常不同的东西不,我不是指异步,而是指发布/订阅通信。例如,一个组件监视键盘和鼠标的活动,并广播其他组件的事件,让它们知道用户是否处于活动状态。可以有很多组件在侦听。上下文如何考虑这一点?@Olivvv根据定义,DCI中对象之间的所有通信都是在上下文中捕获的(每个通信对象网络对应一个上下文),因此您只需要拥有通信的角色。也就是说,它目前是DCI的边界区域。所以组件应该在上下文方法中处理事件吗?