До тех пор, пока методы будут возвращены 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.
Можете ли вы добавить больше фона и более конкретный конкретный код, пожалуйста. Сейчас трудно понять, о чем вы спрашиваете. Что такое $ object1 и $ object2? – Gordon
Не должно ли это перейти на [обзор кода] (http://codereview.stackexchange.com/)? –
@ Gordon, я использовал лучший пример, чтобы продемонстрировать его. –