Refactoring

[ 리팩토링 by 마틴 파울러 ] Chapter07. 캡슐화

noahkim_ 2021. 7. 21. 01:50

모듈을 분리하는 가장 중요한 기준은 아마도 시스템에서 각 모듈이 자신을 제외한 다른 부분에 드러내지 않아야 할 비밀을 얼마나 잘 숨기느냐에 있을 것이다. 이러한 구조는 캡슐화를 통해 숨길 수 있다.

 

7.1 레코드 캡술화하기

 

  • 간단한 레코드 캡슐화하기

변수 캡슐화를 한 후, 데이터 구조를 표현하는 클래스를 정의하고, 이를 반환하는 함수를 새로 만듬

 

  • 중첩된 레코드 캡슐화하기

변수 캡슐화를 한 후, 데이터 구조를 표현하는 클래스를 정의하고, 이를 반환하는 함수를 새로 만듬

데이터 구조 안으로 들어가는 코드를 세터로 뽑아 작업함.

 

7.2 컬렉션 캡슐화하기

 

컬렉션을 소유한 클래스를 통해서만 원소를 변경하도록 캡슐화하기

=> 컬렉션 변경자 메서드를 통해 원소를 변경하도록 하여 원본 모듈 밖에서 컬렉션을 수정하지 않도록 만들기

 

  • 컬렉션 값 반환하지 않도록 하기

컬렉션들을 표준화된 인터페이스로 제공하며, 컬렉션 파이프라인과 같은 패턴을 적용하여 조합할 수 있음.

 

  • 컬렉션을 읽기전용으로 제공하기

프락시 객체가 내부 컬렉션을 읽는 연산은 그대로 전달하고, 쓰기는 모두 막는 것. 

이터레이터에서 내부 컬렉션을 수정할 수 없게 함.

 

  • 컬렉션 게터를 제공하되 내부 컬렉션의 복제본을 반환하기

7.3 기본형을 객체로 바꾸기

 

단순한 출력 이상의 기능이 필요해지는 순간 데이터를 표현하는 전용 클래스를 정의하기

 

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

 

임시변수로 코드반복을 줄이는 것은 유용하고 의미있는 코딩이 가능함. 

임시변수를 아예 함수로 만들어 사용하는 편이 더 나을 때가 많음.

비슷한 계산을 수행하는 다른 함수에서도 사용할 수 있어 코드중복이 줄어들음.

클래스 안에서 사용하는 것이 유용

 

7.5 클래스 추출하기

(<-> 클래스 인라인하기)

 

메서드와 데이터가 너무 많은 클래스는 이해하기가 쉽지 않으므로 잘 살펴보고 적절히 분리하기

특히 일부 데이터와 메서드를 따로 묶을 있다면 분리하기

 

7.6 클래스 인라인하기

 

더 이상 제 역할을 못 해서 그대로 두면 안되는 클래스는 인라인하기

 

7.7 위임 숨기기

 

캡슐화는 모듈들이 시스템의 다른 부분에 대해 알아야 할 내용을 줄여준다. 

캡슐화가 잘 되어 있다면 무언가를 변경해야 할 때 함께 고려해야 할 모듈 수가 적어져서 코드를 변경하기가 쉬워진다.

 

캡슐화는 단순히 필드를 숨기는 것 보다 더 많은 역할을 가짐

위임객체를 일일히 가져와서 호출하는 의존성을 없애기위해 위임 메서드를 만들어서 위임 객체의 존재를 숨긴다.

 

7.8 중개자 제거하기

(<-> 위임 숨기기)

 

위임 숨기기가 이점만 주어지는 것이 아니다. 

자주 호출 시 서버가 중개자 역할로만 전락할 수 있으므로 클라이언트가 위임 객체를 직접 호출하는 게 나을 수 있다.

 

7.9 알고리즘 교체하기

 

간명한 방법을 찾아내면 복잡한 기존 코드를 간명한 방식으로 고친다.