Wzorzec projektowy, unikanie if-ów, dobre praktyki

1

Witam serdecznie.

Mam taki kłopot nad zastosowaniem odpowiedniego wzorca do rozwiązania takiego problemu:

zrobCos() {
    if(warunek1){
        zrob1();
    }else 
    if(warunek2){
        zrob2();
    }
}

Moje podejście do tego typu sytuacji jest mniej więcej takie:

Tworzę interfejs

Interface ZrobCos 
    zrob();
KlasaWykonawca {
    metodaX(ZrobCos zrobCos) {
        zrobCos.zrob();
    }

}

Oraz obiekty implementujące ten interfejs , które odpowiednio wykonują zadane operacje według przeznaczenia .
Oczywiście to okrojony przykład

Problem polega na tym, że z front-endu idzie parametr, który określa która implementacja ma być użyta co prowadzi do użycia if-ów lub case.

Moim pomysłem jest przekazanie parametru określającego nazwę klasy jako parametru przychodzącego z front-endu. Przy pomocy refleksji tworzymy instancję tej klasy na podstawie przekazanego parametru. Pozbywamy się if-ów.

Czy moje rozwiązanie jest akceptowalne ? Ma ktoś ciekawsze podejścia ?
Może jakieś inne dobre praktyki eliminacji if-ów.

Pozdrawiam

2

http://koziolekweb.pl/2011/10[...]uzywaj-slowa-kluczowego-else/

poza tym parametr z nazwą klasy to super fajna podatność na ataki.

0

Tak masz rację, dzięki za artykuł.

0

To jakieś wariactwo. Czego jeszcze niby to mamy unikać?

„złożoność cyklomatyczna”? absurdalna miara, i kto powiedział, że powinna być jak najmniejsza?

0

Im kod mniej złożony wg. tej miary tym łatwiej jest go utrzymywać. Nie masz sytuacji gdzie z jednej metody masz n punktów wyjścia. Zobacz, że na forum często trafiają się kwiatki z drabinkami ifów gdzie jedyne co się nasuwa na myśl to "o rzesz ty w mordę".
Metoda mocno z dużą ilością ifów zaczyna robić wiele rzeczy i tym samym traci sens istnienia.

1

To nie ma znaczenia. Drabinkę ifów zamieniamy na switch, ale to tylko lukier składniowy, bo nadal jest tym samym. Autor artykułu sugeruje zamianę if-else na polimorfizm.

W jaki sposób zmniejsza to złożoność jakąś-tam programu? Może według jego świętego graala, złożoności cyklo-cośtam, tak mu wychodzi; ale jak się zastanowić, to:

  • Dany fragment programu ma mieć dokładnie pierdyliard możliwych przebiegów. Nie wolno nam tego „uprościć”, bo łamalibyśmy specyfikację.

Nie ma znaczenia jak to zapiszemy: czy w jednej wielkiej funkcji, czy w tysiącu jednolinijkowców. Nie ma znaczenia czy użyjemy if-else, czy miliona funkcji wirtualnych symulujących if-else. Nadal program (funkcja, moduł) musi mieć dokładnie ten pierdyliard możliwych przebiegów.

Dlatego nie ma sensu liczenie dziwnych metryk, które nas doprowadzają do absurdalnych wniosków. Kod powinien być prosty, czytelny. A prostsze, czytelniejsze, i szybsze w pisaniu oraz działaniu, jest zwykłe if-else.

0

Zgadzam się.
Im niej złożony kod tym łatwiej go utrzymać. Przejrzystość sama nasuwa rozwiązania.

Problem w tym, że ja <ort>od kąt</ort> zajmuję się it to nie natrafiłem na projekt, który był napisany zgodnie z paradygmatami programowania obiektowego.
Większość klas posiada <ort>nie poprawne</ort> nazewnictwo. Nie wspomnę o tym, że wykonują prace, które nie są im przypisane. Błędne nazewnictwo metod. Można by tak wypisywać bez końca . Jak się poruszać w tym.
Dlatego jestem zwolennikiem unikania if-ów, zasad GRASP, SOLID. Tylko jak je zastosować w projekcie, który jest źle zaprojektowany od samego początku.

0

"A prostsze, czytelniejsze, i szybsze w pisaniu oraz działaniu, jest zwykłe if-else."

Chyba dla kogoś kto od zawsze pisał wszystko w if-else , i pracował z językami proceduralnymi.

1

@Azarien, można też cały program zamknąć w jednej klasie. Summa summarum wyjdzie na to samo, dowalimy jeszcze tylko kilka GOTO i będzie super. Jeżeli sądzisz, że zwykłe "if-else" jest proste w rozumieniu to najwidoczniej nigdy nie widziałeś poprawnie napisanego programu np. z użyciem wzorca strategii. Po to ktoś znacznie mądrzejszy od nas wykombinował sobie, że znacznie wygodniej jest pozbyć się IFów i w ich miejsce wstawić jakieś rozwiązanie na poziomie architektury byśmy mogli używać tego jego "wynalazku" i nie męczyć się z klasami potworkami na 10k linii.

0

I jeszcze polecam z zeszłorocznej Confitury http://parleys.com/#st=5&id=3372&sl=0 (wersja ze slajdami)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0