Coding standards: Dlouhé podmínky
- nanuqcz
- Člen | 822
Ahoj,
předem se omlouvám, že se toto nijak netýká Nette. Ale zajímal by mě
názor právě Nette programátorů.
Jakým způsobem zapisujete v PHP dlouhé podmínky? Napadá mě X možností, jak to napsat, namátkou:
// 1) Very long line
if (in_array($foo, $bar) && $user->isAllowed('do', 'something') && !$service->existsItem($itemId, $conditions)) {
$service->doSomething();
}
// 2) Separate lines version 1
if (in_array($foo, $bar)
&& $user->isAllowed('do', 'something')
&& !$service->existsItem($itemId, $conditions)) {
$service->doSomething();
}
// 3) Separate lines version 2
if (in_array($foo, $bar)
&& $user->isAllowed('do', 'something')
&& !$service->existsItem($itemId, $conditions))
{
$service->doSomething();
}
// 4) Separate lines version 3
if (in_array($foo, $bar)
&& $user->isAllowed('do', 'something')
&& !$service->existsItem($itemId, $conditions)
) {
$service->doSomething();
}
// 5) Separate conditions to another method
if ($this->shouldIDoSomething($foo, $bar, $itemId, $conditions)) {
$service->doSomething();
}
// ...
Nebo berete takovou podmínku jako známku špatně napsaného kódu a snažíte se to pak za každou cenu napsat jinak?
Díky za názory :-)
Editoval nanuqcz (5. 8. 2014 13:38)
- Jan Tvrdík
- Nette guru | 2595
Pokud možno snadno refaktorovat, tak refaktorovat, např tvoje (5) nebo
$inArray = in_array($foo, $bar);
$isAllowed = $user->isAllowed('do', 'something');
$exist = $service->existsItem($itemId, $conditions);
if ($inArray && $isAllowed && !$exist) {
$service->doSomething();
}
Jinak very long line, pokud není fakt příliš dlouhá (140+ znaků), kdy už nezbude nic jiného, než ho rozlámat. A to rozlámání mě obvykle tak sere, že se znovu pokusím o refaktoring =)
- llook
- Člen | 407
Dlouhým podmínkám by se měl člověk většinou vyhýbat, ale občas prostě není čas dělat věci pořádně…
Potom lámu a odřádkovávám a to už za první závorkou:
// 6) Separate lines version 4
if (
in_array($foo, $bar)
&& $user->isAllowed('do', 'something')
&& !$service->existsItem($itemId, $conditions)
) {
$service->doSomething();
}
Kritériem pro mě není tolik délka řádku, jako spíš složitost podmínky. Rozvětvenou podmínku kolikrát rozlámu, i když by byla na počet znaků celkem krátká:
if (
$jednaPodminka
&& (
$druhaPodminka
|| $tretiPodminka
)
) {
// ...
}