2013-10-23 49 views
0

[編輯]將標題從「JS:用於收集或單個項目的異性二傳手/吸氣器?JS:動態對象交叉引用池

關於編寫混合getter/setter的能力的一些問題...對於我的國際象棋應用程序,我有一個比樹更類似於圖的對象圖。所以我決定把數據結構中的各種對象集中在一起,這些數據結構既包含對象物體又包含對象之間的關係。

喜歡的東西:

// in js/app/base/pools.js 
var Pool = function() { 
    this.items = {}; 
    this.relations = {}; 
}; 

/** 
* store an object into the pool 
* and augment it with relation/pooling capabilities 
* @param string key 
* @param Object obj 
*/ 
Pool.prototype.store = function(key, obj) { 

    var self = this; 

    Object.defineProperty(obj.constructor.prototype, "pool", { 
     set : undefined, 
     get : function() { 
      return self; 
     } 
    }); 

    this.items[key] = obj; 
}; 

/** 
    * looks for an object in the pool 
    * @param string 
    */ 
Pool.prototype.find = function(key) { 
    return this.items[key]; 
}; 

關係被存儲爲成對[OBJ1,OBJ2]在池實例的 「關係」 屬性 。我基本上有兩種關係:

  • 一到一個:一元corespondances像棋子< --->位置,或接口實現像棋子< --->典當| ... |王

  • 一個一對多像板[X1] < ---> [64]瓷磚

    這些關係的目的(由池的方式)是雙向的,並且必須設置原子(例如交易),因爲對象交叉引用需要是「ACID」,對於上面的例子,1板包含64塊瓷磚,並且每塊瓷磚知道它的站立板。

對於1:1的關係,也許沒有問題,因爲我可以設置:

chessman.location = location; 
// AND AT THE SAME TIME : 
location.chessman = chessman; 

// with two Object.defineProperty(...) combined 

麻煩配備了1-N關係,因爲我能寫:

// 1st : defining relation 
// ... (see below) 

// 2nd setting a relation 
board1.tiles.add(tile_63); 
// and 
tile_63.board = board1; 

// 3rd getting values 
board1.tiles --> a collection of tiles (array) 
tile_63.board --> board1 object 

在關係由傳遞參數對象給予池實例的主程序:

pool.defineRelation("board-contains-tiles", { 
    tiles : { subject : boards.Board, multiple : true }, 
    board : { subject : tiles.Tile, multiple : false } 
}); 

來定義關係,1面是一個普通的getter/setter,但是N面更像是一個吸氣劑加法器,因爲我們必須填充(板上有瓷磚)...所以這是行不通的:

Pool.prototype.defineRelation = function(alias, definition) { 
    this.relations[alias] = []; 

    var self = this, linker; 
    var relation = self.relations[alias]; 
    var subject, multiple; 

    // iterate through relation short names 
    for(name in definition) { 

     subject = definition[name].subject; 
     multiple = definition[name].multiple; 

     console.log("loop with name : " + name + " subject is : " + subject); 

     var getter = function() { 
       var result = []; 
       for(r = 0; r < relation.length; r++) { 

        // [x,y] storing 
        if(relation[r][0] == this) 
         result.push(relation[r][1]); 

        // [y,x] storing 
        if(relation[r][1] == this) 
         result.push(relation[r][0]); 

        return result; 

       }; 

     var setter; 

     if(multiple) { 
      setter = function() {}; 
      setter.add = function(x) { relation.push([this, x]); }; 
     } else { 
      setter = function(x) { relation.push([this, x]); }; 
     } 

     Object.defineProperty(subject.prototype, name, { 
      set : setter, 
      get : getter 
     }); 

    } 
}; 

問題: 我認爲有可能這樣做,但怎麼做?或者更好的方式,像Delphi的TComponent,或者像DOM樹一樣?

也可參見: 老,醜陋和雜亂的代碼庫可以在我的網站上找到:

www.eozine.fr --> Jet d'echecs --> ColorChess 

,如果你婉噸至看到以前的結果(2009)

問候。

+0

一種可能的方法來解決:養殖對象(類對象)http://gameprogrammingpatterns.com/type-object.html –

+0

它SA欺騙......我希望這是一個可解決的問題... –

回答

0

第一個試驗可以在名爲「colorchess」的谷歌代碼項目下的「pooler」。部分找到,這是該動態對象關係池管理器的實際名稱。

使用RequireJS和Zepto的示例可以在我的網站www.eozine.fr/colorchess/javascript(示例#3)中找到,但這不是一個假名!事情必須得到改善。

也許在未來的JSfiddle。

聖誕2013 &新年快樂2014