Null Object Pattern

널 오브젝트 패턴을 정리한다.

기존의 not null check

1
2
3
4
Employee e = DB.getEmployee("Bob");
if (e != null && e.isTimeToPay(today)) {
e.pay();
}

not null 확인은 관용적인 표현이지만 보기 싫고, 에러가 발생하기 쉽다.
DB.getEmployee 가 null 대신 예외를 발생시키면 에러가 발생할 위험을 감소시킬 수 있다.
하지만, try/catch 블록이 추가되어야한다.

Null Object Pattern 적용

널 오브젝트 패턴을 사용하면 null 검사 코드가 제거되고 코드를 단순화시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class DB {
public static Employee getEmployee(String name) {
return Employee.NULL;
}
}

public interface Employee {
public boolean isTimeToPay(Date payDae);

public void pay();

public static final Employee NULL = new Employee() {

public boolean isTimeToPay(Date payDae) {
return false;
}

public void pay() {

}
}
}

Employee e = DB.getEmployee("Bob");
if (e.isTimeToPay(today)) {
e.pay();
}

없는 직원을 익명 내부 클래스로 만들어서, 인스턴스가 오직 하나임을 보장한다.
없는 직원 내부에서는, isTimeToPay 는 false 를 반환하고 아무 임금도 지급하지 않는다.


클린 소프트웨어 <로버트 C.마틴>

Comments