Сегодня я получил обзор кода от старшего разработчика, спрашивающего: «Кстати, что ты возражаешь против диспетчеризации функций с помощью оператора switch?» Во многих местах я читал о том, что перекачивание аргумента через метод switch для вызова методов является плохим ООП, не настолько расширяемым и т. Д. Однако я не могу придумать для него однозначного ответа. Я хотел бы решить это для себя раз и навсегда.
Вот наши конкурирующие предложения кода (php используется в качестве примера, но может применяться более универсально):
class Switch {
public function go($arg) {
switch ($arg) {
case "one":
echo "one\n";
break;
case "two":
echo "two\n";
break;
case "three":
echo "three\n";
break;
default:
throw new Exception("Unknown call: $arg");
break;
}
}
}
class Oop {
public function go_one() {
echo "one\n";
}
public function go_two() {
echo "two\n";
}
public function go_three() {
echo "three\n";
}
public function __call($_, $__) {
throw new Exception("Unknown call $_ with arguments: " . print_r($__, true));
}
}
Часть его аргумента звучала так: «Он (метод switch) имеет гораздо более чистый способ обработки случаев по умолчанию, чем тот, который вы используете в общем магическом методе __call ()».
Я не согласен с чистотой и на самом деле предпочитаю звонить, но я хотел бы услышать, что говорят другие.
Аргументы, которые я могу привести в поддержку Oopсхемы:
- Немного чище с точки зрения кода, который вы должны написать (меньше, легче читать, меньше ключевых слов для рассмотрения)
- Не все действия делегируются одному методу. Здесь нет большой разницы в исполнении, но, по крайней мере, текст более разделен.
- В том же духе, другой метод может быть добавлен в любом месте класса вместо определенного места.
- Методы пространства имен, что приятно.
- Здесь не применимо, но рассмотрим случай, когда
Switch::go()оперируется членом, а не параметром. Сначала вам нужно изменить член, а затем вызвать метод. ИбоOopвы можете вызывать методы самостоятельно в любое время.
Аргументы, которые я могу привести в поддержку Switchсхемы:
- Ради аргумента, более чистый метод работы с запросом по умолчанию (неизвестно)
- Кажется менее волшебным, что может заставить незнакомых разработчиков чувствовать себя более комфортно
Кому-нибудь есть что добавить для любой из сторон? Я хотел бы получить хороший ответ для него.
Oopпозволяет иметь phpdoc для описания каждого метода, который может быть проанализирован некоторыми IDE (например, NetBeans).