2013-09-23 85 views
2

所以我想知道什麼是最合適的方式來定義長度。現在,我使用的是這樣的正確的方法來定義長度

Coordinates(4.00 * Length.Millimeter, 5 * Length.Millimeter) 

我想知道我是否應該提取到像尋找一種方法來做到這一點太這個

getMillimeter(double value) return value; 
Coordinates(getMillimeter(4.00), getMillimeter(5.00); 

也Theres一個選項的方法呢? (我工作在C#)

Coordinates(4.00mm, 5.00mm) 

我明白你定義哪些事情是這樣的情境,但在不知道的情況下,哪種方法(或用什麼方法)似乎是最合適的方法?

*編輯 - 我只是想知道哪種方法最能緩解「幻數」代碼味道?現在我想製作一個新的長結構,因爲你是通過你的幻數爲實際的類專門爲它

回答

3

也Theres尋找一種方法來做到這一點太的選擇嗎? (我正在C#中工作)

C#中的內置單元沒有語言支持(與F#, which does support this不同)。

提取到一個Length類併爲您提供安全,雖然我通常會通過工廠方法做到這一點,即:

// Method defined as Coordinates(Length, Length), not using double directly 

Coordinates(Length.FromMillimeters(4.00), Length.FromMillimeters(5.00)); 

這使您可以輕鬆,安全地混合長度單位,即:

Coordinates(Length.FromMeters(0.004), Length.FromMillimeters(5.00)); 
+0

'Length.FromMillimeters(4.00)'似乎更意圖暴露,如被比作'4.00 * Length.Millimeter'。同時還支持.net慣例,例如'TimeSpan.FromHours' –

0

我肯定會的單元隔離改變功能是它自己的函數變量會做的伎倆。這樣它可以被重用,甚至可以在其他地方以最小的改變來改變實現。

0

提取物的方法,原因如下:

  • 可重用代碼跨您的應用程序
  • 更容易單元測試
  • 單一職責原則(SRP)
1

您可以創建自己的Length類來處理創建從給定單位的長度值,並轉換爲任何給定的單元該值:

public struct Length 
{ 
    private double millimeters; 

    public double Millimeters { get { return millimeters; } } 
    public double Meters { get { return millimeters/1000; } } 

    public static Length FromMillimeters(double value) 
    { 
     return new Length() { millimeters = value }; 
    } 
    public static Length FromMeters(double value) 
    { 
     return new Length() { millimeters = value * 1000 }; 
    } 
} 

您可以爲想要支持的任何單位添加創建/提取方法/屬性。

如果可能,您的Coordinates課程將接受兩個Length對象,而不是依賴於調用者只是「知道」通過的雙打應該以毫米爲單位。

0

您還可以,如果你想使事情閱讀使用和擴展方法更好一點:

public static class Extensions { 
    public static double MM(this double val) { return val; // or whatever } 
} 

它可以讓你寫這樣的代碼:

Coordinates(4.00.MM(), 5.00.MM()); 

這可以讀取好一點,但實際上並沒有賦予類型安全性(如F#)。

1

如果不知道4.00代表什麼,這個問題就沒有多大意義。

最重要的,如果你想擺脫幻數,那麼你使用常量:

const double DefaultXValue = 4.00; 
const double DefaultYValue = 5.00; 

然後你就可以撥打:

Coordinates(DefaultXValue, DefaultYValue); 

你的程序有一些默認的單元。這可能是毫米,英寸,弗朗,像素等等。如果默認單位是毫米,並且您想將毫米數值傳遞給函數,那麼就完成了。

但是,假設您的默認單位是毫米,並且您希望以英寸工作。然後,你寫的東西,如:

const double LengthInInches = 100; 

而你也有一個方法,InchesToMillimeters,即轉換英寸到毫米。也可能是另一種稱爲MillimetersToInches的方法。

所以,如果你想給的X,Y以英寸爲單位而不是毫米座標:

Coordinate(InchesToMillimeters(XInches), InchesToMillimeters(YInches));