2016-10-21 34 views
5

(Szukałem "else if range", ale nie znalazłem żadnych odpowiedzi na moje pytanie).Czy wykroczenie w instrukcjach if-then-else jest szkodliwe dla jawnie określających zakresy?

Podczas korzystania jeżeli .. elseif .. jeszcze wybrać co robić w oparciu o zmienną czym w pewnych (wzajemnie się wykluczają) waha się, lubię określić zakresy wyraźnie:

int num = 55; 
String message; 

if (num >= 20) { 
    // update message variable 
    message = "Bigger or equal to than 20"; 
} 
else if (10 <= num && num < 20) { 
    // update message variable 
} 
else if (0 <= num && num < 10) { 
    // update message variable 
} 
else if (num < 0) { 
    // update message variable 
} 

System.out.println(message); 

ale wszystkie podręczniki i notatki wykładowe widzę napisać taki przykład tak:

int num = 55; 
String message; 

if (num >= 20) { 
    // update message variable 
    message = "Bigger or equal to than 20"; 
} 
else if (num >= 10) { 
    // update message variable 
} 
else if (num >= 0) { 
    // update message variable 
} 
else { 
    // update message variable 
} 

System.out.println(message); 

rozumiem dlaczego oni upewnij się, aby użyć innego na końcu (czyli aby zapobiec kompilatora Javy od myślenia, że ​​zmienna jak wiadomo nie może uzyskać zainicjowany, jeśli zmienna była prymitywna), ale biorąc pod uwagę to wszystko podręczniki i notatki z wykładów pokazują inny styl, czy są jakieś problemy spowodowane wyraźnym zapisaniem zakresów dla wszystkich innych warunków, tak jak lubię?

Odpowiedz

2

Jeśli będę budował kod, który będzie działał na jakimś pojeździe, aby wylądować z sukcesem na innej planecie, zawsze będę pulchować dla klarowności. Pamiętaj, że wiersz kodu zostanie napisany raz, ale może być przeczytany setki razy. Twój pierwszy fragment będzie znacznie łatwiejszy do zrozumienia podczas sesji debugowania 4 rano.

Twoja pierwsza droga jest znacznie wyraźniejsza, a błędy nie zostaną wprowadzone, jeśli błędny reaktor zmieni kolejność kontroli warunkowych.

Zawsze kończyłem z } else {, najlepiej z jakimś dowodem, jeśli kontrola programu nie powinna tego osiągnąć.

+3

nie zgadzam się z części refactoring: Pierwsza wersja jest również bardzo podatne na refactoring błędów, trzeba upewnić się, że górna granica każdego zakresu jest dokładnie dolna granica następnego. –

+1

Myślę, że obawy podniesione w [odpowiedź Andy'ego Thomasa] (http://stackoverflow.com/a/40183548/5221149) są bardziej realistycznym problemem niż ktoś zmieniający kolejność instrukcji if-elseif-elseif. Wszystko na tyle głupi, aby zmienić konstrukcję, nie zdając sobie sprawy, że "inny" zależy od tego, czy "powinien" zostać zwolniony. – Andreas

7

Nie powtarzaj się.

Dzięki takiemu podejściu powtórzysz niepotrzebnie tę samą wartość dwukrotnie w kodzie. Ma to wiele wad, w tym:

  • Ułatwia wprowadzanie błędów podczas konserwacji, zmieniając jedną z wartości, ale nie inną.
  • Podczas wykonywania wykonuje kontrolę redundantną. Jeśli jesteś w wersji else if, już wiesz, że warunkiem wstępnym był błąd.
  • Kod jest dłuższy bez dodawania żadnych dodatkowych informacji. Trwa to dłużej, aby przeczytać i dłużej sprawdzać.

Późniejsza konserwacja może zmienić jedną z wartości, ale nie drugą, co prowadzi do pewnych zaskakujących zachowań.

if (num >= 30) { 
    // update message variable 
} 
else if (10 <= num && num < 20) { // Whoops! 
    // update message variable 
} 
... 

Można tego uniknąć, definiując stałą dla każdej wartości. Ale twój kod nadal określa nadmiarową kontrolę.

final int HIGH = 20; 
final int MEDIUM = 10; 
final int LOW = 0; 

if (num >= HIGH) { 
    // update message variable 
} 
else if (MEDIUM <= num && num < HIGH) { // We already know num<HIGH 
    // update message variable 
} 
... 
+0

Jak interesujące; Nigdy nie myślałem o problemie "późniejszego utrzymania". Wygląda więc na to, że każde podejście ma swoje zalety i wady. Zastanawiam się, czy istnieje branżowy standard, który może dać mi autorytatywne wskazówki? – silph

+1

@philph "późniejsza konserwacja" jest zawsze problemem w prawdziwym życiu. W szkolnym zadaniu może nie być, ale dobrze jest zacząć myśleć tak, jak jest. – Andreas

+0

@Andreas, ale widziałem przemyślenia produkujące nieopłacalny kod. Myślenie o późniejszej konserwacji często prowadzi do ideologii. Ideologia prowadzi do ślepego stosowania wzorców. – HopefullyHelpful