본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

Null Object Pattern

Null Object Pattern

함수에서 null을 리턴하는 경우, 함수를 사용하는 곳에서 null을 처리하는 예외처리를 해줘야한다.

반면, Null Object Pattern을 사용하면 null 객체를 처리하는 로직이 전파되는 문제를 줄일 수 있다. 그 결과, 중복 코드를 줄일 수 있어서, 코드가 단순해진다.

예를 들어, 회원 정보를 조회하는 다음과 같은 코드가 있다고 생각해보자.

public Customer GetByPhoneNumber(string phoneNumber)
{
  return _customerRepository
         .List(c => c.PhoneNumber == phoneNumber)
         .FirstOrDefault();
}

var customer = GetByPhoneNumber(phone);

int orderCount = customer != null ? customer.OrderCount : 0;
decimal totalPurchase = customer != null ? customer.TotalPurchase : 0m;

이 경우, 매번 값이 null인지 체크한 후 기본값을 할당해야한다.

그런데 다음과 같이 기본값을 지닌 회원 객체를 반환하면, null check에 대한 책임을 한 곳으로 모을 수 있다.

public class Customer
{
  public static Customer NotFound =
     new Customer() { OrderCount=0, TotalSales=0m };
  // other properties and behavior
}

or

public class NullObjectCustomer : Customer
{
  public NullObjectCustomer(){
    OrderCount=0;
    TotalSales=0m;
  }
  // other properties and behavior
}
public Customer GetByPhoneNumber(string phoneNumber)
{
 var customer = _customerRepository
                .List(c => c.PhoneNumber == phoneNumber)
                .FirstOrDefault();
  if(customer == null) { return Customer.NotFound; }
// or   if(customer == null) { return new NullObjectCustomer(); }
  return customer;
}

or

return new NullObjectCustomer();

https://deviq.com/design-patterns/null-object-pattern

Null Object Pattern | DevIQ

The Null Object Pattern was described in the Gang of Four's Design Patterns book. The intent of this pattern is to reduce the need to add checks and special behavior for handling null instances of certain variables that tend to propagate through applicatio

deviq.com