2017-01-21 29 views
0

我正在寻找Node.js中的干净设计模式,以允许我在分别引用另一个模块时将两个类放在单独的模块中。相互依赖对象的模块模式

例如:我有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对象的设计。这些是作为玩具的例子。通常,在这样的例子中,这两类不可能彼此不可知。我正在寻找一种方法来设置Node.js模块,当面对这样的安排。我可以通过将两个类放在同一个模块中来解决问题,但它们足够庞大而且足够复杂,以致它们保证自己的文件。 Thankyou

+0

考虑打字稿。 :) – Proximo

+1

你为什么要传递一个集合构造函数到你的模型构造函数?只需在每个文件中“需要”模型和收集定义即可。 –

+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具有专门的属性和方法,它们在标准Array – AdamW

+0

中不可用,然后将它们放入'Node'类中。每个节点和子节点都是同一个构造函数的一个实例,所以你也可以给出一个'node'方法。 –

+0

这些都是大班。将它们合并会使事情变得非常笨拙,这正是将它们分解成单独模块的目的 – AdamW