Refactoring

[ 리팩토링 by 마틴 파울러 ] Chapter12. 상속 다루기

noahkim_ 2021. 7. 22. 02:13

12.1 메서드 올리기

12.2 필드 올리기

12.3 생성자 본문 올리기

 

생성자는 할수 있는 일과 호출순서에 제약이 있음

(생성될 때만 호출, 리턴 X, 오브젝트 초기화 용도)

 

부모-자식의 클래스 , 생성자 호출 단계에서 부모의 생성자를 호출하지 않는 자식의 경우가 있다면 체크 자식 생성자에 따로 알맞은 로직을 호출하도록 코딩한다 

 

12.4 메서드 내리기

12.5 필드 내리기

12.6 타입 코드를 서브클래스로 바꾸기

  • 타입코드

 비슷한 대상들을 특정 특성에 따라 구분해야 할 때

 

서브 클래스로 생성하여 조건에 따라 다르게 동작하는 다형성 제공하기

특정 타입에서만 의미가 있는 값을 사용하는 필드나 메서드가 있을 때 사용하기

 

  • 직접 상속

Employee를 상속한 클래스가 타입에 따라 Engineer, Manager등 으로 생성해줌

 

  • 간접 상속

Employee가 필드변수로 EmployeType을 가짐

이 EmployeeType을 상속하는 Engineer, Manager등을 생성

 

12.7 서브클래스 제거하기

 

자식들을 모두 없애고 부모로 통합

 

일종의과도한 프로그래밍 요소 사용 제거하기 가까운 목적

 

12.8 슈퍼클래스 추출하기

 

클래스를 짜다가 공통분모가 있으면 수행

 

12.9 계층 합치기

12.10 서브클래스를 위임으로 바꾸기

 

상속은 강력하지만 단 한번만 쓸 수 있음
(C++ 다이아몬드 상속은 제외)

 

상속은 클래스들 관계를 아주 긴밀하게 결합함

부모를 수정하면 자식들의 기능을 해칠 가능성이 있음

=> 위임으로 해결하기

 

기능하는 위임자를 객체에 포함하여 존재여부에 따라 구현함

 

12.11 슈퍼클래스를 위임으로 바꾸기

 

상속을 잘못 적용한 경우 사용

 

상속은 자식이 부모의 기능을 모두 갖는다는 뜻

이것이 어울리지 않으면 수정이 필요

(ex. stack의 list 상속받음)

-> 스택이 list 필드로 가지고, 이와 관련하여 stack 한정적인 메소드를 만들기