2013-02-21 66 views
1

比方說,我有一個函數旋轉(浮動角度)。當我調用這個函數時,我可能不會記得這個函數是以角度還是弧度表示的。出於這個原因,我稱之爲這些RotateDegrees(浮點角度)函數。這更好,尤其是,如果我打電話給變量degAngle或radAngle。這樣,您可以立即看到代碼是否正確,而無需查看其他地方。爲不同的單位制作課程?

但是可能有更好的辦法!

爲什麼我不爲每個單位制作不同的課程?像

public class Degree 
{ 
    public float value; 

    public Degree (float value) 
    { 
     this.value = value; 
    } 
} 

和小時,公里,摩爾,光年等相同。

這樣就沒有歧義,我只需爲每個函數做一堆重載,或爲每個類定義轉換運算符。

但我從來沒有見過這樣的代碼。這在實踐中沒有用嗎?另外,我正在編寫的代碼對性能至關重要,會有什麼性能損失?

+2

爲什麼不使用一種度量單位來衡量一切,這樣你就不必擔心轉換(直到與用戶交互),並且將由於轉換(舍入,浮點限制)而導致的不準確性最小化? – Matthew 2013-02-21 03:12:23

+1

您應該考慮F#提供的有關度量單位的內容(http://blogs.msdn.com/b/andrewkennedy/archive/2008/08/29/units-of-measure-in-f-part-one-introducing- units.aspx)。我知道它是一種不同的語言,但它的語法相似。作爲一個c#dev,我發現F#是一個小的學習曲線。 – 2013-02-21 03:16:40

+0

來自MSDN的更多信息:http://msdn.microsoft.com/en-us/library/dd233243.aspx – 2013-02-21 03:17:41

回答

1

如果您的程序頻繁使用該特定單元,那絕對是一個好主意。

雖然你可能希望使它成爲一個結構而不是類。

例如,我喜歡使用百分比結構。它提高了可讀性,並有助於防止開發人員在50或0.5之間混淆以指示50%的問題。

作爲示例,請參閱.NET框架中的Unit structure,用於在處理Web相關大小時區分像素,百分比和點。

+3

並確保結構不可變! – 2013-02-21 03:19:27

+1

我也喜歡使用Percent類型。重載加法,以便你可以做(​​例如)value + = 10.Percent()'也很好。 :) – porges 2013-02-21 03:56:46

+0

@ Jesse爲什麼結構必須是不可變的?我仍然需要了解不可變類型,所以我不知道在這種情況下是否有一個特定的原因,或者我會找到一個通用的原因。 – NounVerber 2013-02-21 05:45:34

1

我不確定C#,但有一篇關於使用C++模板在編譯時強制執行單元的非常有名的文章。我找不到這篇文章,但jist是任何單位都可以被視爲基本度量權力的產物。因此,例如velocity =(length)^ 1 *(time)^ - 1。所以,你定義像

template <int lenPower, int timePower> 
class Unit { 
    double val; 
}; 

typedef meter Unit<1,0>; 
typedef second Unit<0,1>; 
typedef velocity Unit<1,-1>; 

然後你重載*和+運營商,以確保您只能添加兼容的單位和乘法產生一個單元用正確的權力,你已經強制在編譯時正確的單元操作。對不起,我不記得更多的細節,也找不到文章。谷歌的「模板元編程單元示例」將出現。也很抱歉,我正在談論C++。我知道C#支持泛型,所以類似的東西應該是可能的。

+0

在C++中,您可以使用值(例如1)作爲模板參數,這是C#中的通用參數無法做到的。在C#中的類型級別啓用單元安全性(並且我已經嘗試過!)並不可行。簡單的事情沒關係,但是你不能編碼像m * m/s * m = m^3/s這樣的東西。 – porges 2013-02-21 03:55:07