Kiedy należy zastosować zastępczą (klasyczną) instrukcję switch? Czy takie użycie jest zalecane i zalecane, czy należy tego unikać za wszelką cenę?
switch-statement
shabunc
źródło
źródło
Odpowiedzi:
Oto przykład, w którym byłoby to przydatne.
Wydaje mi się, że tego rodzaju rzeczy (gdzie jeden przypadek obejmuje drugi), są raczej rzadkie i dlatego niektóre nowsze języki albo nie pozwalają na awarię, albo wymagają specjalnej składni.
źródło
// INTENTIONAL FALL THROUGH HERE
komentarza wielkimi literami.GetItemsForLevel(Info)
wywołując wywołanieGetItemsForLevel(Warning)
i tak dalej.Używam ich, gdy pewne funkcje muszą być zastosowane dla więcej niż jednej wartości. Załóżmy na przykład, że masz obiekt o właściwości o nazwie operationCode. Jeśli kod jest równy 1, 2, 3 lub 4, chcesz uruchomićOperationX (). Jeśli jest to 5 lub 6, chcesz uruchomićOperationY (), a 7 - startOperationZ (). Dlaczego masz 7 kompletnych skrzynek z funkcjonalnością i przerwami, kiedy możesz skorzystać z awariów?
Myślę, że jest całkowicie poprawny w pewnych sytuacjach, szczególnie jeśli unika 100 instrukcji if-else. =)
źródło
switch
wielokrotnośćcase
powiązana z tym samym kodem. Różni się to od upadku, w którym wykonanie jednegocase
trwa do następnego z powodu brakubreak
między nimi.Używam ich od czasu do czasu, myślę, że zawsze jest to właściwe użycie - ale tylko wtedy, gdy jest dołączone do odpowiedniego komentarza.
źródło
Przypadki wypadania są w porządku. Często stwierdzam, że wyliczenie jest używane w wielu miejscach i że gdy nie trzeba rozróżniać niektórych przypadków, łatwiej jest zastosować logikę awaryjną.
Na przykład (zwróć uwagę na komentarze wyjaśniające):
Uważam, że tego rodzaju użycie jest całkowicie akceptowalne.
źródło
case X: case Y: doSomething()
icase X: doSomething(); case Y: doAnotherThing()
. W pierwszym przypadku intencja jest dość wyraźna, w drugim zaś upadek może być celowy lub nie. Z mojego doświadczenia wynika, że pierwszy przykład nigdy nie uruchamia żadnych ostrzeżeń w kompilatorach / analizatorach kodów, podczas gdy drugi tak robi. Osobiście nazwałbym drugi przykład tylko „wpadnięciem” - nie jestem jednak pewien co do „oficjalnej” definicji.To zależy od:
Dwa główne problemy związane z przejściem jednej sprawy do drugiej to:
To uzależnia Twój kod od kolejności instrukcji case. Nie dzieje się tak, jeśli nigdy się nie przewrócisz, a to powoduje, że stopień złożoności jest często niepożądany.
Nie jest oczywiste, że kod dla jednej sprawy zawiera kod dla jednej lub więcej kolejnych spraw.
Niektóre miejsca wyraźnie zabraniają wpadania. Jeśli nie pracujesz w takim miejscu i jeśli czujesz się swobodnie z praktyką, i jeśli złamanie tego kodu nie spowoduje żadnego prawdziwego cierpienia, może to nie być najgorsze na świecie. Jeśli to zrobisz, pamiętaj o umieszczeniu przyciągającego uwagę komentarza w pobliżu, aby ostrzec tych, którzy przyjdą później (w tym ciebie przyszłego).
źródło
Oto szybki (co prawda niekompletny (bez specjalnego obchodzenia roku przestępnego)) przykład upadku, który upraszcza moje życie:
źródło
Jeśli czuję potrzebę przechodzenia od jednej sprawy do drugiej (co rzadkie, co prawda), wolę być bardzo wyraźny i
goto case
, oczywiście, zakładając, że twój język to obsługuje.Ponieważ wpadanie jest tak rzadkie i bardzo łatwe do przeoczenia podczas czytania kodu, uważam, że właściwe jest, aby być wyraźnym - a goto, nawet jeśli jest to przypadek, powinno wyróżniać się jak obolały kciuk.
Pomaga to również uniknąć błędów, które mogą wystąpić podczas zmiany kolejności instrukcji case.
źródło