컬렉션을 소유한 클래스를 통해서만 원소를 변경.
내부 컬렉션 값을 직접 수정하지 못하도록, 컬렉션 값을 반환하지 않는다.
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));
}
7.5. 클래스 추출하기 | 7.6. 클래스 인라인하기 (0) | 2021.10.05 |
---|---|
7.3. 기본형을 객체로 바꾸기 | 7.4. 임시 변수를 질의 함수로 바꾸기 (0) | 2021.10.05 |
7.1. 레코드 캡슐화하기 (0) | 2021.10.01 |
6.11. 단계 쪼개기 (Split Phase) (0) | 2021.09.26 |
6.10. 여러 함수를 변환 함수로 묶기 (0) | 2021.09.26 |