switch czy if?

0

Mam funkcję która w zależności od liczby przekazanej jako parametr wykonuje blok instrukcji, ewentualnie inna funkcję. Moje pytanie skłania się do tego co jest efektywniejsze? switch czy if? A moze mapowanie? I przy okazji, jaki program do analizy kodu polecacie? Chciałbym po prostu sprawdzić co powinienem zoptymalizować itd.

0

Nie jestem jakimś specem od optymalizacji kodu, ale wydaję mi się, że wyborem "switch czy if" kodu nie zoptymalizujesz. Program raczej zwalnia na pętlach i tym podobnym a te polecenia są raczej podobne.

0

w zależności od potrzeb

0

Wzorcem Strategia [diabel]
Do sprawdzania kodu poszukaj: PMD. Fajny tez jest FindBugs, ostatnio sie bawilem i na probe przejechalem moj projekt i znalazl mi faktycznie kilka prawdziwych bugow, niesamowity program.

0

@iluminacja:
W myśl zasady, że funkcja powinna robić jedną rzecz, i tak prawdopodobnie powinieneś rozbić tę funkcję z blokami instrukcji na kilka mniejszych. Każdy blok instrukcji można wydzielić jako oddzielną funkcję.

Wtedy łatwiej zastosować wzorzec Strategia, który może się tu idealnie nadawać. Generalnie gdy chcesz wykonać różne instrukcje w zależności od wartości jakiejś zmiennej (i gdy nie dotyczy to walidacji tej zmiennej), to powinna Ci się zaświecić lampka, że być może należy tu zastosować polimorfizm. Szczególnie gdy bardzo podobne bloki ifów/switchy masz w kilku miejscach.

0
bswierczynski napisał(a)

@iluminacja:
W myśl zasady, że funkcja powinna robić jedną rzecz, i tak prawdopodobnie powinieneś rozbić tę funkcję z blokami instrukcji na kilka mniejszych. Każdy blok instrukcji można wydzielić jako oddzielną funkcję.

Wtedy łatwiej zastosować wzorzec Strategia, który może się tu idealnie nadawać. Generalnie gdy chcesz wykonać różne instrukcje w zależności od wartości jakiejś zmiennej (i gdy nie dotyczy to walidacji tej zmiennej), to powinna Ci się zaświecić lampka, że być może należy tu zastosować polimorfizm. Szczególnie gdy bardzo podobne bloki ifów/switchy masz w kilku miejscach.
Do polimorfizmu to sie raczej nie nadaje (argumentem funkcji jest bajt^^), tutaj wyglada to tak, ze serwer po analizie naglowka, a wlasciwie konkretnego bajtu z naglowka, decyduje jakie zadanie ma wykonac. Zadania sa bardzo zroznicowane, szczerze mowiac nie wiem nawet jak w takim przypadku moglbym zastosowac polimorfizm. Sklaniam sie do tego, by ta funkcja, po analizie argumentu wywolywala ta, ktora jest odpowiedzialna za dane zdarzenie.

0

Jeszcze tylko dodam, ze jesli ktos ma jakis pomysl jak tu wykorzystac polimorfizm to bede bardzo wdzieczny. Niestety w sytuacji gdy, nie mam obiektu, a jedynie wartosc bajtu, nie potrafie sobie tego wyobrazic, aczkolwiek moze da sie to zrobic. Oczywiscie moglbym napisac funkcje ktora zwraca obiekt na podstawie konkretnego bajtu i dalej jechac z polimorfizmem, ale sek w tym, ze piszac funkcje zwracajaca obiekt w zaleznosci od bajtu doszedlbym do tego samego, o co pytam teraz _ Oplacaloby sie to, gdybym uzywal takich instrukcji w reszcie kodu, ale tak nie jest.

0

Polimorfizm masz wykorzystac nie dla argumentu metody, to nie jest strategia. W metodzie odbierasz bajta, jednym z pol obiektu ktory ma ta metode jest inny obiekt, implementtujacy jakis interfejs, no i wolasz ta metode. Gdy masz inna strategie, to pole jest ustawione na inny obiekt. I masz polimorfizm.

Z ta strategia to ja sobie zartowalem, bo pytania typu "if czy switch" uwazam za naprawde kiepskie.

0
::. napisał(a)

Polimorfizm masz wykorzystac nie dla argumentu metody, to nie jest strategia. W metodzie odbierasz bajta, jednym z pol obiektu ktory ma ta metode jest inny obiekt, implementtujacy jakis interfejs, no i wolasz ta metode. Gdy masz inna strategie, to pole jest ustawione na inny obiekt. I masz polimorfizm.

Z ta strategia to ja sobie zartowalem, bo pytania typu "if czy switch" uwazam za naprawde kiepskie.
Nie wiem czy dobrze mnie zrozumiales, ewentualnie czy dobrze ja zrozumialem Ciebie. Chodzi mi o to, ze korzystajac z wzorcow np. www.pasternacki.net/files/DP.pdf musialbym najpierw wykorzystac fabryke abstrakcyjna, a nastepnie strategie.

0

Żarty żartami, ale Strategia w tym wypadku może być bardzo przydatna. Naprawdę. Ewentualnie, skoro chodzi o wykonywanie różnych komend, mógłbyś użyć wzorca Polecenie. Przy czym różnica pomiędzy tymi dwoma wzorcami czasami się zaciera i bywa... ideologiczna.

I tak -- trzeba stworzyć fabrykę. Zwykle używa się po prostu metody wytwórczej. Przenosi to switcha (lub switche) do jednej metody. Sęk w tym, że to się przydaje, gdy masz wiele bardzo podobnych bloków warunków/switchy porozrzucanych po różnych metodach. Wtedy zastępujesz te warunki jednym, w metodzie wytwórczej. Resztę robi polimorfizm.

Skoro tu masz jeden blok warunków, to wprowadzanie tego jest IMO niezbyt opłacalne.

Jeśli potrafisz sprawnie refaktoryzować, to pewnie lepiej byłoby to olać i poczekać, aż te switche nam się rozmnożą, tj. aż gdzieś indziej w programie powstanie podobny switch. Wtedy wprowadzenie Strategii może się naprawdę opłacać. Teraz -- nie bardzo, a namnożyłoby nam klas. Sęk w tym, że do naprawdę sprawnej, bezpiecznej refaktoryzacji ekstremalnie przydatny (jeśli nie niezbędny) jest porządny zestaw automatycznych testów. A nie każdy takie coś pisze, delikatnie mówiąc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.