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

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的一些示例实现吗?为了理解这个概念,我应该看什么?

Run*_* FS 5

首先,事件编程或继承对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/查看