Co jest lepsze? Wiele poleceń if lub jedno poleceń if z wieloma warunkami

Do mojej pracy muszę opracować małą aplikację Java, która parsuje bardzo duże pliki XML (~300K linii), aby wybrać bardzo konkretne dane( za pomocą Pattern), więc staram się ją trochę zoptymalizować. Zastanawiałem się, co jest lepsze między tymi 2 fragmentami:

if(boolean_condition && matcher.find(string))
{
    ...
}

Lub

if(boolean_condition)
{
    if(matcher.find(string))
    {
        ...
    }
}

Więcej Szczegółów:

  • te polecenia if są wykonywane na każdej iteracji wewnątrz pętli (~20K iteracji)
  • boolean_condition jest boolean obliczane dla każdej iteracji przy użyciu funkcja zewnętrzna
  • Jeśli {[4] } jest ustawione na false, nie muszę testować wyrażenia regularnego dla dopasowania

Dzięki za pomoc

Author: 3rgo, 2011-03-10

8 answers

Jedna złota zasada, której przestrzegam to unikanie zagnieżdżania tak bardzo, jak tylko mogę. Ale jeśli jest to kosztem uczynienia mojego pojedynczego, jeśli warunek jest zbyt skomplikowany, nie mam nic przeciwko zagnieżdżeniu go.

Poza tym używasz operatora zwarcia &&. Więc jeśli wartość logiczna jest false, to nawet nie spróbuje dopasować!

Więc,

if(boolean_condition && matcher.find(string))
{
    ...
}

Jest droga!

 47
Author: adarshr,
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-12 13:52:06

Następujące dwie metody:

public void oneIf(boolean a, boolean b)
{
    if (a && b)
    {   
    }
}

public void twoIfs(boolean a, boolean b)
{
    if (a)
    {
        if (b)
        {       
        }
    }
}

Wyprodukuj dokładnie ten sam kod bajtowy dla ciała metody, aby nie było żadnej różnicy w wydajności, co oznacza, że jest to czysto stylistyczna sprawa, której używasz (osobiście wolę pierwszy styl).

 17
Author: Jonathan,
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-03-10 13:11:05

Obie drogi są w porządku, a drugi warunek nie będzie testowany, jeśli pierwszy jest fałszywy.

Użyj tego, który sprawia, że kod jest bardziej czytelny i zrozumiały. Dla tylko dwóch warunków pierwszy sposób jest bardziej logiczny i czytelny. Może już nie być z 5 lub 6 warunkami związanymi z &&, || i !.

 3
Author: JB Nizet,
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-03-10 13:04:51

Java używa zwarcia dla tych operatorów logicznych, więc obie odmiany są funkcjonalnie identyczne. Dlatego, jeśli boolean_condition jest false, nie będzie kontynuowane do dopasowania

Ostatecznie sprowadza się to do tego, że łatwiej jest czytać i debugować, ale głębokie zagnieżdżanie może stać się nieporęczne, jeśli skończysz z ogromną ilością szelek na końcu

Jednym ze sposobów, aby poprawić czytelność, jeśli warunek stanie się dłuższy, jest po prostu podzielić go na wiele linie:

if(boolean_condition &&
   matcher.find(string))
{
    ...
}

Jedynym wyborem w tym momencie jest to, czy umieścić & & i / /na końcu poprzedniego wiersza, czy na początku bieżącego.

 2
Author: Farrell,
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-03-10 13:10:30

Pierwszy. Staram się unikać zagnieżdżania się w ten sposób, myślę, że to kiepski styl/brzydki kod i & & będzie skracać i testować tylko z matcherem.find() jeśli wartość logiczna jest prawdziwa.

 1
Author: Robby Pond,
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-03-10 13:03:43

Pod względem wydajności są takie same.

  • ale nawet gdyby nie były

To, co prawie pewne, że zdominuje czas w tym kodzie, to matcher.find(string) ponieważ jest to wywołanie funkcji.

 1
Author: Mike Dunlavey,
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-03-10 17:17:10

Jeśli chcesz być zgodny z regułą sonaru squid:S1066 powinieneś zwinąć if, aby uniknąć ostrzeżenia, ponieważ stwierdza:

Zwijane polecenia " if " powinny być połączone

 1
Author: Petter Friberg,
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-03-27 15:44:26

Często widzę zbyt wiele & & i / / połączonych w logiczną zupę i często są źródłem subtelnych błędów.

Zbyt łatwo jest po prostu dodać kolejny & & lub / / do tego, co uważasz za właściwe i złamać istniejącą logikę.

Z tego powodu jako ogólna zasada staram się nie używać żadnego z nich, aby uniknąć pokusy dodawania kolejnych w miarę zmiany wymagań.

 0
Author: sm14,
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-30 13:42:28