본문 바로가기

클린코드

[Refactoring] 17. 메시지 체인

 

코딩으로 학습하는 리팩토링 - 인프런 | 강의

리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직

www.inflearn.com

| 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다.


메시지 체인
  • 레퍼런스를 따라 계속해서 메서드 호출이 이어지는 코드
    • this.member.getCredit().getLevel().getDescription()

  • 코드 체인을 모두 이해해야 로직을 이해할 수 있다.
  • 체인 중 일부가 변경된다면 클라이언트의 코드도 수정해야 한다.
  • 관련 리팩토링
    • 위임 숨기기 -> 메시지 체인의 캡슐화
    • 함수 추출하기 -> 메시지 체인 일부를 함수로 추출

Refactoring 1. 위임 숨기기

  • 캡슐화 -> 어떤 모듈이 시스템의 다른 모듈을 최소한으로 알아야 한다는 것 -> 그래야 어떤 모듈을 변경할 때, 최소한의 모듈만 그 변경에 영향을 받는다.
  • 메서드 호출을 숨길 수 있다. 
    • this.member.getDescription() -> getDescription() 안에서 this.member.getCredit().getLevel() 호출
Before
public class Department {

    private String chargeCode;

    private Person manager;

    public Department(String chargeCode, Person manager) {
        this.chargeCode = chargeCode;
        this.manager = manager;
    }

    public String getChargeCode() {
        return chargeCode;
    }

    public Person getManager() {
        return manager;
    }
}

public class Person {

    private String name;

    private Department department;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}

=> Person Department의 Manager의 값을 확인하려면 Person -> Department를 거쳐야 한다.

  • person.getDepartment().getManager()
After
public class Department {

    private String chargeCode;

    private Person manager;

    public Department(String chargeCode, Person manager) {
        this.chargeCode = chargeCode;
        this.manager = manager;
    }

    public String getChargeCode() {
        return chargeCode;
    }

    public Person getManager() {
        return manager;
    }
}

public class Person {

    private String name;

    private Department department;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    public Person getManager() {
        return this.department.getManager();
    }
}

=> person.getManager()로 Manager 값 확인 가능

'클린코드' 카테고리의 다른 글

[Refactoring] 19. 내부자 거래  (1) 2022.09.23
[Refactoring] 18. 중재자  (0) 2022.09.22
[Refactoring] 16. 임시 필드  (1) 2022.09.20
[Refactoring] 15. 추측성 일반화  (0) 2022.09.18
[Refactoring] 14. 성의없는 요소  (0) 2022.09.17