본문 바로가기

기타

[Refactoring] Encapsulation(2)

마틴파울러의 Refactoring 2판 7과의 내용 정리(2)입니다.

Extract Class(클래스 추출하기)

-메서드와 데이터가 너무 많은 클래스는 이해하기가 쉽지 않으니 잘 살펴보고 적절히 분리하는 것이 좋다.
-특히 일부 데이터와 메서드를 따로 묶을 수 있다면 어서 분리하라는 신호!
-함께 변경되는 일이 많거나 서로 의존하는 데이터들도 분리!

// from
class Person {
  ...
  get officeAreaCode() {return this._officeAreaCode;}
  get officeNumber()   {return this._officeNumber;}
}
------------------------------------------------------
// to
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;}
}

Inline Class(클래스 인라인하기)

-클래스 추출하기의 반대 리팩터링으로, 더 이상 제 역할을 못하는 분리된 클래스는 인라인해버린다.
-클래스 추출하고 나니 특정 클래스에 남은 역할이 거의 없을 때 이런 현상이 자주 생김

// from
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;}
}
------------------------------------------------------
// to
class Person {
  ...
  get officeAreaCode() {return this._officeAreaCode;}
  get officeNumber()   {return this._officeNumber;}
}

Hide Delegate(위임 숨기기)

-서버 객체의 필드가 가리키는 객체(위임 객체)의 메서드를 호출하려면 클라이언트는 이 위임 객체를 알아야 한다. 이럴 경우 위임 객체의 인터페이스가 바뀌면 이 인터페이스를 사용하는 모든 클라이언트가 코드를 수정해야 한다.
-따라서, 서버 자체에 위임 메서드를 만들어서 위임 객체의 존재를 숨기면 된다!

// from
manager = aPerson.department.manager;
------------------------------------
manager = aPerson.manager;

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

Remove Middle Man(중재자 제거하기)

-위임 숨기기의 반대 리팩터링
-클라이언트가 위임 객체의 또 다른 기능을 사용하고 싶을 때마다 서버에 위임 메서드를 추가해야 하는데, 이러다보면 단순히 전달만 하는 위임 메서드들이 점점 많아진다.
- 이렇게 되면, 서버 클래스는 그저 중개자 역할로 전락하여 차라리 클라이언트가 위임 객체를 직접 호출하는게 나을 수 있다.

manager = aPerson.manager;

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

Substitute Algorithm(알고리즘 교체하기)

-더 간명한 방법을 찾아낸다면, 교체하기
-거대하고 복잡한 알고리즘의 경우 교체하기란 상당히 어려우니, 알고리즘을 간소화하는 작업부터 해야 작업이 쉬워진다.

// from
function foundPerson(people) {
  for (let i = 0; i < people.length; i++) {
    if (people[i] === 'Don') {
      return 'Don';
    }
    if (people[i] === 'John') {
      return 'John';
    }
    if (people[i] === 'Kent') {
      return 'Kent';
    }
  }
  return '';
}
----------------------------------------
// to
function foundPerson(people) {
  const candidates = ['Don', 'John', 'Kent'];
  return people.find(p => candidates.includes(p)) || '';
}

'기타' 카테고리의 다른 글

[Refactoring] Moving Features(2)  (0) 2021.05.24
[Refactoring] Moving Features(1)  (0) 2021.05.21
[Refactoring] Encapsulation(1)  (0) 2021.05.17
[Refactoring] A First Set Of Refactorings(2)  (0) 2021.05.11
[Refactoring] A First Set Of Refactorings(1)  (0) 2021.05.06