2011-07-25 110 views
1

我注意到這一段代碼使用笨數據庫遷移:這句法正確嗎?

$this->migrations->verbose AND print "Creating table '{$table}'..."; 

$verbose是一個配置值。

我們不得不在辦公室這個是否是有效的,可讀的代碼的辯論。它基本上取代了IF語句的需要,因爲如果第一部分是真的,它執行條件的第二部分。其實我挺喜歡,但是在辦公室的人認爲這是一個意外,它的作品,並且這將是更具可讀性:

if($this->migrations->verbose) print "Creating table '{$table}'..."; 

你覺得呢?

+0

我會避免這種情況,因爲在很多語言中,不能保證AND將從左到右進行評估。所以即使它在這裏完全正常工作,它的邏輯並不普遍。 – Luke

+0

@Luke,在我知道的大多數語言中都有這樣的保證,而且PHP絕對是其中的一種:) – Paulpro

+0

我知道,很明顯,這在PHP中是真實的,但在概念上並不帶有這種保證。 – Luke

回答

2

這就是所謂的「短路求」,並且該技術在shell腳本中經常使用的 - 例如:

rm thing_to_delete || exit 1 

它在某些語言比其他人更常見,很多人都看它是應該避免的事情,因爲它可能會令人困惑。 (人們通常認爲邏輯表達式沒有副作用)。

0

邏輯運算符是短路和評估操作數由左到右,所以這個代碼正是什麼版本if聲明。

這是一個完全有效的代碼,如果你有好的開發商應該也讀他們所有人。如果它在團隊中造成混亂,那就不要使用它,但是最好教他們實際上做了什麼。

1

它是有效的,但它肯定是不可讀的。我不認爲嘗試將Perl風格的語法結構引入到PHP中,即使它們有效,也是一個好主意。

1

這絕對有效。它的可讀性是否純粹是主觀的。 :)

1

「這在語法上是正確的嗎?」

當然是:)否則PHP會給你解析錯誤。該代碼的作品,也是語義正確的PHP。這很像使用:$v = $v || "default value";如果還沒有一個,則將默認值分配給$v

1

所以,雖然這兩個片段有同樣的效果,我強烈第二(if (…) print ...)投票。代碼是關於與其他程序員進行溝通的信息。如果語言的習語(以及程序員使用它)在這種情況下使用短路評估,那麼它可能會很好。但是,PHP通常不會在語句中使用短路評估 - 大多數PHP程序員(實際上,一般程序員)都會在這裏採取雙重措施。

代碼至少驚喜,代碼的確切含​​義。如果這是一個條件測試,只有在某些變量爲真的情況下才應該執行,那麼使用條件測試構造將其作爲一個真實的條件測試 - 也就是在這裏,if

0

如果可讀性代碼的肖像,以什麼樣的代碼實際上做的,然後使用if更具有可讀性的自然語言描述。