2017-12-09 1 views
0
는 그래서, 나는 두 개의 클래스, 그 각각이 있다고 가정 해 보자는 서로를 필요로

:재귀 적으로 필요로하는 모듈

Department.js : 이제

const Person = require("./Person"); 
class Department{ 
    constructor(id){ 
    this.personel = getPersonel(id).map(person => new Person(person)); 
    } 
} 

Person.js

const Department = require("./Department"); 
class Person { 
    constructor(id){ 
    this.department = new Department(getDeptOfPerson(id)); 
    } 
} 
const person = new Person(1); 
const coworkers = person.department.personel; 

, 이것은 작동하지 않으며, 나는 왜 이해할 수 있습니다. "Person"은 Department.js의 생성자가 아닙니다. 그러나 두 파일을 같은 파일에 넣으면 잘 작동합니다.

그래서; 내 질문은이 문제를 어떻게 해결할 수 있을까요? 나는이 두 클래스를 같은 파일에 보관하지 않을 것입니다. 더 좋은 방법이 있습니까?

저는 최신 버전의 노드를 실행하고 있습니다.

+0

순환 종속성이있는 경우 잘못된 결과가 발생합니다. Person이 새로운 Department를 생성해야하고 Department가 새로운 Person을 생성해야하는 경우 두 클래스 모두 책임이 너무 많습니다 (자신을 생성해야 함). 각각의 클래스가 인스턴스를 직접 인스턴스화하는 대신 Person 및 Department의 인스턴스를 만들고 인스턴스를 올바른 인스턴스로 전달하는 세 번째 팩토리 클래스가 이상적입니다. 마찬가지로 귀하의 코드가 너무 단단히 결합되어 별도의 클래스가 중복되는 것처럼 보입니다. – Fraser

+0

@Fraser 문제를 다시 푸시하지 않기 위해 공장을 어떻게 디자인해야하는지 이해할 수 없습니다. 내 마음 속에서'Department'는 Person의 모든 메소드를 가진'Person'을 반환 할 속성'Personel'을 가질 것이고, Person이 재산을 가질 것이라는 것도 이해할 것입니다. 'Department "마녀는 부서에서 사용할 수있는 방법을 가지고 있습니다 ... 그러나 같은 클래스에 둘 다 가지고있는 것은 나에게 어떤 의미가 없으므로 중복성이 보이지 않습니다 ... –

+0

주어진 답을보기 a 팩토리 패턴은 소프트웨어 설계에서 상당히 일반적이며, 디커플링 클래스의 개념이기도합니다. 여기 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.js, Department.findDepartment = function (id) { …)에 다시 갈 수 있습니다.

관련 문제