상세 컨텐츠

본문 제목

7.2. 컬렉션 캡슐화하기

🍜개발자라면/책을 읽자✍

by :Eundms 2021. 10. 5. 12:20

본문

컬렉션을 소유한 클래스를 통해서만 원소를 변경.

내부 컬렉션 값을 직접 수정하지 못하도록, 컬렉션 값을 반환하지 않는다.

class Person{
    get courses(){return this._courses;}
    set courses(aList){thi._courses = aList;}
}

class Person {
    get courses(){return this._courses.slice();} //복사본 반환
    addCourse(aCourse){...}
    removeCourse(aCourse){...}
}

방법

1. 컬렉션 캡슐화

2. 컬렉션에 원소를 추가/삭제 하는 함수 추가

3. 정적 검사 

4. 컬렉션을 참조하는 부분을 모두 찾고, 컬렉션의 변경자를 호출하는 코드가 앞에서 추가한 추가/제거 함수를 호출하도록 한다.

5. 읽기전용 프락시복제본을 반환하게 한다.


  컬렉션 캡슐화하기  

컬렉션 전체를 바꿀 수 있는 setter 대신에 개별 원소를 추가하고 제거하는 메소드를 제공하자
// Person 클래스
constructor(name){
    this._name = name;
    this._courses = [];
}
get name(){ return this._name; }
get courses(){ return this._courses; }
set courses(){ this._courses = aList; }

// courses라는 세터를 이용해 수업 컬렉션을 통째로 바꿀 수 있게되어버린다. 
// 언제든지 클라이언트 쪽에서 마음대로 수정할 수 있게 된다.
aPerson.courses = basicCourseNames.map(name=>new Course(name,false))


//그래서! 여러 course를 추가해야 할 떄는 아래와 같이 for문을 사용하고
// Person 객체는 addCourse (단 하나의 course를 추가하는 setter)만 제공하게 한다.
for (const name of readBasicCOurseNames(filename)){
    aPerson.addCourse(new Course(name,false));
}

 

 

 

관련글 더보기

댓글 영역