2017-12-09 1 views
0

のモジュールを必要としますこれはうまくいかず、私はちょっと理由を理解することができます。 「Person」はDepartment.jsのコンストラクターではないという。しかし、もし私が両方のクラスを同じファイルに入れたら、うまくいきます。は再帰的のは、私が他を必要とし、それぞれが2つのクラスを、持っているとしましょう、だから、ノード

So;私の質問は、どうすればこの問題を回避できますか?私は実際に両方のクラスを同じファイルに保存しない方が良いでしょうか?

私はノードの最新バージョンを実行しています。

+0

循環依存がある場合は、何か問題があります。 Personが新しいDepartmentを作成する必要があり、Departmentが新しいPersonを作成する必要がある場合、両方のクラスは責任があります(自分自身を作成するだけです)。理想的には、それぞれのクラスがインスタンスを直接インスタンス化するのではなく、PersonおよびDepartmentのインスタンスを作成して正しいインスタンスに渡す第3のファクトリクラスが必要です。あなたのコードは非常に緊密に結合されているので、別々のクラスを持つことは冗長なようです。 – Fraser

+0

@Fraser問題を元に戻さないために、工場をどのように設計すべきか理解できません。私の考えでは、「部署」にはPersonのすべてのメソッドを持つPersonを返すプロパティpersonelがあり、Personには財産部門があることも意味があります「魔女はそれに利用可能な部署のメソッドを持っている...しかし、私は同じクラスにそれらを持たせることに意味がないので、私は冗長性を見ない。 –

+0

与えられた答えを見るデカップリングクラスの概念と同様に、工場設計パターンはソフトウェア設計においてかなり一般的です。ここではfindDepartment、findPersonは関連エンティティの作成者クラスとして機能します。人と部が疎結合していることを意味する。 – Fraser

答えて

1

あなたはフェッチデータからオブジェクトを初期化し分離することができます:

// types/Department.js 
class Department { 
    constructor(id, personnel) { 
    this.id = id; 
    this.personnel = personnel; 
    } 
} 

// types/Person.js 
class Person { 
    constructor(id, department) { 
    this.id = id; 
    this.department = department; 
    } 
} 

// findDepartment.js 
const Department = require('./types/Department'); 
const Person = require('./types/Person'); 

function findDepartment(id) { 
    const personnel = getPersonnel(id).map(person => new Person(person)); 
    return new Department(id, personnel); 
} 

// findPerson.js 
const Department = require('./types/Department'); 
const Person = require('./types/Person'); 

function findPerson(id) { 
    const department = getDeptOfPerson(id); 
    return new Person(id, department); 
} 

これらも、あなたが本当にしたい場合は種類(findDepartment.jsDepartment.jsDepartment.findDepartment = function (id) { …)に戻ることができます。

関連する問題