TL; DR-我正在尝试设计一种最佳的数据结构,以定义度量单位内的单位。
A Unit of measure
本质上是value
与关联的(或数量)unit
。 SI单位有七个基准或尺寸。即:长度,质量,时间,电流,温度,物质量(摩尔)和发光强度。
这足够简单,但是我们经常使用许多派生单位和费率。示例组合单位为牛顿:kg * m / s^2
示例比率为tons / hr
。
我们的应用程序严重依赖隐含单位。我们将把单元嵌入变量或列名中。但这在我们需要指定具有不同单位的度量单位时会产生问题。是的,我们可以在输入和显示时转换值,但这会生成很多开销代码,我们希望将其封装在自己的类中。
在Codeplex和其他协作环境上有许多解决方案。项目的许可是可以接受的,但是项目本身通常最终会变得太轻或太重。我们正在追逐自己的“正当”独角兽。
理想情况下,我可以使用以下方法定义新的度量单位:
UOM myUom1 =新的UOM(10伏);
UOM myUom2 =新的UOM(43.2,牛顿);
当然,我们会根据客户的需求混合使用英制和SI单位。
我们还需要使这种单位结构与将来的数据库表保持同步,以便我们也可以在数据中提供相同程度的一致性。
定义创建计量单位类别所需的单位,派生单位和费率的最佳方法是什么?我可以看到使用了一个或多个枚举,但这对于其他开发人员可能会感到沮丧。一个单一的枚举包含200多个条目,将是巨大的,而基于SI与英制单位的多个枚举可能会造成混淆,而基于单位本身的分类的其他细分可能会造成混淆。
枚举示例显示了我的一些担忧:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
我们正在使用的单位集非常明确,而且空间有限。当我们有客户需求时,我们确实需要能够扩展和添加新的派生单位或费率。尽管我认为更广泛的设计方面适用于多种语言,但是该项目使用C#。
我看过的一个库允许通过字符串自由输入单位。然后,他们的UOM类解析该字符串,并相应地添加内容。这种方法的挑战在于,它迫使开发人员思考并记住正确的字符串格式是什么。如果我们不在代码内添加其他检查以验证在构造函数中传递的字符串,则会冒运行时错误/异常的风险。
实质上,另一个库创建了太多开发人员必须使用的类。随着等效值单位它提供了一个DerivedUnit
和RateUnit
等。本质上,对于我们要解决的问题,代码过于复杂。该库实际上允许任何组合(在单位世界中是合法的),但是我们很高兴通过不允许所有可能的组合来扩大问题范围(简化代码)。
其他库非常简单,甚至都没有考虑过运算符重载。
另外,我也不担心尝试进行错误的转换(例如:伏特到米)。开发人员是目前唯一可以在此级别访问的人员,我们不一定需要防止这些类型的错误。