모듈을 분리하는 가장 중요한 기준은 아마도 시스템에서 각 모듈이 자신을 제외한 다른 부분에 드러내지 않아야 할 비밀을 얼마나 잘 숨기느냐에 있을 것이다. 이러한 구조는 캡슐화를 통해 숨길 수 있다.
7.1 레코드 캡술화하기
- 간단한 레코드 캡슐화하기
변수 캡슐화를 한 후, 데이터 구조를 표현하는 클래스를 정의하고, 이를 반환하는 함수를 새로 만듬
- 중첩된 레코드 캡슐화하기
변수 캡슐화를 한 후, 데이터 구조를 표현하는 클래스를 정의하고, 이를 반환하는 함수를 새로 만듬
데이터 구조 안으로 들어가는 코드를 세터로 뽑아 작업함.
7.2 컬렉션 캡슐화하기
컬렉션을 소유한 클래스를 통해서만 원소를 변경하도록 캡슐화하기
=> 컬렉션 변경자 메서드를 통해 원소를 변경하도록 하여 원본 모듈 밖에서 컬렉션을 수정하지 않도록 만들기
- 컬렉션 값 반환하지 않도록 하기
컬렉션들을 표준화된 인터페이스로 제공하며, 컬렉션 파이프라인과 같은 패턴을 적용하여 조합할 수 있음.
- 컬렉션을 읽기전용으로 제공하기
프락시 객체가 내부 컬렉션을 읽는 연산은 그대로 전달하고, 쓰기는 모두 막는 것.
이터레이터에서 내부 컬렉션을 수정할 수 없게 함.
- 컬렉션 게터를 제공하되 내부 컬렉션의 복제본을 반환하기
7.3 기본형을 객체로 바꾸기
단순한 출력 이상의 기능이 필요해지는 순간 그 데이터를 표현하는 전용 클래스를 정의하기
7.4 임시 변수를 질의 함수로 바꾸기
임시변수로 코드반복을 줄이는 것은 유용하고 의미있는 코딩이 가능함.
임시변수를 아예 함수로 만들어 사용하는 편이 더 나을 때가 많음.
비슷한 계산을 수행하는 다른 함수에서도 사용할 수 있어 코드중복이 줄어들음.
클래스 안에서 사용하는 것이 유용
7.5 클래스 추출하기
(<-> 클래스 인라인하기)
메서드와 데이터가 너무 많은 클래스는 이해하기가 쉽지 않으므로 잘 살펴보고 적절히 분리하기
특히 일부 데이터와 메서드를 따로 묶을 수 있다면 분리하기
7.6 클래스 인라인하기
더 이상 제 역할을 못 해서 그대로 두면 안되는 클래스는 인라인하기
7.7 위임 숨기기
캡슐화는 모듈들이 시스템의 다른 부분에 대해 알아야 할 내용을 줄여준다.
캡슐화가 잘 되어 있다면 무언가를 변경해야 할 때 함께 고려해야 할 모듈 수가 적어져서 코드를 변경하기가 쉬워진다.
캡슐화는 단순히 필드를 숨기는 것 보다 더 많은 역할을 가짐
위임객체를 일일히 가져와서 호출하는 의존성을 없애기위해 위임 메서드를 만들어서 위임 객체의 존재를 숨긴다.
7.8 중개자 제거하기
(<-> 위임 숨기기)
위임 숨기기가 이점만 주어지는 것이 아니다.
자주 호출 시 서버가 중개자 역할로만 전락할 수 있으므로 클라이언트가 위임 객체를 직접 호출하는 게 나을 수 있다.
7.9 알고리즘 교체하기
더 간명한 방법을 찾아내면 복잡한 기존 코드를 간명한 방식으로 고친다.
'Refactoring' 카테고리의 다른 글
[ 리팩토링 by 마틴 파울러 ] Chapter09. 데이터 조직화 (0) | 2021.07.22 |
---|---|
[ 리팩토링 by 마틴 파울러 ] Chapter08. 기능 이동 (0) | 2021.07.22 |
[ 리팩토링 by 마틴 파울러 ] Chapter06. 기본적인 리팩터링 (0) | 2021.07.21 |
[ 리팩토링 by 마틴 파울러 ] Chapter04. 테스트 구축하기 (0) | 2021.07.21 |
[ 리팩토링 by 마틴 파울러 ] Chapter03. 코드에서 나는 악취 (0) | 2021.07.20 |