2011-10-16 64 views
0

我認爲這是相當語言無關的,但如果我錯了,那麼去C#(或C或C++)。如何處理「簡單」魔法值?

用 「簡單」 魔力值,我的意思是這樣的事情:

if (Value > 0) 

while (Value < 0) 

while (MyQueue > 0) 

在寫本(上面的僞代碼)還挺讓我感到它確實只適用於與0相比的東西。

無論如何,處理這些魔法值的最佳方式是什麼(考慮可讀性,創建鍵名/鍵盤/代碼的數量)?

感覺就像極端的矯枉過正有一個完整的(靜態)類(或枚舉,在C#中)專用於此。

+1

魔術數字並不是他們需要輸入多少個字符,而是他們的意思 - 它們在上下文中是否顯而易見並且是不變的。 – delnan

+0

取決於這些幻數是否改變。例如:如果您想檢查隊列是否爲空,並且將隊列長度與0進行比較,則不必封裝0,因爲空隊列總是具有長度0.可以調整的參數值應該封裝在內部一個Enum/Class等等。如果你有一些複雜的條件,比如「如果隊列中沒有紅色的項目,這個隊列是空的」,寫一個像isEmpty(MyQueue)這樣的幫助函數。 – sled

+0

是的,就像我寫的那樣,它真的只適用於你將一些東西(比如隊列!)與0進行比較,檢查列表/等中的長度/對象。 –

回答

1

某些數字根據其上下文僅被視爲「幻數」。有些用法體現了一個簡單的概念,與數字的具體價值無關。例如,如果你想檢查是否列表不爲空,你可能會寫下面的語句之一:

if (list.Count != 0) 

if (list.Count > 0) 

if (list.Count >= 1) 

無論0也不1已經超越「沒什麼」和「東西」,所以上述任何意義三個陳述應該被解讀爲「不是什麼」,「多餘」和「至少是某種東西」,因此我不會稱他們的用法爲「神奇數字」。可能還有其他方法可以執行此類檢查而不使用任何數字。例如,在C#中,你可以使用LINQ Any操作:

if (list.Any()) 

我覺得這是更具描述性,使代碼的故事般的可讀性。其他語言可能有其他設施來表達概念,如'沒有','東西','空集','非空集'等。

1

由於Allon Guralnek聲明我也會使用Any()擴展方法來檢查某個集合是否包含項目。您也可以編寫額外的擴展方法,如

public static class MyExtensions { 
    public static bool IsNegative(this int number) { 
    return number < 0; 
    } 

    public static bool IsPositive(this int number) { 
    return number > 0; 
    } 
} 

,然後寫你的循環或條件

if (Value.IsPositive()) 
while (Value.IsNegative()) 
while (MyQueue.IsPositive()) 

假設值和myQueue中是int類型。

+0

這實際上是一種利用擴展方法的好方法! +1爲你:) –

+0

我實際上建議不要將代碼中最簡單和不可分割的部分包裝到擴展方法中。任何級別的軟件開發人員都會理解'value> 0',並且沒有需要在那裏替換的幻數。這些方法只會添加一個只會模糊不清的附加圖層,並且會污染每個整數的IntelliSense列表。儘管如此,將計算出的屬性添加到自己的類中是非常可接受例如,您可以將IsEmpty,HasItems或IsActive屬性等添加到您的類中。 –