ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리팩터링 Chapter 7 - 캡슐화
    카테고리 없음 2021. 10. 3. 20:53
    반응형

    이번 포스팅은 캡슐화에 관한 내용입니다.

    반복적인 내용이 많이 있어서 조금 생략했습니다.

     

    7.1  레코드 캡슐화하기

    organization = {name:"애크미 구스베리", country: "GB"}
    @Getter @Setter
    class Organization {
    	constructor(data) {
    		this._name = data.name;
    		this._country = data.country;
    	}
    }

    위의 방식은 레코드를 클래스로 만들어서 관리하는 것입니다.

    레코드 방식은 필드이름을 노출하는 형식, Map과 Hash같은 자료구조를 일컫는 말입니다.

    Map과 Hash같은 경우는 변수명은 지정 할 수 있지만 필드명은 지정이 불가능합니다.

    그래서 클래스로 관리하게되면 get,set을 이용하여 캡슐화가 가능해집니다.

    그래서 나중에 개발자들 사이에서 알아보기 쉬워 유지보수가 편해진다는 장점이 있습니다.

     

    7.2  컬렉션 캡슐화하기

    class Person {
    	get courses() {return this._courses;}
    	set courses(aList) {this._courses = aList;}
    }
    class Person {
    	get courses() {return this._courses.slice();}
    	addCourse(aCourse) {...}
    	removeCourse(aCourse) {...}
    }

    이 방법은 확실하게 어떤 것이 무엇을 하는지 알 수 있습니다.

    그리고 이 컬렉션을 사용할 경우 주의사항은 get은 사용가능하게 하되 다른 부분을 건드는 것은

    무조건 복제본을 만들어서 사용해야합니다.

     

    7.3  기본형을 객체로 바꾸기

    orders.filter(o => "high" === o.priority || "rush" === o.priority);
    orders.filter(o => o.priority.higherThan(new Priority("normal")));

    원래 예전에는 정해진 변수형들을 주로 사용했습니다.

    그러나 많은 포맷의 변수들이 나오면서 데이터를 전용 클래스로 표현하는게 더 좋습니다.

     

    7.4  임시 변수를 질의 함수로 바꾸기

    const basePrice = this._quantity * this._itemPrice;
    if (basePrice > 1000)
    	return basePrice * 0.95;
    else
    	return basePrice * 0.98;
    get basePrice() {this._quantity * this._itemPrice;}
    ...
    if (this.basePrice > 1000)
    	return this.basePrice * 0.95;
    else
    	return this.basePrice * 0.98;

    임시 변수를 질의 함수로 바꾸면서 값의 의미를 대신해 설명할 수 있다는 점이 유용합니다.

    클래스 내에서 사용하면 훨씬 효율적입니다.

     

    7.5  클래스 추출하기

    class Person {
    	get officeAreaCode() {return this._officeAreaCode;}
    	get officeNumber() {return this._officeNumber;}
    }
    class Person {
    	get officeAreaCode() {return this._telephoneNumber.areaCode;}
    	get officeNumber() {return this._telephoneNumber.number;}
    }
    
    class TelephoneNumber {
    	get areaCode() {return this._areaCode;}
    	get number() {return this._number;}
    }

    7.6  클래스 인라인하기

    7.5와 반대로 하시면 됩니다.

     

    7.7  위임 숨기기

    manager = aPerson.department.manager;
    manager = aPerson.manager;
    
    class Person {
    	get manager() {return this.department.manager;}

    7.8 중개자 제거하기

    7.7과 반대로 생각하시면 됩니다.

     

    7.9 알고리즘 교체하기

    간소화되어있는 알고리즘을 선택해야 나중에 유지보수가 쉽습니다.

     

     

    이번 포스팅은 시간이 많이 부족해서 내용이 부실하네요 ㅠㅠ

    다음 편은 더 공부해서 돌아오겠습니다.

    반응형

    댓글

Designed by Tistory.