2013-03-13 7 views
1

그냥 null 개체 패턴 (http://phpmaster.com/the-null-object-pattern-polymorphism-in-domain-models/)에 대한 훌륭한 기사를 읽었으며 기존 코드에 구현할 계획입니다.PHP null 개체 대 기본 null 값

제 질문은 완전히 새로운 'null class'가이 일을하는 가장 좋은 방법일까요? 이전에는 NULL로 생성자의 기본값을 설정했습니다. 그렇다면 클래스의 빈 껍데기를 만들 수 있습니다. 예를 들어 :

$person = new person(1, 'John Doe', '[email protected]'); 

을 그리고 나는 '널 (null)'객체를 원한다면 내가 할 것이다 : 나는 실제 개체를 원하는 경우

class person{ 

    private $_personId; 
    private $_name; 
    private $_email; 
    private $_phone; 

    public function __construct($_personId, $_name, $_email, $_phone = NULL){ 
     //set the vars here 
    } 

} 

내가 할 것

$person = new person(NULL, NULL, NULL); 

거기에 이 접근법에 어떤 함정이라도 있습니까?

+4

이,'$ 사람 = 새로운 사람 '만큼 효과적 일 것 (NULL, NULL, NULL); ' –

+0

네가 맞아, 나는 그 질문을 망쳤다. 나는 그것을 편집 할 것이다. –

+1

실제 확인 작업을 수행하지 않고 Null을 사용할 수있는 경우 NullObject에 대한 이유는별로 없습니다. '__construct ($ _ personId = NULL, $ _name = NULL, $ _email = NULL)'을 사용하면 모든 인수가 _ 선택 사항임을 나타냅니다. 그렇지 않다면, 디폴트 NULL 값을주지 말고'__construct ($ _ personId, $ _name, $ _email)'(또는 첫 번째가 필요할 수도 있고, 두 번째는 옵션 일 수도있다. 인수가 전달되지 않으면 오류가 발생합니다. 로그에서 수분이 많고 유용하며 요점 오류가있어서 빠르게 디버깅 할 수 있습니다. – Wrikken

답변

1

팩토리 패턴을 탐색하는 것이 좋습니다. 즉, 전달 된 매개 변수를 기반으로 Person 객체를 반환 할 수있는 몇 가지 정적 메서드를 Person 내에 만드는 것이 좋습니다. 예를 들어 :

class Person { 
public static createWithName($name) { 
    $obj = new Person(); 
    $obj->_name = $name; 
    return $obj; 
} 

public static createWithNameAndEmail($name, $email) { 
    $obj = new Person(); 
    $obj->_email = $name; 
    $obj->_name = $email; 
    return $obj;  
} 

.... 
} 

/* 
    And then instead of $objPerson = new Person('Bob', null, null, null) 
    you would instantiate an object like this: 
*/ 
$objPerson = Person::createWithName('Bob') 

이것은 당신이 당신이 필요로하는 모든 검증을 할 수 있도록, 당신은 메서드 선언을 통해 매개 변수의 유효한 종류를 문서화하는 데 도움이됩니다. 팩토리 패턴에 대한 추가 정보 : http://phpmaster.com/understanding-the-factory-method-design-pattern/

+1

두 가지. 나는 PHP 전문가는 아니지만, 공장 패턴에 대한 나의 이해에서, 당신이 위에서 설명하고있는 것이 아닙니다. 공장이 동적 메서드 이름이 아닌 동적 클래스 이름과 관련이 있습니까? 둘째로, 나는 이것이 원래의 문제를 다루고 있다고 생각하지 않는다. 나는 완전히 비어있는 물건을 만들 필요가있다. 이름도, 아무것도 아니다. 방법은 null 개체를 생성하는 데 제안 건가요? –

+0

나는 정적 인 방법을 부끄럽게 생각합니다. 테스트 해보십시오. 의존성 주입은 대개 더 좋은 방법입니다. – CommandZ

+0

@CommandZ 팩토리 패턴은 정적 메서드가 정당화되는 코드의 유일한 위치 일 것입니다. 대답에 제시된 두 가지 방법은 문제의 도메인 모델을 초기화하는 단순한 약식입니다. – hijarian

3

기사에서 설명한 패턴을 따르지 않습니다. 의 원칙 null 객체은 기본 도메인 객체를 확장합니다. 이 같은 것입니다 :

모든 인수,`$ 사람 = 새로운 사람()에 대한 NULL 기본값을 제공 한 것처럼
class Person { 
    // atributes and methods... 
} 

class PersonNull extends Person { 

}