2013-03-13 2 views
1

Я просто прочитал отличную статью о шаблоне нулевого объекта (http://phpmaster.com/the-null-object-pattern-polymorphism-in-domain-models/), и я планирую реализовать его в каком-то существующем коде.php null object vs default null values ​​

Мой вопрос: будет ли новый класс «нулевого класса» лучшим способом сделать это? Раньше я устанавливал значения по умолчанию в конструкторе как 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(1, 'John Doe', '[email protected]'); 

И если я хотел «нулевой» объект я хотел бы сделать:

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

Есть любые подводные камни к этому подходу?

+4

Как вы указали NULL по умолчанию для всех аргументов, '$ человека = новый человек(); 'будет столь же эффективным, как' $ человека = новый человек (NULL, NULL, NULL); ' –

+0

вы правы, я ввернул этот вопрос. я отредактирую его. –

+1

Если вы не делаете никаких реальных проверок, а Nulls разрешены, у NullObject нет большой причины, не так ли? С '__construct ($ _ personId = NULL, $ _name = NULL, $ _email = NULL)', вы заявляете, что все аргументы _optional_. Если они НЕ, вы не должны указывать их значения по умолчанию NULL, но просто укажите '__construct ($ _ personId, $ _name, $ _email)' (или может потребоваться первое, 2 после этого необязательного и т. Д.). Который будет генерировать ошибки, если аргументы не будут переданы. Сочные, полезные, точечные ошибки в вашем журнале, которые позволяют отлаживать так быстро. – Wrikken

ответ

1

Я рекомендую вам изучить образец Factory, то есть создать несколько статических методов внутри 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-гуру, но из моего понимания фабричной модели это не то, что вы описываете выше. не связано ли фабрика с именами динамических классов, а не с именами динамических методов? Во-вторых, я не думаю, что это касается исходной проблемы. Мне нужно создать совершенно пустой объект, имя, ничто. вы предлагаете иметь метод, называемый create null object? –

+0

Я бы уклонился от статических методов. Попробуйте протестировать. Обычно инъекция зависимостей - лучший способ. – CommandZ

+0

@CommandZ Заводской шаблон, вероятно, является единственным местом в коде, где статические методы оправданы. Эти два метода, представленные в ответе, являются просто сократительными для инициализации рассматриваемой модели домена. – hijarian

3

Вы не следуете описанному шаблону в статье. Принципы Объект Null расширяет ваш основной объект домена. Будет что-то вроде этого:

class Person { 
    // atributes and methods... 
} 

class PersonNull extends Person { 

}