2014-09-05 30 views
0

The question最近被問如果它是寫是否「儘管」有一項好的做法?

if ($user = $site->getUser($id)) { 
    // code 
} 

和答案是,以下將是更具可讀性的好做法:

$user = $site->getUser($id); 
if ($user) { 
    // code 
} 

這是一個很好的建議,但它不與while工作:

while ($record = $recordSet->fetchOne()) { 
    // code 
} 

如何重寫上面避開邪惡條件通過,分配新建分配FY?

+1

這不是*邪惡*本身,它是沒有意義的使出渾身解數,以避免不惜一切代價,即使它使你的代碼顯然*更糟*。 – deceze 2014-09-05 09:50:12

+1

正如在大多數情況下,經驗法則是好的,但絕對絕對值不好。大多數時候。 ;-) – Jon 2014-09-05 09:54:08

+0

@deceze爲什麼「顯然更糟糕」?我是唯一一個認爲在while循環中使用它是合法的,但不是在if語句中?真的,'while($ record)'是什麼意思?然而,'while($ x = fetch(...))'對我有一些清晰和直接的意義:「當我獲取結果時......」。這不僅僅是一個基於意見的Q/A嗎? – Sugar 2014-09-05 09:57:45

回答

0

經過一番考慮,我想我可以自己回答。帶分配的while本身並不壞,但可能表明設計問題。在大多數情況下,當你有類似while(foo = bar())的東西時,你實際上是迭代列表的東西,而迭代器應該這樣表示。也就是說,不是

while ($record = $recordSet->fetchOne()) { 
    // code 
} 

更好的是寫

foreach($recordSet as $record) { 
    // code 
} 

其中recordSet應該揭露迭代器接口。

同爲if情況:當(foo=bar())檢查的特殊條件,那麼最好將其明確寫入。

錯誤代碼:

if($user = $site->getUser()) { 
    // hello there 
} else { 
    // The Billion Dollar Mistake strikes again... 
} 

更好:

try { 
    $user = $site->getUser(); 
    // hello there 
} catch (UserNotFoundException $e) { 
    // $user does not exist 
} 
+0

爲什麼'if'必須*異常*? – deceze 2014-09-05 11:17:40

+0

至於'while',當然,你可以用'foreach(new RecordIterator($ records)..)'替換所有這些實例,但是PHP主要是因爲提供了一個「更原始的」API。 – deceze 2014-09-05 11:20:06

+0

@deceze:你說得對,我已經改變了措辭。 – georg 2014-09-05 11:25:16

1
$record = $recordSet->fetchOne(); 
while ($record) { 
    ... 

    $record = $recordSet->fetchOne(); 
} 

這顯然比while條件中的分配糟糕,所以才這樣做吧。避免它沒有真正的意義。

相關問題