【问题标题】:Is it good practice to use magic numbers?使用幻数是一种好习惯吗?
【发布时间】:2015-02-10 01:41:18
【问题描述】:

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

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

这似乎是双向的,如果我需要编辑表行(更改主键值或字符串值),那么我必须更新客户端和服务器端的所有内容。

什么是好的做法?

谢谢

【问题讨论】:

  • 关于表单的问题,我更喜欢显示文本并提交 id 字段。
  • 你能举个例子吗,我不明白。

标签: html sql language-agnostic coding-style


【解决方案1】:

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

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

【讨论】:

  • 这似乎是正确的答案,但我的逻辑是,假设您在任何地方都使用字符串值,然后您决定更改数据库中记录的字符串值,那么您必须更新它无处不在。例如,“红色”到“绿色”。我可以想象这种情况正在发生,但看不到 id 何时会改变。你能解释一下为什么 id 值更容易改变吗?
  • 如果您需要重新创建数据库,字符串不会更改,但 ID 可能会更改。
  • 但是如果你重新创建数据库,你可以很容易地添加 id 属性,并强制它是一样的吗?就像即使它是自动递增的,你仍然可以添加 id 值,只要它当前是唯一的,它就可以工作。
  • 是的,您可以,但这是您不必关心的额外细节。 ID 本身不应有任何特殊含义。
【解决方案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 标签会循环查询结果。

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 2019-03-06
    • 2013-03-30
    • 2015-09-02
    • 2017-11-23
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多