Otrzymałem dzisiaj recenzję kodu od starszego programisty z pytaniem: „A propos, jaki jest twój sprzeciw wobec wywoływania funkcji za pomocą instrukcji switch?” Czytałem już w wielu miejscach o tym, jak pompowanie argumentu za pomocą przełączania do metod wywoływania jest złym OOP, nie jest tak rozszerzalne itp. Jednak tak naprawdę nie mogę znaleźć ostatecznej odpowiedzi dla niego. Chciałbym załatwić to raz na zawsze.
Oto nasze sugestie dotyczące konkurującego kodu (php użyty jako przykład, ale może być stosowany bardziej uniwersalnie):
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));
}
}
Część jego argumentacji brzmiał: „To (metoda zamiany) ma znacznie czystszy sposób obsługi domyślnych przypadków niż to, co masz w ogólnej magicznej metodzie __call ()”.
Nie zgadzam się co do czystości i faktycznie wolę połączenie, ale chciałbym usłyszeć, co mają do powiedzenia inni.
Argumenty, które mogę przedstawić na poparcie Oop
schematu:
- Trochę czystszy pod względem kodu, który musisz napisać (mniej, łatwiej czytać, mniej słów kluczowych do rozważenia)
- Nie wszystkie działania przekazane do jednej metody. Nie ma tutaj dużej różnicy w wykonaniu, ale przynajmniej tekst jest bardziej podzielony na przedziały.
- W tym samym duchu można dodać inną metodę w dowolnym miejscu w klasie zamiast w określonym miejscu.
- Metody mają przestrzeń nazw, co jest miłe.
- Nie ma tu zastosowania, ale rozważ przypadek, w którym
Switch::go()
operowany jest na elemencie, a nie na parametrze. Najpierw musisz zmienić członka, a następnie wywołać metodę. PonieważOop
możesz wywoływać metody niezależnie w dowolnym momencie.
Argumenty, które mogę przedstawić na poparcie Switch
schematu:
- Dla uproszczenia, czystsza metoda radzenia sobie z domyślnym (nieznanym) żądaniem
- Wydaje się mniej magiczny, co może sprawić, że nieznani programiści poczują się bardziej komfortowo
Czy ktoś ma coś do dodania po każdej ze stron? Chciałbym mieć dla niego dobrą odpowiedź.
Oop
pozwala mieć phpdoc do opisywania każdej metody, które mogą być analizowane przez niektóre IDE (np. NetBeans).