2017-01-21 4 views
0

Node.jsのクリーンなデザインパターンを探して、それぞれが別のモジュールを参照するときに2つのクラスを別々のモジュールに入れることができます。相互依存オブジェクトのモジュールパターン

例:NodeNodeCollectionのオブジェクトがあります。明らかにNodeCollectionは、Nodeが何であるかを知っていなければなりませんが、Nodes自体は子供のためにNodeCollectionオブジェクトを保持しています。

現在、Nodeコンストラクタは必要なときに設定しています。

nodeCollection.js

const Node=require('./node')(NodeCollection) 

function NodeCollection(....){ 
    // do stuff with Node objects 
} 

module.exports = NodeCollection' 

のNode.js

function Node(NodeCollection){ 
    function _Node(...){ 
    this.children = new NodeCollection(); 
    //do stuff 
    } 

    return _Node; 
} 

module.exports = Node; 

これを設計するための良い方法はありますか?

補足:いくつかの誤解があるようです。私は、NodeCollectionまたはNodeオブジェクトのより良い設計を求めていません。これらはおもちゃの例として提供されました。しばしば、このような例では、2つのクラスはお互いに無関心ではありません。私は、そのような配置に直面したときにNode.jsモジュールを設定する方法を探しています。私は両方のクラスを同じモジュールに入れて問題を解決することができましたが、それらは自分たちのファイルを保証するのに十分な大きさと複雑さを持っています。 ありがとうございました

+0

タイプスクリプトを検討してください。 :) – Proximo

+1

なぜあなたはモデルコンストラクタにコレクションコンストラクタを渡していますか?それぞれのファイルにモデルとコレクションの定義だけを 'require 'します。 –

+0

私が説明したように、NodeオブジェクトはNodeCollectionを使用して子を保持する必要があるため、 – AdamW

答えて

1

あなたの場合は、NodeNodesの間を区別する必要があります。このような基本的なことは、あなたに木構造を与えるでしょう。

class Node { 
    constructor(data) { 
    this.data = _.omit(data, 'children'); 
    this.children = (data.children || []).map(child => new Node(child)); 
    } 
} 

const tree = new Node({ 
    name: 'bob', 
    children: [ 
    { name: 'bill' }, 
    { name: 'jim' }, 
    { name: 'luke' } 
    ] 
}); 

// yields... 

{ 
    data: {name: 'bob'}, 
    children: [ 
    { 
     data: {name: 'bill'} 
    } 
    ...etc 
    ] 
} 
+0

あなたの例のような単純な配列のNodeCollectionオブジェクトが必要ですが、私の設計では十分ではありません。 NodeCollectionは標準の配列で利用できない特殊なプロパティとメソッドを持っています – AdamW

+0

それらを 'Node'クラスに入れます。すべてのノードと子ノードは同じコンストラクタのインスタンスなので、 'node'メソッドも与えることができます。 –

+0

これらはどちらも大きなクラスです。それらを組み合わせると、物を非常に扱いにくくすることになります。これはまさにそれらを別々のモジュールに分割する目的です – AdamW

関連する問題