Coding standards: Dlouhé podmínky

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
nanuqcz
Člen | 822
+
0
-

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
+
+4
-

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 =)

Grelek
Člen | 233
+
0
-
if (in_array($foo, $bar) &&
	$user->isAllowed('do', 'something') &&
	!$service->existsItem($itemId, $conditions)) {
	$service->doSomething();
}

Já jsem si zvykl na tohle. Chápu ale, že to někomu může připadat strašně nečitelné. :)

Editoval Grelek (5. 8. 2014 15:06)

Filip Procházka
Moderator | 4668
+
0
-

Používám 4 a 5, nebo jejich kombinaci.

llook
Člen | 407
+
+4
-

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
    )
) {
    // ...
}