2009-12-21 58 views
2

我正在幫助我的朋友開發單位轉換器。他問我是否可以幫忙分工。所以我正在製作一個名爲Unit的.dll。單位應該處理轉換。我正在集思廣益如何做到這一點,我想出了一個想法,把每個部分都列舉一個枚舉(比如枚舉Angle [Degrees,Radians,Gradians],枚舉Area [平方米,平方英里,...],enum Energy [牛頓,帕斯卡,焦耳,...],...)。然後,主抽象類股與所有的轉換方法
注:
要求你編寫的.dll文件,我只是希望你對如何意見,使該.dll。幫助抽象類/類/接口結構單元

+0

我一直在致力於開發一個可擴展庫來處理數量的開源項目。它不是完整的,我已經有幾種方法可以使用泛型來簡化操作,但我已經仔細考慮瞭如何將我的類設置爲可擴展且易於使用,同時堅持使用.NET標準。它在某些生產守則中已經以有限的能力使用。你可以在github上查看它:http://github.com/togakangaroo/GIM.Quantities – 2009-12-21 23:25:26

回答

2

當你有這樣的多對多關係時(每個值都希望能夠被轉換成同類中的其他類型的值)時,需要注意的一點是,最終你會寫一噸如果您使用強制方法爲每種可能性編寫轉換函數,都可以使用這些方法。

如果您需要儘可能快地工作並希望確保您的錯誤得到控制,但這樣做可行,但代碼可維護性受損。

我過去在許多單元之間進行轉換時所做的一些事情是建立一個「基本」單元,所有單元都可以轉換並編寫函數以轉換爲/從該單元轉換。這讓你定義一個接口是這樣的:

interface IUnitConverter<T, U> { 
T ToBaseUnit(); 
void FromBaseUnit(T BaseValue); 
U MyValue {get;} 
} 

,並專注,對於某些類型的轉換:

class RadiansConverter : IUnitConverter<DegreesConverter, float> { 
float radians = 0; 

DegreesConverter ToBaseUnit() {...} 
void FromBaseUnit(DegreesConverter BaseValue) {...} 
float MyValue {get {return radians;}} 
} 

編輯:用法:

// assume we have a constructor that sets the private value 
float degrees = new RadiansConverter(Math.PI).ToBaseUnit().MyValue; 
float radians = new RadiansConverter().FromBaseUnit(degrees).MyValue; 

這可能有點重量級和你必須注意錯誤的傳播打擊你兩次轉換,而不是一次。當我需要進行復雜的需要狀態存儲的GIS轉換時,它已經派上用場了,但它可能不是您正在尋找的內容。

0

爲什麼一個.dll?

  • 你有ň套敞篷單位:角度,能源,面積,溫度,等等。
  • 在每個集合中,您都有x可能的單位:角度內的度數,弧度和梯度。

在這一集的X單位,你(如果我記得我的數學右)X!可能的轉換,這在x = 3時不成問題,但對於區域有點困難,您可以在其中有平方毫米,釐米,米,英寸,英尺,碼,鏈,弗朗或英里,作爲公頃和英畝,這不需要去維基百科查看任何更隱晦的東西。 11!可能的轉換不足4000萬。

我會試圖對每個n套可轉換單元和每個單元內的一個.dll(或更具體地說一個類,並且可能將所有類放在相同的.dll中)。dll將所有內容都通過一個標準單元進行轉換,這樣您就可以在每次轉換時運行一個或兩個轉換計算(例如,將所有輸入轉換爲平方米然後再次轉出),而不是編碼每個可能的組合。二十個轉換聽起來像是一個比四千萬更快的開發任務:-)

我肯定會建議枚舉而不是自由字符串文字的單位描述,因爲這將使類更容易爲您的朋友使用,和整齊地公開可用轉換的選項。

我想不出一個很好的方式讓所有的類都實現相同的接口,因爲每次轉換都需要枚舉類型的兩個參數(from和to),並且每個類的枚舉類型都會不同。泛型可能會提供一個更清晰的解決方案,但我現在看不到 - 其他人在我輸入的時候已經回答了,但我還沒有讀到答案。

1

我寧願像一個設計:

var measure = Angle.FromDegrees(10); 
Console.Write(measure.ToRadians()); 

只需從編碼可用性的角度來看我沒有看到任何安慰添加枚舉。

這將是相似的,例如,如何在框架中實現TimeSpan。

+0

現在你提到它,我也更喜歡它。這會教會我雙腳跳躍時,我應該睡覺,而不是! – Xav 2009-12-22 12:05:25