2010-03-02 7 views
4

Null 객체 패턴의 주된 목표는 사용 가능한 객체가 클라이언트에 제공되는지 확인하는 것입니다. 그래서 우리는이 구현 ... ...Null 객체 패턴 확인 null

void Class::SetPrivateMemberA() { 
    m_A = GetObject(); 
} 

void Class::UseA() { 
    if (m_A != null) { 
     m_A.Method(); 
    } else { 
     // assert or log the error 
    } 
} 

다음 코드를 교체하려면 :

void Class::SetPrivateMemberA() { 
    m_A = GetObject(); 
} 

void Class::UseA() { 
    m_A.Method(); 
} 

내가 생각하고 문제는 GetObject를()가 여전히 객체를 반환 즉, NULL 객체 또는 기타. 반복적으로 null을 확인하지 않고 다시 전송 된 객체를 사용할 수 있다고 믿는 생각을 좋아하지만 첫 번째 구현에서는 왜 그렇게하지 않겠습니까?

Null Object 패턴의 이점은 코드 정리에 대한 신뢰가 약간 증가했기 때문입니까? 두 번째 구현에서는 A.Method()를 호출하기 전에 null이 아닌지 확인하는 것이 좋습니다.

답변

4

null을 반환하지 않는다고 확신하는 경우 첫 번째 구현에서 메서드를 호출하기 전에 null 검사를 건너 뛰십시오. 마찬가지로, UseA()이 null 객체에서 다르게 작업해야하는 경우 특별한 작업을 수행해야한다면 null 객체를 명시 적으로 확인해야합니다. 그러나 null 객체 패턴이 실제로 도움이되는 것은 실제로 중요하지 않은 상황입니다.

대부분의 관찰자 패턴을 예로들 수 있습니다. 관찰자 패턴이 하나의 관찰자 만있을 수있는 클래스의 구성원으로 구현하고 관찰자에게 클래스가 무언가를 수행했음을 알리려는 경우 관찰자가 null인지 아닌지는 클래스에 문제가되지 않습니다.

이것은 또한 빈 컨테이너 클래스로 설명되며 기본적으로 null 개체 패턴입니다. 쿼리에서 null 컨테이너를 반환하는 대신 빈 컨테이너를 반환하면됩니다. 컨테이너의 모든 엔트리를 반복하는 것과 같은 경우에는 비어 있는지 여부가 중요하지 않으므로 null 확인의 필요성을 제거하면 코드를보다 유지 보수성/읽기 쉽게 할 수 있습니다. 그러나 데이터 세트의보기를 채우려면 명시 적으로 다른 "항목 없음"을 표시해야합니다. 빈 컨테이너를 확인합니다. 선명도

한 문제에 대한

편집에만 호출 사이트에서 찾고있다. 대부분의 디자인 패턴과 마찬가지로이 기능을 완전히 활용하려면 양면을 포괄해야합니다. 고려 :

public PossiblyNull GetSomethingNull() 
{ 
    if (someBadSituation()) 
     return null; 
    else 
     return SomehowProduceSomething(); 
} 

대 지금

public PossiblyEmpty GetSomethingEmpty() 
{ 
    if (someBadSituation()) 
     return StaticEmptySomething(); 
    else 
     return ProdueSomethingYay(); 
} 

, 전화 코드를 대신

public void DoSomethingWithChild(Foo foo) 
{ 
    if (foo != null) 
    { 
     PossiblyNull bar = foo.GetSomething(); 
     if (bar != null) 
      bar.DoSomething(); 
    } 
} 

처럼 보이는이 두 번째 imple으로

public void DoSomethingWithChild(Foo foo) 
{ 
    if (foo != null) 
     foo.GetSomething().DoSomething(); 
} 
+0

귀하의 의견에 동의하며 아래 Carl이 동의합니다. 그것은 지나치게 편집증적이고, 코드를 복잡하게 만들고, 코드 리뷰를 늦춘다 고 생각합니다. 문제는 'what-if'인수에 대해 방어합니다 : "무엇인가 '가 생산 중에 발생하면 우리가 null을 확인하지 않았기 때문에 충돌합니다. ? 어떻게 대답하겠습니까? – TERACytE

+0

@TERACyTE : null 상태에 대한 코드 분기를 추가하면 필요하지 않을 때 코드를 추가하면 유지 관리하기가 더 어려워 복잡해집니다. null-checking-for-null이면의 아이디어는 꽤 구분됩니다 디자인에 의한 정규 출현으로 null을 사용하고 더 많은 것을 예외적 인 것으로 취급하는 null 객체 패턴에서. – Tanzelax

+0

(예를 들어 게시물 편집) 아이디어는 여전히 사물이 여전히 null 일 수있는 경우, 여전히 null을 검사 할 필요가 있습니다. 그러나 null을 가능한 ** 소스 **로 가져 오면 코드 브랜치를 유지 관리하기가 더 쉬워집니다. – Tanzelax

0

될 수 있습니다 그것도 을 호출하기 전에 null이 아니라고 확인하는 것이 좋습니다.

아니요. m_A가 null이 아니라는 것을 알고 있으면 불필요한 검사입니다. 이것은 편집증 코딩의 예입니다. 무슨 해로울 까?불필요하게 코드를 복잡하게합니다. 그것은 읽기 어렵게, 디버그하기 어렵게 만듭니다.