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

时间:2012-10-08 14:57:54

标签: javascript model-view-controller design-patterns dci event-based-programming

我最近在Trygve Reenskaug看到了关于DCI的以下介绍: https://vimeo.com/43536416 这有点让我大吃一惊。嗯,在代码中看到软件的不同组件之间的交互是一个有吸引力的想法。

我试图在javascript中找到DCI的示例,但未成功。然后我开始疑惑。 DCI模式不是与规划编程模式相对立的吗?

Evented编程在javascript中很流行,我想因为它允许解耦,并且因为经典的继承概念不是js本机的。我想我理解了编程编程的好处,但我也注意到,当需要跟踪事件消息时,调试可能很难。

说两个概念都遭到反对是否正确?或者我弄错了?我错过了js中的DCI的一些示例实现吗?为了挖掘概念,我应该注意什么?

1 个答案:

答案 0 :(得分:4)

首先,事件编程或继承与DCI正交。您可以在没有继承和事件编程的情况下(或不使用)进行DCI。

JavaScript在某种程度上是DCI中最好的语言之一。大多数语言在跟踪DCI时存在一些问题。在JavaScript中,如果有终结器可以解决问题,但缺少终结器意味着你必须“处置”你的自我意义一些noilerplate代码。

我在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/

看到