Jeśli chcesz, aby jakiś kod był wykonywany na podstawie dwóch lub więcej warunków, jaki jest najlepszy sposób sformatowania tej instrukcji if?
pierwszy przykład: -
if(ConditionOne && ConditionTwo && ConditionThree)
{
Code to execute
}
Drugi przykład: -
if(ConditionOne)
{
if(ConditionTwo )
{
if(ConditionThree)
{
Code to execute
}
}
}
co jest najłatwiejsze do zrozumienia i przeczytania, pamiętając, że każdy warunek może być długą nazwą funkcji lub czymś podobnym.
if-statement
formatting
language-agnostic
Guy Coder
źródło
źródło
Odpowiedzi:
Wolę opcję A
Jeśli masz szczególnie długie zmienne / warunki metod, możesz je po prostu podzielić
Jeśli są jeszcze bardziej skomplikowane, rozważałbym wykonanie metod warunkowych oddzielnie poza instrukcją if
IMHO Jedynym powodem dla opcji „B” byłoby posiadanie oddzielnych
else
funkcji do uruchomienia dla każdego warunku.na przykład
źródło
Inne odpowiedzi wyjaśniają, dlaczego pierwsza opcja jest zwykle najlepsza. Ale jeśli masz wiele warunków, rozważ utworzenie oddzielnej funkcji (lub właściwości) sprawdzającej warunki w opcji 1. To znacznie ułatwia odczytanie kodu, przynajmniej jeśli używasz dobrych nazw metod.
Jeśli warunki zależą tylko od lokalnych zmiennych zasięgu, możesz uczynić nową funkcję statyczną i przekazać wszystko, czego potrzebujesz. Jeśli jest mieszanka, podaj lokalne rzeczy.
źródło
isOkToDoWhatever
jako właściwości ma wiele sensu.if
czytelność instrukcji, ale raczej o czytelność warunków.Pierwszy przykład jest bardziej „czytelny”.
Właściwie, moim zdaniem powinieneś używać drugiego tylko wtedy, gdy musisz dodać jakąś „inną logikę”, ale dla prostego warunkowego użyj pierwszego smaku. Jeśli martwisz się długością warunku, zawsze możesz użyć następującej składni:
Powodzenia!
źródło
Pytanie zostało zadane i jak dotąd udzielono na nie odpowiedzi, tak jakby decyzja miała być podjęta wyłącznie na podstawie „syntaktycznej”.
Powiedziałbym, że prawidłowa odpowiedź na to, jak układasz szereg warunków w ramach if, powinna również zależeć od „semantyki”. Zatem warunki powinny zostać podzielone i pogrupowane według tego, jakie rzeczy idą ze sobą „koncepcyjnie”.
Jeśli dwa testy to tak naprawdę dwie strony tej samej monety, np. if (x> 0) && (x <= 100), a następnie umieść je razem w tej samej linii. Jeśli inny warunek jest koncepcyjnie znacznie bardziej odległy, np. user.hasPermission (Admin ()), a następnie umieść go w osobnej linii
Na przykład.
źródło
if ( ( single conditional expression A ) && ( single conditional expression B ) && ( single conditional expression C ) ) { opAllABC(); } else { opNoneABC(); }
Formatowanie wielu wyrażeń warunkowych w instrukcji if-else w następujący sposób:
a. wszystkie binarne operacje logiczne {&&, ||} w wyrażeniu pokazanym jako pierwszy
b. oba operandy warunkowe każdej operacji binarnej są oczywiste, ponieważ są wyrównane w pionie
c. operacje na zagnieżdżonych wyrażeniach logicznych stają się oczywiste za pomocą wcięć, podobnie jak instrukcje zagnieżdżania wewnątrz klauzuli
a. Pozwala to uniknąć typowych błędów analizy statycznej
pliku. wyłącz pojedyncze testy warunkowe za pomocą tylko //
b. ustaw punkt przerwania tuż przed lub po każdym indywidualnym teście
ceg ...
// disable any single conditional test with just a pre-pended '//' // set a break point before any individual test // syntax '(1 &&' and '(0 ||' usually never creates any real code if ( 1 && ( single conditional expression A ) && ( single conditional expression B ) && ( 0 || ( single conditional expression C ) || ( single conditional expression D ) ) ) { ... ; } else { ... ; }
źródło
Drugi to klasyczny przykład wzoru Arrow Anti, więc unikałbym tego ...
Jeśli twoje warunki są zbyt długie, wyodrębnij je do metod / właściwości.
źródło
Pierwsza jest łatwiejsza, ponieważ czytając ją od lewej do prawej otrzymujemy: „Jeśli coś ORAZ coś innego ORAZ coś innego TO”, co jest łatwym do zrozumienia zdaniem. Drugi przykład brzmi „Jeśli coś WTEDY jeśli coś innego WTEDY jeśli coś innego WTEDY”, co jest niezdarne.
Zastanów się również, czy chciałbyś użyć niektórych OR w swojej klauzuli - jak byś to zrobił w drugim stylu?
źródło
W Perlu możesz to zrobić:
Jeśli którykolwiek z warunków zawiedzie, będzie kontynuowany po zablokowaniu. Jeśli definiujesz zmienne, które chcesz zachować po bloku, musisz zdefiniować je przed blokiem.
źródło
Stoję przed tym dylematem od dawna i nadal nie mogę znaleźć odpowiedniego rozwiązania. Moim zdaniem jedynym dobrym sposobem jest najpierw spróbować pozbyć się warunków, aby nie porównywać nagle 5 z nich.
Jeśli nie ma alternatywy, to tak jak sugerowali inni - podziel ją na oddzielne i skróć nazwy lub pogrupuj je, a np. Jeśli wszystko musi być prawdziwe, użyj czegoś takiego jak "jeśli nie ma fałszu w tablicy x, a następnie uruchom".
Jeśli wszystko zawiedzie, @Eoin Campbell dał całkiem niezłe pomysły.
źródło
Kiedy stan jest naprawdę złożony, używam następującego stylu (przykład z życia w PHP):
Uważam, że jest ładniejszy i bardziej czytelny niż zagnieżdżanie wielu poziomów
if()
. W niektórych przypadkach, takich jak ten, nie można po prostu rozbić złożonego warunku na części, ponieważ w przeciwnym razie musiałbyś wielokrotnie powtarzać te same instrukcje wif() {...}
bloku.Uważam też, że dodanie „powietrza” do kodu jest zawsze dobrym pomysłem. Znacznie poprawia czytelność.
źródło