메시지 체인.
우리는 this.member.getCredit(). getLevel(). getDescription()과 같은 체인 형태를 본 적이 있고 사용한 적이 있다.
이는 레퍼런스를 따라 계속해서 메소드 호출이 이어지는 코드이다.
나는 최근 이러한 코드를 한번 호출하도록 고쳤다.
그 이유는 위와 같은 메시지 체인이 반복되었고 이를 통해 이 책임은 해당 객체에 있다는 것을 깨닫고 즉시 메서드를 만들어서 책임을 넘겨주었다.
혹은 해당 객체를 여기서 사용하는 것이 맞는지 이 참조가 해당 클래스에 위치하는지 검토하기도 했다.
만약 메시지 체인을 사용한다면 다른 개발자들은 해당 코드의 클라이언트가 코드 체인을 모두 이해해야 한다. 만약 체인 중 일부가 변경된다면 클라이언트의 코드도 변경해야 한다.
나는 함수 추출하기로 메시지 체인 일부를 함수로 추출하여 함수를 옮겨 적절하게 이동했다.
다른 방법으로는 Hide Delegate라는 위임 숨기기라는 리팩토링이 존재한다.
Hide Delegate
메시지 체이닝은 마치 캡슐화를 적용하는 것과 같다.
person.department().manger()라는 코드는 person에 deparment가 있고 deparment가 manager를 가지고 있다는 정보를 클라이언트에게 노출시킨다.
하지만 클라이언트는 해당 정보를 알고싶지도 알아서도 안된다. 이를 위임을 통해 person.getManager()라는 코드로 메서드 호출을 캡슐화할 수 있다.
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 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 Person getManager() {
return getDepartment().getManager();
}
'독서에서 한걸음' 카테고리의 다른 글
Insider Trading (0) | 2022.12.26 |
---|---|
Middle Man (0) | 2022.12.24 |
Temporary Field (0) | 2022.12.24 |
Speculative Generality (0) | 2022.12.24 |
Lazy Element (0) | 2022.12.24 |
댓글