Должен ли я всегда проверять, является ли объект NULL? - PullRequest
2 голосов
/ 12 февраля 2009

У меня есть объект, построенный через фабрику, содержащую мои параметры, считанные из URL.

Из этого объекта я могу получить языковой параметр

$ language = $ My_parameters-> GetLanguage ();

$ язык равен NULL, если он не был установлен.

$ language также может быть недействительным ($ language-> isValid () возвращает false).

Итак, для создания моей страницы мне нужны некоторые параметры.

Страница также создается через фабрику. Тогда я знаю, какие параметры мне нужны для его построения. Если он пропускает параметры, я строю их с допустимым значением по умолчанию в соответствии с запрашиваемой страницей.

На этом этапе в фабрику страниц, если есть недопустимый параметр, я выбрасываю исключение.

Мой объект страницы содержит объект body, для которого требуется параметр языка. Я знаю, что мои параметры действительны, когда я строю объект тела.

В объект моего тела я получаю язык

$ language = $ My_parameters-> GetLanguage ();

На данный момент $ language ** ДОЛЖЕН ** быть действительным. Поэтому я проверяю снова

$language = $my_parameters->getLanguage();
if( is_null( $language ) or !$language->isValid() ) {
   throw new Exception( 'Language must be valid.' );
}

Если мне нужно 4 параметра, у меня есть 4 ifs , которые проверяют, не является ли объект NULL и недействительным.

Я делаю это, потому что метод является общедоступным , где $ language используется в объекте body.

И корпус объекта может быть построен за пределами завода. Кто знает ...

Правильно ли проверить в этом случае?

Каковы лучшие практики в этом отношении?

Ответы [ 5 ]

3 голосов
/ 12 февраля 2009

Вот случай, когда не проверяет наличие нуля в последнем сообщении в блоге из блога Google Testing.

Аргумент в том, что это мешает написанию понятных, простых модульных тестов, потому что вы не можете на самом деле подделать ненужные кусочки, потому что ваши исключения / утверждения будут выброшены.

Автор (Miško Hevery) квалифицирует комментарий, говоря, что если это внешний API, все равно стоит проверить наличие ошибки.

1 голос
/ 12 февраля 2009

Бросьте исключение из -> getLanguage ().

Для меня исключения должны создаваться автоматически. То, что вы делаете, похоже на смесь проверки кода ошибки и выдачи исключения.

1 голос
/ 12 февраля 2009

Вы можете упростить себе жизнь, разделив getLanguage () на два метода:

function getLanguageIfValid() {
  // this method return a Language object, but only if it can be created
  // correctly and the isValid() method returns TRUE. If the Language object
  // can't be created correctly, then it will return null instead.
}

function getLanguageMustBeValid() {
    // this method will always return an instance of Language, or else
    // an exception will be thrown
    if($return = $this->getLanguageIfValid())
        return $return;
    throw new Exception("Couldn't get Language object");
}

Как только вы это сделаете, в местах, где разумно сказать, что языковой элемент может быть создан неправильно, вы используете первый метод:

// we may or may not be able to get our Language object here
if($language = $my_parameters->getLanguageIfValid())
    do_stuff($language);

Если вы уверены, что объект языка должен быть создан, используйте второй метод, который выдаст вам исключение.

// we know the Language object is created at this point
$language = $my_parameters->getLanguageMustBeValid();
do_stuff($language);

Таким образом, ответ на ваш вопрос: Нет - вам не нужно проверять, что объект не является нулевым, если вы можете получить его из функции, которая гарантированно не возвращает нулевой. *

1 голос
/ 12 февраля 2009

Я из очень старой школы программирования на С; так что моя вещь в том, что переменные, которые не используются или были свободны (), всегда должны быть NULL. Это только мое мнение.

Редактировать: Основываясь на этом, вы всегда должны проверять, имеет ли переменная значение NULL, прежде чем использовать ее. Если переменная равна NULL и не должна быть, вы должны записать ошибку. Сбои не должны быть особенностью.

1 голос
/ 12 февраля 2009

я очень мало знаю о вашем домене, но в общем случае мне нравится утверждать (не ноль) повсеместно, потому что, как правило, если я получаю нулевой объект где-то, это ошибка.

также рекомендуется отдавать предпочтение ссылочным типам, которые обычно не могут быть нулевыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...