软件设计 - 两个类之间的交互

Software Design - Interaction between two classes

提问人:luleksde 提问时间:12/2/2014 最后编辑:luleksde 更新时间:12/2/2014 访问量:102

问:

首先,如果这个问题有一个微不足道的答案,我很抱歉,但我找不到。

我所讨论的概念如下。 我有一个交换数据的客户端应用和一个服务器应用。我正在尝试以下列方式分离在客户端中处理服务器更新的逻辑。

一个“main”类,用于处理应用程序逻辑并处理已分析和清理的数据,以及一个“worker”类,用于分析接收到的数据并调用“main”类的相应方法。我想这在某种程度上是在模仿事件。下面是一个示例结构,可以使事情更加清晰。

var Main = function(){
    this.init();
};

Main.prototype = {

    init: function(){
        //Do init logic

    },

    connect: function(){
        var client = new Client();
        client.onStateUpdate(this.executeStateUpdate);
        client.connect('localhost', 3001);
    },

    executeStateUpdate: function(data){
        // Problem - the "this" operator is now Client and not Main
    }

};


var Client = function(){
};

Client.prototype = {
    connect: function(host, port){
        this.client = new WebSocket("ws://"+host+":"+port);

        this.client.onmessage = function(e){
            var data = JSON.parse(e);
            //handle received data
            stateUpdate(data);
        };
    },

    stateUpdate: function(data){
        //sanitize data to application objects
        this.stateUpdateCallback(sanitizedData);
    },

    onStateUpdate: function(callback){
        this.stateUpdateCallback = callback;
    }
}

这里最大的问题是,从“worker”调用“main”方法会使它们指向错误的对象(例如“Client”而不是“Main”)。 我曾考虑过将“Main”类对象传递给“Client”对象而不是回调,但这样我就必须对服务器产生的每个事件调用的所有回调方法进行硬编码。我对如何解决这个问题的任何建议都持开放态度,坚持这种代码架构对我来说不是强制性的。

JavaScript 设计模式 -服务器客户端

评论


答:

1赞 Enrique Carro 12/2/2014 #1

我不确定这是否完全解决了您的问题,但解决了您的一个问题。 在 JavaScript 中,将始终引用调用方对象。因此,如果要从 Client 函数调用 Main 方法,并且仍然希望该方法在 Main 的方法中引用 Main,则可以使用辅助函数调用该方法的任何函数。thisthisfunction.apply()

而不是:

    connect: function(){
        var client = new Client();
        client.onStateUpdate(this.executeStateUpdate);
        client.connect('localhost', 3001);
    },

用:

    connect: function(){
        var client = new Client();
        client.onStateUpdate(caller(this.executeStateUpdate));
        client.connect('localhost', 3001);
    },
    caller: function (fn) {
        var mainObj = this;
        return (function () {
            return fn.apply(mainObj);
        });
    }

评论

0赞 luleksde 12/3/2014
谢谢你的回答!事实上,这确实解决了我处理这种事情的方式的问题,但我的另一个担忧是这是否真的是用于给定问题的良好架构。