2013-01-08 45 views
3

假設我有一個長而複雜的條件列表,爲了運行if語句,它必須是true。是否有一種更可讀的方式來製作&&陳述的長鏈?

if(this == that && foo != bar && foo != that && pins != needles && apples != oranges) 
{ 
    DoSomethingInteresting(); 
} 

通常情況下,如果我被迫做這樣的事情,我只是把每個語句在其自己的行,像這樣:

if 
(
     this == that 
    && foo != bar 
    && foo != that 
    && pins != needles 
    && apples != oranges 
) 
{ 
    DoSomethingInteresting(); 
} 

但我還是覺得這是一個有點一團糟。我很想if語句的內容重構爲自己的財產像這樣

if(canDoSomethingInteresting) 
{ 
    DoSomethingInteresting(); 
} 

但後來只是將所有的爛攤子到canDoSomethingInteresting()並沒有真正解決問題。

正如我所說,我的goto解決方案是中間的解決方案,因爲它不會像最後一個那樣混淆邏輯,並且比第一個更具可讀性。但是一定有更好的辦法!

例如,響應於Sylon的評論

bool canDoSomethingInteresting 
{ 
    get{ 
     //If these were real values, we could be more descriptive ;) 
     bool thisIsThat = this == that; 
     bool fooIsntBar = foo != bar; 
     bool fooIsntThat = foo != that; 
     return 
     (
       thisIsThat 
      && fooIsntBar 
      && fooIsntThat 
     ); 
    } 
} 
if(canDoSomethingInteresting) 
{ 
    DoSomethingInteresting(); 
} 
+1

是你的每個條件在邏輯上是不同的,還是有一些屬於一起?例如,結合你的條件的子集是否合理? –

+2

我不會考慮第三種解決方案混淆。如果方法名稱反映了它的作用,那麼IMO會使重要代碼更具可讀性。在我無法避免像這樣的條件邏輯的情況下,我使用類似於第二種排列條件的第三種解決方案。 (使其易於修補和調整) –

+0

它可以是我想的。我不是在解決一個具體的問題,而是尋找更多的模式或更好的思維方式。讓我們走最壞的情況,假裝它們在邏輯上是截然不同的,因爲這會帶來更大的複雜性。 –

回答

6

在我看來移動亂到屬性或方法並不壞主意。這樣它就是自包含的,並且您執行if(..)檢查的主要邏輯變得更具可讀性。特別是如果要檢查的條件列表很大,那麼最好是在一個屬性中,這樣如果您需要重新使用,那麼您不重複該檢查。

if(IsAllowed) 
{ 
    DoSomethingInteresting(); 
} 
+2

此外,它變成了自我記錄,方法名稱告訴(或者應該告訴)它做了什麼。 – hyde

+0

我必須承認,我有時會這樣做,而且我對代碼最終看起來非常滿意。然而,財產最終會變成什麼樣子?這是我的問題,它使得即時代碼更具可讀性,但只是掃描地毯下難以閱讀的代碼。 –

+0

那麼,如果你有一個巨大的檢查清單,並且你想簡化它,那麼你可能需要研究一些其他的重構形式 - 你的域對象是否可以被重新組織以使事情變得更簡單?或者可以用某種聲明式的AOP方式完成這種替代方式,即使用某些規則標記各種屬性的屬性,然後使用反射來檢查IsValid方法。這對於簡單驗證很有效。 [必需]公共字符串名稱; – lahsrah

0

方法很好。更好的方法名稱會告訴它測試的是什麼,而不是如果它是真的可以做什麼。像

if (isFooValid()) { mergeFoo(); } 

如果邏輯上也是合適的碼流,特別是如果如果在這一點上做或不該我不在乎,我也經常換整,如果一種方法:

maybeMergeFoo(); 

關鍵是要在心理上退後一步,看看最適合當前代碼的東西,以及接下來要寫的代碼。通常情況下,清楚組織代碼的正確方法是什麼。

1

在不同的變量中包含不同條件的代碼是提高可讀性和可維護性的好方法。當你的瓦爾命名好你

if (goToNextPage) 
{ 
    if (notAdmin) 
    { 
     RedirectToNormalPage(); 
    } 
    else 
    { 
     RedirectToAdminPage(); 
    } 
} 

相比,這樣的事情

if ((x == 1) && ((y == 'r') || (y == 't'))) 
{ 
    if (!a) 
    { 
     RedirectToNormalPage(); 
    } 
    else 
    { 
     RedirectToAdminPage(); 
    } 
} 

我將讓你選擇,你會想讀哪一個,當你回到你的代碼在以後的日子。

相關問題