[Refactoring] 일반화 다루기

말하는 감자·2022년 5월 9일
0

Refactoring

목록 보기
9/9
post-thumbnail

📌 일반화 다루기 (Dealing with Generalization)

상속 계층 구조를 중심으로 동작하는 메소드 처리


✏️ 필드 일반화 (Pull Up Field)

서브 클래스가 같은 필드를 가지고 있다면 상위 클래스로 필드 이동

✔️ 장점

  • 하위 클래스에서 필드의 중복을 제거

  • 중복 메소드가 있는 경우 하위 클래스에서 상위 클래스로의 후속 재배치 용이


✏️ 메소드 일반화 (Pull Up Method)

서브 클래스에 유사한 작업을 수행하는 메소드가 있다면 메소드를 동일하게 만들어 상위 클래스로 이동

✔️ 장점

  • 중복 코드 제거

  • 하위 클래스가 상위 클래스 메소드를 재정의 가능
    동일한 작업 수행도 가능


✏️ 생성자 몸통 일반화

서브 클래스에 대부분 동일한 코드를 가진 생성자가 있다면 상위 클래스 생성자를 만들고 서브클래스에서 동일한 생성자로 이동
하위 클래스 생성자에서 상위 클래스 생성자 호출


✏️ 메소드 개별화 (Push Down Method)

하나 혹은 소수의 하위 클래스만 사용하는 메소드가 슈퍼 클래스에 있다면 하위 클래스로 이동

✔️ 장점

  • 클래스 일관성 향상

✏️ 필드 개별화 (Push Down Field)

필드가 하나 혹은 소수의 하위 클래스에서만 사용된다면 하위 클래스로 필드 이동

✔️ 장점

  • 클래스 일관성 향상

  • 필드를 독립적으로 개발 가능


✏️ 하위 클래스 추출 (Extract Subclass)

특정 경우에만 사용되는 기능을 하위 클래스를 생성하여 사용

✔️ 장점

  • 빠르고 쉽게 하위 클래스 생성

  • 여러개의 하위 클래스 분리 가능

❌ 단점

  • 하나의 객체 생성을 위해 여러개의 하위 클래스를 사용하는 경우 발생

✏️ 슈퍼 클래스 추출 (Extract Superclass)

공통 필드와 메소드가 있는 두개의 클래스가 있다면 공유할 수 있는 상위 클래스를 만들고 공통 부분을 상위 클래스로 이동

✔️ 장점

  • 코드 중복 제거

✏️ 인터페이스 추출 (Extract Interface)

여러 클라이언트가 클래스 인터페이스의 동일한 부분을 사용하거나 두 클래스의 인터페이스 일부가 동일하다면 동일한 부분을 자체 인터페이스로 이동


✏️ 계층 통합 (Collapse Hierarchy)

하위 클래스가 상위 클래스와 거의 동일한 클래스 계층 구조로 있다면 두 클래스를 병합

✔️ 장점

  • 프로그램 복잡성 감소
    클래스의 수가 적어진다는 것은 유지/변경해야 하는 항목이 적어짐

  • 코드 탐색이 수월해짐
    특정 메소드를 찾기 위해 전체 계층 구조를 탐색할 필요 없음


✏️ 템플릿 메소드 형식 (Form Template Method)

하위 클래스는 유사한 단계를 동일한 순서로 포함하는 알고리즘을 구현한다면 알고리즘 구조와 동일한 단계를 상위 클래스로 옮기고 다른 단계의 구현은 하위 클래스에 남김

<변경 전>

<변경 후>

✔️ 장점

  • 템플릿 메소드를 생성하면 슈퍼 클래스의 공유 알고리즘 단계를 병합하고 하위 클래스의 차이점만 남겨둠으로써 코드 중복 제거

  • 개방폐쇄의 원칙 준수


✏️ 상속을 위임으로 변경 (Replace Inheritance with Delegation)

하위 클래스가 상위 클래스 인터페이스의 일부만 사용하거나 상속된 데이터를 사용하지 않는다면 하위 클래스가 상위 클래스를 위임하는 관계로 변경

✔️ 장점

  • 클래스에는 상위 클래스에서 상속된 불필요한 메소드 미포함

  • 다양한 구현을 가진 다양한 객체를 대리자 필드로 넣을 수 있음
    사실상 전략 디자인 패턴을 얻음

❌ 단점

  • 간단한 위임 메소드를 많이 작성해야 함

✏️ 위임을 상속으로 변경 (Replace Delegation with Inheritance)

단순 위임을 자주 사용한다면 하위 클래스로 상속

✔️ 장점

  • 코드 길이 축소

📑 참고 자료

profile
나는 말하는 감자다

0개의 댓글