Czy należy unikać używania instrukcji Java Label?

Dzisiaj miałem współpracownika sugerują i refactor mój kod, aby użyć instrukcji label do sterowania przepływem przez 2 zagnieżdżone dla pętli, które stworzyłem. Nigdy wcześniej ich nie używałem, ponieważ osobiście uważam, że zmniejszają czytelność programu. Jestem gotów zmienić zdanie na temat ich używania, jeśli argument jest wystarczająco solidny. Jakie są opinie ludzi na temat oświadczeń wytwórni?

 66
Author: Willmore, 2008-09-05

11 answers

Wiele algorytmów jest wyrażanych łatwiej, jeśli można przeskoczyć przez dwie pętle (lub pętlę zawierającą instrukcję switch). Nie przejmuj się tym. Z drugiej strony może to wskazywać na zbyt złożone rozwiązanie. Więc cofnij się i spójrz na problem.

Niektórzy wolą podejście "single entry, single exit" do wszystkich pętli. Oznacza to całkowite uniknięcie przerwania (i kontynuowania) i wczesnego powrotu do pętli. Może to spowodować duplikat kodu.

Czego bym zdecydowanie unikał działanie polega na wprowadzeniu zmiennych pomocniczych. Ukrywanie kontroli-przepływ wewnątrz stanu powoduje zamieszanie.

Dzielenie pętli znakowanych na dwie metody może być trudne. Wyjątki są prawdopodobnie zbyt ciężkie. Spróbuj jednego wejścia i jednego wyjścia.

 49
Author: Tom Hawtin - tackline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 19:03:10

Etykiety są jak etykiety goto: używaj ich oszczędnie i tylko wtedy, gdy przyspieszą Twój kod i, co ważniejsze, bardziej zrozumiałe,

Na przykład, jeśli jesteś w dużych pętlach sześć poziomów głęboko i napotykasz warunek, który sprawia, że reszta pętli nie ma sensu, aby zakończyć, nie ma sensu mieć 6 dodatkowych drzwi pułapki w instrukcjach stanu, aby wcześniej wyjść z pętli.

Etykiety (i goto) nie są złe, po prostu czasami ludzie używają ich w złym sposoby. Przez większość czasu staramy się napisać nasz kod, aby był zrozumiały dla Ciebie i następnego programisty, który się pojawi. Dokonywanie uber-fast jest drugorzędnym problemem (należy uważać na przedwczesną optymalizację).

Gdy etykiety (i goto) są niewłaściwie używane, sprawiają, że kod jest mniej czytelny, co powoduje smutek dla Ciebie i następnego dewelopera. Kompilator ma to gdzieś.

 32
Author: BIBD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 18:16:44

Jest kilka sytuacji, kiedy potrzebujesz etykiet i mogą być mylące, ponieważ są rzadko używane. Jeśli jednak musisz go użyć, użyj go.

BTW: to kompiluje i uruchamia.

class MyFirstJavaProg {  
        public static void main(String args[]) {
           http://www.javacoffeebreak.com/java101/java101.html
           System.out.println("Hello World!");
        }
}
 27
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-15 12:51:39

Jestem ciekaw, jaka jest Twoja alternatywa dla etykiet. Myślę, że jest to dość dużo będzie sprowadzać się do argumentu "return as early as possible" vs. " użyj zmiennej, aby utrzymać wartość zwracaną, i tylko return na końcu."

Etykiety są dość standardowe, jeśli masz zagnieżdżone pętle. Jedynym sposobem, w jaki naprawdę zmniejszają czytelność, jest to, że inny deweloper nigdy wcześniej ich nie widział i nie rozumie, co oznaczają.

 8
Author: Outlaw Programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 18:38:24

Nigdy nie widziałem etykiet używanych "in the wild" w kodzie Java. Jeśli naprawdę chcesz przełamać zagnieżdżone pętle, sprawdź, czy możesz refaktorować metodę tak, aby Instrukcja early return wykonała to, co chcesz.

Technicznie rzecz biorąc, nie ma dużej różnicy między wczesnym powrotem a etykietą. Praktycznie jednak prawie każdy programista Javy widział wczesny powrót i wie, co robi. Domyślam się, że wielu programistów przynajmniej by się zdziwiło etykietą i prawdopodobnie zdezorientowany.

Uczono mnie ortodoksji pojedynczego wejścia / pojedynczego wyjścia w szkole, ale od tego czasu doceniam wczesne deklaracje powrotu i wyłamywanie się z pętli jako sposób na uproszczenie kodu i uczynienie go jaśniejszym.

 5
Author: Don Kirkby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 21:17:20

Argumentowałbym za nimi w niektórych miejscach, uważam je za szczególnie przydatne w tym przykładzie:


nextItem: for(CartItem item : user.getCart()) {

  nextCondition : for(PurchaseCondition cond : item.getConditions()) {
     if(!cond.check())
        continue nextItem;
     else
        continue nextCondition;

  }
  purchasedItems.add(item);
}
 5
Author: Ceilingfish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 12:26:39

Myślę, że dzięki nowej pętli for-each etykieta może być naprawdę przejrzysta.

Na przykład:

sentence: for(Sentence sentence: paragraph) {
  for(String word: sentence) {
    // do something
    if(isDone()) {
      continue sentence;
    }
  }
}

Myślę, że wygląda to bardzo jasno, mając Etykietę taką samą jak zmienna w new for-each. W sumie może Java powinna być zła i dodawać implicit labels for-each variables heh

 5
Author: Pyrolistical,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 21:02:58

Użyłem pętli o nazwie Java do implementacji metody Sieve do znajdowania liczb pierwszych (wykonanej dla jednego z problemów matematycznych projektu Eulera), która sprawiła, że była 10x szybsza w porównaniu do zagnieżdżonych pętli. Na przykład jeśli (pewien warunek) wrócić do zewnętrznej pętli.

private static void testByFactoring() {
    primes: for (int ctr = 0; ctr < m_toFactor.length; ctr++) {
        int toTest = m_toFactor[ctr];
        for (int ctr2 = 0; ctr2 < m_divisors.length; ctr2++) {
            // max (int) Math.sqrt(m_numberToTest) + 1 iterations
            if (toTest != m_divisors[ctr2]
                        && toTest % m_divisors[ctr2] == 0) {
                continue primes; 
            }
        } // end of the divisor loop
    } // end of primes loop
} // method

Zapytałem programistę C++, jak złe są pętle, powiedział, że użyje ich oszczędnie, ale czasami mogą się przydać. Na przykład, jeśli masz 3 zagnieżdżone pętle i pod pewnymi warunkami chcesz wrócić do pętla zewnętrzna.

Więc mają swoje zastosowania, to zależy od problemu, który próbowałeś rozwiązać.
 5
Author: Selenia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 12:54:06

Nigdy nie używam etykiet w kodzie. Wolę utworzyć wartę i zainicjalizować ją na null lub inną nietypową wartość. Straż ta jest często obiektem wynikowym. Nie widziałem żadnego z moich współpracowników używających etykiet, ani nie znalazłem żadnego w naszym repozytorium. To naprawdę zależy od Twojego stylu kodowania. Moim zdaniem używanie etykiet zmniejszyłoby czytelność, ponieważ nie jest to powszechna konstrukcja i zazwyczaj nie jest używana w Javie.

 3
Author: Bartosz Bierkowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 18:43:36

Tak, należy unikać używania etykiet, chyba że istnieje konkretny powód ich używania(przykład uproszczenia implementacji algorytmu jest trafny). W takim przypadku radziłbym dodać wystarczające komentarze lub inną dokumentację, aby wyjaśnić to rozumowanie, aby ktoś nie pojawił się później i nie wymusił tego z jakiegoś pojęcia "ulepszenia kodu" lub "pozbycia się zapachu kodu" lub innej potencjalnie BS wymówki.

Przyrównałbym takie pytanie do decydując, kiedy należy LUB NIE należy używać trójnika if. Głównym uzasadnieniem jest to, że może to utrudniać czytelność i jeśli programista nie będzie bardzo ostrożny, aby nazwać rzeczy w rozsądny sposób, użycie konwencji, takich jak etykiety, może pogorszyć sprawę. Załóżmy, że przykład z 'nextCondition' i ' nextItem 'używał' loop1 'i' loop2 ' dla swoich nazw etykiet.

Osobiście etykiety są jedną z tych cech, które nie mają dla mnie większego sensu, poza Assembly czy BASIC i inne podobnie ograniczone języki. Java ma wiele bardziej konwencjonalnych / regularnych pętli i konstrukcji sterujących.

 1
Author: Jeremy Harton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-10 03:44:17

Uznałem, że etykiety są czasami przydatne w testach, aby oddzielić zwykłą konfigurację, ćwiczyć i zweryfikować fazy i grupować powiązane wyrażenia. Na przykład, używając terminologii BDD:

@Test
public void should_Clear_Cached_Element() throws Exception {
    given: {
        elementStream = defaultStream();
        elementStream.readElement();
        Assume.assumeNotNull(elementStream.lastRead());
    }
    when:
        elementStream.clearLast();
    then:
        assertThat(elementStream.lastRead()).isEmpty();
}

Twoje opcje formatowania mogą się różnić, ale główną ideą jest to, że etykiety, w tym przypadku, zapewniają zauważalne rozróżnienie między logicznymi sekcjami składającymi się na twój test, lepiej niż komentarze. Myślę, że Biblioteka Spock opiera się właśnie na tej funkcji, aby zadeklarować swoje fazy testowe.

 0
Author: polaretto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 13:48:59