2013-02-19 52 views
7

我正在將一些代碼遷移到PSR-2標準。在我的代碼中,我有if語句多行作爲表達式:Long if語句和PSR-2

if ( $field->getBlockMode() == FieldInterface::BLOCK_MODE_HIDEVAR && 
     !isset($this->enabledBlocks[$field->getBlock()]) 
) { 

} 

寫這樣的表達式的最佳做法是什麼?

+1

喜歡,但你想要的。建議使測試語句縮短:無論您如何編寫測試語句,都將無法閱讀。 – KingCrunch 2013-02-19 14:42:06

+0

問題是,如果「if(」空格不允許,所以我不能將表達式設置爲與以下相同的hoirizobntal位置。並且據我瞭解,我無法在「if(」ether。 – Johni 2013-02-19 14:44:51

回答

17

如何使其成爲一個班輪,以避免這一問題,使表述更加可讀:

$blockModeIsHidevar = $field->getBlockMode() == FieldInterface::BLOCK_MODE_HIDEVAR; 
$blockNotEnabled = !isset($this->enabledBlocks[$field->getBlock()]); 

if ($blockModeIsHidevar && $blockNotEnabled) { 

} 

備選:

我通常用的方法去做,這可能 looke像這樣:

if ($this->blockModeIsHidevar($field) && $this->blockNotEnabled($field)) { 

} 
// ... 
private function blockModeIsHidevar($field) 
{ 
    return $field->getBlockMode() == FieldInterface::BLOCK_MODE_HIDEVAR 
} 
private function blockNotEnabled($field) 
{ 
    return !isset($this->enabledBlocks[$field->getBlock()]) 
} 

這樣,優化&&仍然發生。

+0

這不會影響性能嗎? – Johni 2013-02-19 14:46:54

+0

如果第二個條件在第一個條件爲false時沒有得到評估,您可以將檢查提取到方法/函數而不是變量。 – 2013-02-19 14:48:39

+0

+1。看起來你跟我說的幾乎一樣 – SDC 2013-02-19 14:50:24

4

首先將其解壓縮爲較短的布爾表達式,然後在if()語句中使用這些變量。

即:

$hideVarMode = $field->getBlockMode() === FieldInterface::BLOCK_MODE_HIDEVAR; 
$enabledBlock = !isset($this->enabledBlocks[$field->getBlock()]; 
if($hideVarMode && $enabledBlock) { 
    .... 
} 

(注意,我也把你的第一個測試到三相等,因爲這很可能是更好的;隨意更改回來,如果不爲你工作)