あなたはフェッチデータからオブジェクトを初期化し分離することができます:
// 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.js
→Department.js
、Department.findDepartment = function (id) { …
)に戻ることができます。
循環依存がある場合は、何か問題があります。 Personが新しいDepartmentを作成する必要があり、Departmentが新しいPersonを作成する必要がある場合、両方のクラスは責任があります(自分自身を作成するだけです)。理想的には、それぞれのクラスがインスタンスを直接インスタンス化するのではなく、PersonおよびDepartmentのインスタンスを作成して正しいインスタンスに渡す第3のファクトリクラスが必要です。あなたのコードは非常に緊密に結合されているので、別々のクラスを持つことは冗長なようです。 – Fraser
@Fraser問題を元に戻さないために、工場をどのように設計すべきか理解できません。私の考えでは、「部署」にはPersonのすべてのメソッドを持つPersonを返すプロパティpersonelがあり、Personには財産部門があることも意味があります「魔女はそれに利用可能な部署のメソッドを持っている...しかし、私は同じクラスにそれらを持たせることに意味がないので、私は冗長性を見ない。 –
与えられた答えを見るデカップリングクラスの概念と同様に、工場設計パターンはソフトウェア設計においてかなり一般的です。ここではfindDepartment、findPersonは関連エンティティの作成者クラスとして機能します。人と部が疎結合していることを意味する。 – Fraser