我们应该将测量单位放在属性名称中吗?

时间:2009-01-15 00:20:25

标签: naming-conventions

我认为我们大多数人都同意为变量,对象属性和数据库列使用描述性名称是个好主意。如果你想存储某些东西的名字,你也可以调用属性Name,以便人们知道要放入什么。

如果测量单位不是很明显,我认为您应该更进一步,并在名称中包含计量单位。例如,Length_mm应该有助于提醒开发人员,如果用户以英寸为单位输入长度,他们最好将长度转换为mm。

然而,我的数据库管理员告诉我,包括数据库列名称中的度量单位是“不赞成”。我认为这只是 nuts ,但也许有一些风险DBA知道我没有。

请问我一行,这里:我们应该在我们的属性名称中嵌入度量单位吗?为什么?为什么不?

15 个答案:

答案 0 :(得分:27)

如果您有一致的UOM,那么您的DBA政策就可以了。

例如,如果timepans总是在几分钟内等等

如果UOM可以更改,那么您应该将它存储在另一列中,与数量一起存储。

那就是说,我倾向于支持你。 Clarity胜过大多数事情,包括这个。我宁愿看{4}而不是DurationMinutes,也不得不猜猜UOM是什么。

答案 1 :(得分:6)

是。你应该。

正如@ [Charles Bretana]所指出的那样,关键是易读性,您桌子上的其他用户或跟随您的开发人员知道您正在使用的是什么。

我绝对会将单位/衡量标准纳入字段名称 - 在我的业务中,您无法猜测您可以从上下文或名称中找到什么:名为MarketValue的字段 - 是数百万,数千还是单位?美元,欧元,英镑,货币?这个值是一个百分比,一个比例?绝对还是相对?每日,每月,日历年,财政年度?那个时间戳,是什么时区?

提供数据时,您的第一个也是最后一个也是唯一的任务是确保不会错误地使用它,因为消费者无法找到足够的信息。作为开发人员,将“Meter”,“USD”,“GMT”,“PerCent”或其他任何东西扔进一个字段名称并不是一点点臭。

在野外命名的微小气味需要标准化之前,需要解决大量气味。

答案 2 :(得分:5)

这就是Mars Climate Orbiter以350米/秒的速度坠入水面的原因,计划只能处理350英尺/秒(或类似的东西)。

虽然“永远不会说'从不'或'永远'',一般来说,这是一个很好的经验法则,在这里我会弯曲我的规则并说我认为你应该”总是“清楚说明数值是什么单位in。

答案 3 :(得分:3)

我认为这是一个好主意,因为总是存在歧义的空间。

例如,我们使用高性能计时器类,我不得不检查GetElapsed()方法是否返回秒或毫秒或其他东西。如果它被称为GetElapsedMilliseconds(),可以避免混淆。

唯一的缺点是如果你想改变主意......但在这种情况下,任何客户都需要了解变化。

F#有一个有趣的转折,允许在类型系统中指定测量单位。请参阅此blog post,以及另一个讨论Are units of measurement unique to F#?

的stackoverflow问题

答案 4 :(得分:2)

以格式命名所有列的惯例:

{name}_in_{unit}

帮助了一个项目,因为我使用si units它实际上最终允许我能够推断列数据类型并且通常简化我的写作风格。

length_in_m
speed_in_ms-1
color_in_nm

我使用_at_time或number_of _:

处理了一些例外情况

started_at_time updated_at_time number_of_rotations

答案 5 :(得分:1)

  

如果测量单位不是很明显,我认为您应该更进一步,并在名称中包含计量单位。例如,Length_mm应该有助于提醒开发人员,如果用户刚刚输入英寸,他们最好将长度转换为mm。

您可以更进一步(在您的代码中,而不是在数据库中)并且具有长度类型,它负责测量单元和可能的转换。这是Martin Fowler的“分析模式”一书中“数量”模式的方法。

答案 6 :(得分:1)

请勿将测量单位(或列类型)放入数据库列名称中。

许多数据库都能够以某种方式记录/评论列(在SQL Server中它是sp_addextendedproperty),我建议这是一个更合适的地方。

答案 7 :(得分:1)

我已经做了很多数据库工作,我根本不会皱眉,也没有听说过皱眉。

这比扩展属性更好,这对于休闲开发者来说并不明显。它比单独的文档更好,因为许多开发人员不会阅读它们,当然也不会非常详细。如果设置了单位,那么在名称中使用它听起来是个好主意。如果更改,则添加单位字段时,更改测量字段的名称。

答案 8 :(得分:0)

我们不会将测量单位放在我们数据库中的列名中。但是,我们有一个数据字典文档,其中描述了所有列和关系。

答案 9 :(得分:0)

如果可能,理想的方法是使用不会对测量产生任何歧义的类型。例如,在.NET中,而不是说int periodInSeconds,使用TimeSpan period会更好。

F#语言实际上将度量单位作为类型系统的一部分,因此您可以以10<m/s>5<s>等单位声明类型,甚至可以对它们执行计算,例如{{1}会导致10<m/s> * 5<s>See here for more info

所以我想说如果可能的话使用一种表达你意图的类型,但如果不可能那么你应该将测量编码到名称中。它比评论更好,更明显。

答案 10 :(得分:0)

您肯定希望测量单位某处。我不知道列名是一个好地方还是架构更好。询问您的数据库管理员

  • 有关计量单位的信息在哪里?
  • 如何以编程方式访问单元?

如果答案是“它不是”或“你不能”,请痛苦地抱怨---他们没有权利拒绝你的命名惯例。否则,如果你在系统内工作,所有人都会更高兴。

P.S。我非常喜欢他们为F#投入的计量单位的支持。

答案 11 :(得分:0)

对于Python,更喜欢使用datetime包中的对象。这样做会将单位隐含性捕获到微秒分辨率。因此,没有基础将单位包含在变量名中。

如果您必须使用intfloat,强烈建议将单位名称缩写后缀为变量名称。例如,代替变量名diff,使用diff_secs表示秒,diff_ms表示毫秒,diff_µs表示微秒,或diff_ns表示纳秒。

答案 12 :(得分:-1)

我不得不说,我讨厌“描述性”变量名称变成“令人难以置信的冗长”变量名称。

我的首选替代方案是在短函数中仅使用度量单位名称。例如

function velocity(m, s) {
   return m/s;
}

您不需要说“length_m”,因为在这种情况下,很明显只有长度可以用米来衡量。

说完了。如果我正在编写一个测量单位错误非常危险的系统,我可能会使用类型系统并定义一个Length类,它总是将自身转换为标准单位以进行任何计算。甚至可能是Feet,Meters等不同的子类。

答案 13 :(得分:-3)

不,属性的名称与其计量单位分开。

如果你调用一个变量length_mm,那么你将被绑定为mm。

如果使用32位int存储length_mm,最终以mm为单位的长度可能会大于62,000,或者32位整数的限制。你不能切换到m因为你将长度变量绑定到length_mm。

答案 14 :(得分:-4)

我认为在您的标识符中添加单位是巨大的设计气味。这几乎肯定意味着你选择了错误的语言:如果单元对项目如此重要,你最好使用类型系统能够代表它们的语言。