2014-12-01 102 views
2

首先,我很抱歉,如果這個問題有一個微不足道的答案,但我無法找到一個。軟件設計 - 兩個類之間的相互作用

我有疑問的概念如下。 我有一個客戶端應用程序和一個交換數據的服務器應用程序。我試圖以下面的方式分離在客戶端處理服務器更新的邏輯。

處理應用程序邏輯並處理分析和清理數據的「main」類和分析接收到的數據並調用「main」類的相應方法的「worker」類。我想這是以某種方式模仿事件。這是一個使事情更清晰的示例結構。

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; 
    } 
} 

這裏最大的問題是,調用從「工人」,「主」的方法使它們指向錯誤的對象(如「客戶」,而不是「主」)。 我曾考慮過將「Main」類對象傳遞給「Client」對象而不是回調函數,但這種方式必須硬編碼將在服務器產生的每個事件上調用的所有回調方法。我願意就如何解決這個問題提出任何建議,堅持這種代碼架構對我來說不是強制性的。

回答

1

我不確定這是否完全解決您的問題,但解決您的一個問題。在JavaScript中的this將始終引用調用者對象。所以如果你想從Client函數中調用一個Main方法,並且仍然希望this在Main的方法中引用Main,那麼可以使用一個輔助函數,它將使用function.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 2014-12-03 13:35:16