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
jestboolean
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
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!
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).
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 !
.
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.
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.
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.
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
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ń.
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