레거시 코드를 리팩토링을 할 때, final 키워드가 없고 접근제어자가 public 인 메소드를 마주하면, 아래 의문을 계속 확인하면서 작업해야 한다.
- 이 메소드는 왜 public 이지? 외부에서 사용하는 곳이 있나?
- 이 메소드를 어디선가 override 해서 사용하고 있나?
API 를 만들 때, 이 클래스를 사용할 개발자에게 어디까지 노출할 것인지를 계속 확인해야 한다.
public interface A {
void a1();
}
public class AImpl implements A {
@Override
public void a1() {
a2();
a3();
}
public void a2() { .. }
private void a3() { .. }
}
AImpl 의 a1() 메소드는 같은 클래스의 a2(), a3() 를 호출해 적절한 행동을 처리한다. AImpl 클래스를 작성한 개발자의 의도에 맞게 동작하려면, 외부에서는 a1() 만 보여야하고, AImpl 을 상속해도 a1() 을 Override 할 수 없어야 한다.
final 키워드, 접근제어자 를 설정해 외부에서 접글 할 수 없도록 해야한다.
public interface A {
void a1();
}
public class AImpl implements A {
@Override
public final void a1() {
a2();
a3();
}
private void a2() { .. }
private void a3() { .. }
}
AImpl 의 a1() 에는 final 키워드를 붙여 재정의를 할 수 없도록 하고, a2() 는 외부에 공개하지 않는다. a2()가 훅 메소드라면, 상속해 구현하는 클래스에서만 접근할 수 있도록 접근제어자를 protected 로 설정해야 한다.
AImpl 클래스를 사용하는 개발자에게 최소한의 정보를 제공해야한다. 그렇지 않으면, AImpl 클래스를 어떻게 사용할 지 예측할 수 없고, AImpl 클래스 개발자가 의도하지 않은 에러를 일으킬 수 있다.
'Snippets' 카테고리의 다른 글
| 첫 번째 목표 (0) | 2021.11.24 |
|---|---|
| Server 와 Client (0) | 2021.11.22 |
| 모든 소프트웨어 모듈의 목적 (0) | 2021.11.14 |
| Compile Error, Runtime Error (0) | 2021.11.09 |
| Proxy, Decorator 패턴 (0) | 2021.11.08 |