使用幻数是好习惯吗?

Is it good practice to use magic numbers?

提问人:omega 提问时间:2/10/2015 更新时间:2/10/2015 访问量:244

问:

我正在制作一个网络应用程序。在某些情况下,在服务器端,我正在进行 mysql 查询,我基本上说这意味着我将外键硬编码到另一个表。或者在客户端,我有一个带有单选字段的表单,输入字段值是表主键的 ID 号(例如 1、2、3)。where d.id=2

我想知道是使用这些“幻数”的好做法,还是我应该在查询中使用字符串值(需要连接)和表单中的字符串值作为输入值,然后我需要使用查询使用该字符串值获取 id。

似乎是两种方式,如果我需要编辑表行(更改主键值或字符串值),那么我将不得不更新客户端和服务器端的所有内容。

什么是好的做法?

谢谢

HTML SQL 与语言无关 编码样式

评论

0赞 Dan Bracuk 2/10/2015
对于您关于表单的问题,我更喜欢显示文本并提交 id 字段。
0赞 omega 2/10/2015
你能举个例子吗,我不明白你。

答:

2赞 Barmar 2/10/2015 #1

ID号通常由数据库任意分配(例如MySQL),它们只是时间的偶然。依赖它们并将它们硬编码到代码中通常是一个坏主意。相应的名称不太可能更改,因此,如果您必须对某些内容进行硬编码,这通常更安全。AUTO_INCREMENT

此外,硬编码 ID 会使代码更难理解。魔术数字对读者没有内在意义,但字符串是助记符。

评论

0赞 omega 2/10/2015
这似乎是正确的答案,但我的逻辑是,假设你在任何地方都使用字符串值,然后你决定更改数据库中记录的字符串值,那么你必须在任何地方更新它。例如,“红色”到“绿色”。我可以想象这种情况的发生,但看不到 id 何时会更改。您能解释一下为什么 id 值更有可能发生变化吗?
0赞 Barmar 2/10/2015
如果需要重新创建数据库,字符串不会更改,但 ID 可能会更改。
0赞 omega 2/10/2015
但是,如果您重新创建数据库,您可以轻松地添加 id 属性,并强制它相同?就像即使它的自动递增,你仍然可以添加 id 值,只要它当前是唯一的,它就会起作用。
0赞 Barmar 2/10/2015
是的,你可以,但这是一个额外的细节,你不应该担心。ID 本身不应具有任何特殊含义。
1赞 Dan Bracuk 2/10/2015 #2

这是格式化的评论。由于 omega 请求了一个示例,因此下面是一个使用 ColdFusion 语法的示例

<cfquery name="getChoices">
select choiceId, choice
from choices
</cfquery>

<form>
<cfoutput query = "getChoices">
<input type = "radio" name="theChoice" value = "#choiceID#">#choice#
</cfoutput>
<input type="submit>
</form>

请注意,cfoutput 标记会循环访问查询结果。