在我工作的公司,最近有一項要求,即所有'高度可見'的布爾邏輯必須以析取範式表示。爲什麼在析取範式中表示代碼很重要?
因此,例如,(雖然這個概念是與語言無關),
#if (defined(A) || defined(B)) || (defined(C) && defined(D))
不得不被替換爲:
#if defined(A) || (defined(C) && defined(D)) || defined(B)
什麼是強制要求密碼的動機在這中表達方式?有什麼優勢?
在我工作的公司,最近有一項要求,即所有'高度可見'的布爾邏輯必須以析取範式表示。爲什麼在析取範式中表示代碼很重要?
因此,例如,(雖然這個概念是與語言無關),
#if (defined(A) || defined(B)) || (defined(C) && defined(D))
不得不被替換爲:
#if defined(A) || (defined(C) && defined(D)) || defined(B)
什麼是強制要求密碼的動機在這中表達方式?有什麼優勢?
好處是,在代碼庫中的任何地方以規範化/標準化的形式表達這樣的邏輯將(理論上)使程序員更容易理解和維護它。
沒有這樣的規則,一些程序員傾向於試圖「優化」一個表達式,這樣維護人員很難將其解開。另外,如果需要,通用表單可以更容易地組成新表達式。
(這些優勢是值得商榷的。與任何風格指引,有一致的規律可循比超過其替代一個規則的選擇更重要。)
雖然你的例子是非常差(兩個表達式都在DNF中),我明白爲什麼有人會強加這個政策。
任何常規形式的優點是所有表達式現在都具有相同的形式。在DNF中,這種形式是一個條款/條件列表,其中一個必須是真實的。這些條款反過來是文字/條件列表,每一個都必須是真實的。
DNF特別具有的優點是在大多數的語法,和的優先級高於或,和不具有更高的優先級,所以DNF需要比CNF括號較少和省略括號不是錯誤。
很多時候,您擁有的編碼標準並不像持續實施它們那麼重要。一貫地編寫代碼大大提高了可讀性,很多時候決定挑選哪些代碼的人都在行使個人喜好,而不是編寫智慧。
假設您列出的標準實際上有幫助。我想說大多數人不會意識到運算符的運算符優先級高於||。所以在運算符和操作數週圍使用()可以使事情更加明確。
一定要記住,在許多語言中,如果可以在計算一個操作數之後確定表達式的值,則可能不會執行布爾表達式的兩個操作數。如:
1:(trueMethod()|| falseMethod())
2:(falseMethod()|| trueMethod())
在情況下,一個僅trueMethod()被執行。但在案例2中,兩種方法都被執行。訂單可以有很大的不同。
這兩個表達式都是DNF;第一個只是有一些多餘的括號。這是您的編碼指南中的一個實例嗎? –
該示例來自最近一封電子郵件鏈,它要求根據DNF進行更改。對錯誤表示歉意,因爲這確實是一個不好的例子。 –