2016-10-17 2 views
1

Существует момент в моей программе, что я прибыл в следующее условие:Лучший pratice для нулевых проверок нескольких полей

if ($Student->getClass() != null) { 
    if ($Student>getClass()->isActive()) { 
     if ($Student->getClass()->getAcceptedGrades() != null) { 
      if (in_array($StudentGrade, $Student->getClass()->getAcceptedGrades())) { 
       echo "The student has a acceptable grade." 
      } 
     } 
    } 
} 

Я спрашиваю себя, если не лучший способ делать такого рода проверки.

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

+0

Можете ли вы добавить больше фона и более конкретный конкретный код, пожалуйста. Сейчас трудно понять, о чем вы спрашиваете. Что такое $ object1 и $ object2? – Gordon

+0

Не должно ли это перейти на [обзор кода] (http://codereview.stackexchange.com/)? –

+0

@ Gordon, я использовал лучший пример, чтобы продемонстрировать его. –

ответ

2

До тех пор, пока методы будут возвращены null, вы получите эти проверки.

Вы можете использовать этот PHP port of java.util.Optional, но это все равно потребует проверки повсюду. Это выглядит несколько приятнее.

But the real issue is really returning null. Например, ваш

$Student->getClass()->getAcceptedGrades() 

по-видимому, возвращает либо null или array. Если бы этот метод всегда возвращал пустой массив вместо нуля, вы могли бы избавиться от нулевой проверки перед вызовом in_array. В общем, хорошая практика для метода вернуть одно и только одно. Это предотвращает употребление кода при проверке возвращаемых значений.

При изменении getAcceptedGrades всегда возвращает массив, вы остались с

if ($Student->getClass() != null) { 
    if ($Student>getClass()->isActive()) { 
     if (in_array($StudentGrade, $Student->getClass()->getAcceptedGrades())) { 
      echo "The student has an acceptable grade." 
     } 
    } 
} 

Как вы можете видеть, все ваши, если чеки в основном работают на любых getClass возвращается. Я предполагаю, что это объект класса/курса. Плохая вещь в том, что код, содержащий эти проверки, знает условия для проверки приемлемого класса. Когда вместо этого объект курса должен быть экспертом, потому что он содержит информацию для него. Так почему бы просто не добавить метод hasAcceptableGrade() в объект курса?

public function hasAcceptableGrade($StudentGrade) 
{ 
    return $this->isActive() 
     && in_array($StudentGrade, $this->getAcceptedGrades()); 
} 

Таким образом, ваш код, имеющий чеки if, не должен знать детали, как рассчитывается принятая оценка. Вместо этого он просто просит объект курса, который оставит вас с

if ($Student->getClass() != null) { 
    if ($Student->getClass()->hasAcceptableGrade($StudentGrade) { 
     echo "The student has an acceptable grade." 
    } 
} 

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

try { 
    if ($Student->getClass()->hasAcceptableGrade($StudentGrade) { 
     echo "The student has an acceptable grade." 
    } 
} catch (StudentNotEnrolledException $e) { 
    echo "Student is not enrolled" 
} 

или ввести Null Object для этого случая, например,

class NullCourse 
{ 
    public function hasAcceptableGrade($StudentGrade) 
    { 
     return false; 
    }  
} 

Мы всегда возвращаемся ложью здесь, потому что мы предполагаем, студент, не конечно никогда не будет иметь приемлемую оценку для курса. Если вы не хотите следовать этой логике, вы можете изменить это, очевидно, всегда верно или поднять StudentNotEnrolledException здесь.

С возвращаемым значением ложь, это уменьшает ваш код

if ($Student->getClass()->hasAcceptableGrade($StudentGrade) { 
    echo "The student has an acceptable grade." 
} 

Теперь единственное, что осталось, чтобы переместить метод hasAccetableGrade на объект Student, чтобы ваш потребляя код может просто попросить объект Student, вместо зная, что сначала нужно получить объект «Курс». Я опускаю код примера для этого. Вы получите

if ($Student->hasAcceptableGrade($StudentGrade) { 
    echo "The student has an acceptable grade." 
} 

Только один, если. Нет нескольких условий. И никаких проверок Null.

+0

Кажется очень разумным. Спасибо @ Gordon. –

0

Поместите функцию, которая сделает это для вас в классе ученика.

class Student { 
    public function hasEmptyClass() { 
     $class = $this->getClass(); 
     if (! $class instanceof Class || ! $class->hasAcceptableGrade(...)) { 
      return true; 
     } 
     return false; 
    } 
} 
+0

И еще один метод объекта класса/курса для принятых классов? А затем другой метод на X для Y и так далее? Я предпочел бы сохранить нулевые проверки, прежде чем идти по этому маршруту. – Gordon

+0

@ Gordon зависит от отношения и количества вещей для проверки. Если проверки связаны с чем-то общим, это то, что я сделал бы. – DanFromGermany