什么是神奇数字?为什么有些人认为它们不好?

2024-01-26

什么是神奇数字?

为什么许多程序员建议避免使用它们?


幻数是在代码中直接使用数字。

例如,如果您有(在 Java 中):

public class Foo {
    public void setPassword(String password) {
         // don't do this
         if (password.length() > 7) {
              throw new InvalidArgumentException("password");
         }
    }
}

这应该重构为:

public class Foo {
    public static final int MAX_PASSWORD_SIZE = 7;

    public void setPassword(String password) {
         if (password.length() > MAX_PASSWORD_SIZE) {
              throw new InvalidArgumentException("password");
         }
    }
}

它提高了代码的可读性并且更易于维护。想象一下我在 GUI 中设置密码字段大小的情况。如果我使用幻数,每当最大大小发生变化时,我都必须在两个代码位置进行更改。如果我忘记了一个,这将导致不一致。

JDK 中有很多示例,例如Integer, Character and Math类。

PS:像 FindBugs 和 PMD 这样的静态分析工具可以检测代码中幻数的使用并提出重构建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是神奇数字?为什么有些人认为它们不好? 的相关文章

  • 什么是“柯里化”?

    我在几篇文章和博客中看到了对柯里化函数的引用 但我找不到一个很好的解释 或者至少是一个有意义的解释 柯里化是指将一个接受多个参数的函数分解为一系列函数 每个函数只接受一个参数 这是一个 JavaScript 示例 function add
  • 优化康威的“生命游戏”

    为了进行实验 我 很久以前 实施了康威的生命游戏 http en wikipedia org wiki Conway s Game of Life 而且我知道this https stackoverflow com questions 18
  • 额外的函数/方法定义是否会增加程序的内存占用?

    在 C 中 定义不使用的附加方法或函数是否会导致更大的内存占用或更慢的执行速度 基本上 我在一个类中有几种实用程序调试方法 这些方法对于该类的正常使用都不是必需的 如果从未使用过这些定义 是否保留这些定义会在内存占用或速度方面产生影响吗 例
  • 在未排序的数组中查找 2 个等于给定总和的数字

    我们需要在数组中找到总和等于给定值的数字对 A 6 4 5 7 9 1 2 总和 10 那么这些对是 6 4 9 1 我对此有两个解决方案 O nlogn 解决方案 使用 2 个迭代器 开始和结束 进行排序 校验和 O n 解决方案 对数组
  • 23,148,855,308,184,500 是一个神奇的数字,还是纯粹的偶然?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 新闻报道如this one http news bbc co uk 1 hi world am
  • 什么时候函数名太长?

    在可能的情况下 我尝试对我的函数名称进行描述 这有时会导致函数名称在二十到三十个字符范围内 例如GetActionFromTypeName or GetSelectedActionType 在什么时候函数会变得太长而难以管理 对于编译器来说
  • 两个平面之间的交线

    如何找到两个平面之间的交线 我知道数学思想 并且我做了平面法向量之间的叉积 但如何以编程方式从结果向量中获取行 平面的方程为ax by cz d 0 其中 a b c 是平面的法线 d 是到原点的距离 这意味着满足该方程的每个点 x y z
  • 为什么不是每种类型的对象都可序列化?

    为什么不是每种类型的对象都是隐式可序列化的 以我有限的理解 对象不就是简单地存储在堆上并将指向它们的指针存储在堆栈上吗 难道您不应该能够以编程方式遍历它们 以通用格式存储它们 并且还能够从那里重建它们吗 某些对象封装了无法访问的资源 例如文
  • 软件需求分析[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有很多用于编写和管理需求的工具 但是有什么好的工具可以用来审查它们吗 我不是在谈论managing审查 但寻找常见需求错误的自动化工具 例
  • 类型提示中 _ 的正确术语是什么?

    在 Rust 的类型提示中 可以在注释中使用部分类型 如下所示 let myvec Vec lt gt vec 1 2 3 部分类型注释中下划线的正确术语是什么 我对 Rust 术语以及更多学术类型理论术语感兴趣 我找到了一个一份官方文件
  • 3 维装箱算法

    我面临着 3 维装箱问题 目前正在进行一些初步研究 了解哪些算法 启发式方法目前能产生最佳结果 由于问题是 NP 难问题 我不希望在每种情况下都能找到最佳解决方案 但我想知道 1 最好的精确求解器是什么 分支定界 我期望使用合理的计算资源可
  • 语法分析和语义分析有什么区别?

    据我了解 Parser由词法分析 句法分析和语义分析三个阶段组成 Lexical 它将我的输入分割成标记 例子 123 100 0 gt 123 100 0 语法 它将研究标记并检查它们是否彼此有意义 我遇到的问题是理解最后阶段的 语义解析
  • “分支”到底是什么意思?

    长话短说 据我所知 术语 分支 Git 术语 可能指的是相关但不同的事物 指向提交的非符号引用 指针 此类引用的名称 例如 master 存储库提交 DAG 的子图 由此类引用所指向的提交可到达的所有提交组成 然而 我发现这个术语显然指的是
  • Google 文件系统中的块大小问题

    谷歌文件系统论文 http labs google com papers gfs html 块大小是关键设计之一 参数 我们选择了64MB 这比典型文件大得多 系统块大小 每个块 副本存储为普通 Linux 文件放在 chunkserver
  • 什么是悲观主义?

    该问题有评论可以使用C 11的吗auto提高性能 https stackoverflow com questions 32510183 can the use of c11s auto improve performance这获得了很多选票
  • 如何通用地减少子集平均值的计算?

    Edit 由于似乎没有人阅读此链接的原始问题 因此让我在这里介绍一下它的概要 正如其他人所问的 最初的问题是 给定大量值 总和将超过数据类型的值Double那么如何计算这些值的平均值呢 有几个答案说要按集合计算 比如取50个和50个数字 计
  • 需要帮助解决 Project Euler 问题 200 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试制定一个算法来解决 We
  • “单词的正则表达式”(语义替换)-任何示例语法和库吗?

    我正在寻找在给定过程语言的情况下对单词而不是字符进行正则表达式样式转换的常用技术的语法示例 例如 为了追踪复制 人们可能想要创建一份具有相似含义但具有不同单词选择的文档 我希望能够简洁地定义这些可以应用于文本流的可能的转换 例如 快速地no
  • 在数字集合中查找最接近的匹配[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 哪些不同的术语表示相同的事物(或不同的术语,但人们认为它们表示相同的意思)? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的

随机推荐

  • 如何添加自定义键盘

    我做了一个简单的应用程序 我的应用程序包含 10 个文本字段 我需要的是我需要隐藏默认键盘我放置手动键像这样 http b imagehost org download 0994 keypad 我该如何完成这个按键作为我的应用程序的键盘 任
  • gdb:打印二维fortran数组[重复]

    这个问题在这里已经有答案了 使用 GDB 在 Fortran 代码中打印二维数组的值时遇到问题 gdb print var 1 2 no such vector element 经过广泛的搜索后 我发现了许多关于该问题的帖子 日期为 200
  • 我可以为我的函数和类使用 PHP 保留名称吗?

    我想创建一个名为 new 的函数和一个名为 case 的类 我可以用 PHP 做到这一点吗 No http www php net manual en reserved keywords php you http codepad org z
  • 共享两个组合框的数据源

    我的 GUI 中有多个组合框 它们都需要数据 这些数据会随机变化 因此需要一种快速方法来保持所有值同步 我遇到了 DefaultComboBoxModel 它实际上非常适合 唯一的问题是 我需要组合框彼此独立 这意味着 如果我在其中选择一个
  • 页面重新加载时 Angular 应用程序中的 Grunt URL 重写

    Grunt 文件中的 livereload 块如下所示 livereload options open true middleware function connect options middleware var optBase type
  • 默认参数和非默认参数的顺序

    在Python中 我知道默认参数出现在末尾 并且非默认参数不能跟在默认参数后面 没事儿 例如 gt gt gt def foo x 0 y return x y SyntaxError non default argument follow
  • ggplot - 多个图例排列

    我想在 ggplot 中排列具有多行和多列的多个图例 然而目前 从文档中我只能决定方向或操作 1 个图例内的行 列 我是否忽略了什么 感谢您提供解决方案的任何参考点 这是示例代码以及我所做的和预期的结果 data lt seq 1000 4
  • Minecraft 如何进行光照? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我唯一熟悉的模型是漫射照明 但这看起来比那要复杂得多 每个方块的亮度级别从 15 到 0 每个级别都比其上方的级别低 20 如果一个正
  • 如何将摘要输出转换为数据框?

    我总结了由 ID 组成的数据框 称为 DATA 的一列 以便获得给定列中每个 ID 的总数 我想将其转换为另一个数据框 称为 TOTALNUM 所以我有两列 第一列是 ID 本身 第二列是每个 ID 的总数 这可能吗 样本数据 ids lt
  • 在 iOS 上将立体声音频拆分为单声道流

    如果已回答此问题 我们深表歉意 我看到了很多问题 但没有好的答案 我正在尝试将立体声音乐从 iPod 库导出到两个单声道 caf 文件 我怎样才能在 iOS 上做到这一点 我目前正在使用 Objective C Thanks 更新 我已经成
  • 如何在 Flutter 中使屏幕可滚动?

    在我的 Flutter 项目中 在一页中我有一些行 包括垂直对齐的卡片 现在 我希望这个屏幕可以滚动 我尝试将该列替换为Listview但没有成功 我也尝试用它包裹它单子滚动视图但没有用 它显示如下图所示 这是代码 HomeFragment
  • 将 Moq 模拟对象传递给构造函数

    我已经使用 RhinoMocks 有一段时间了 但刚刚开始研究起订量 我有一个非常基本的问题 令我惊讶的是 这并没有立即可用 假设我有以下类定义 public class Foo private IBar bar public Foo IB
  • 如何在.NET 中从经过身份验证的 Twitter oauth_token 注册/登录解析用户?

    我用过OAuth1验证器 https github com xamarin Xamarin Auth blob master src Xamarin Auth OAuth1Authenticator cs L83类来自Xamarin Aut
  • 如何在身份服务器4中获取客户端的远程IP地址

    上下文变量 ResourceOwnerPasswordValidationContext 中是否有一个属性 可让我访问发送初始身份验证请求的客户端的 IP 地址 在该上下文中没有类似的信息可供您获取 你唯一的选择就是注射IHttpConte
  • 活动未发现异常?

    我正在得到一个ActivityNotFoundException在下面的代码中 主程序 java Intent intent new Intent intent setAction com test app TEST startActivi
  • 调试调试和发布版本之间差异的最佳实践和工具?

    我见过一些帖子讨论了调试和发布版本之间可能导致差异的原因 但我认为没有人从开发的角度解决了解决问题的最有效方法是什么 当发布版本中出现错误但调试版本中没有出现错误时 我做的第一件事是通过 valgrind 运行我的程序 希望得到更好的分析
  • 从 PHP 数组中删除 NULL、FALSE 和 ''(但不包括 0)

    我想删除NULL FALSE and 价值观 I used array filter但它删除了0的也 有什么功能可以实现我想要的功能吗 array NULL FALSE 0 1 gt array 0 1 array filter http
  • 如何使用源队列并将其返回给调用者而不具体化它?

    我正在尝试使用新的 Akka 流 想知道如何使用源队列并将其返回给调用者 而不在我的代码中实现它 想象一下 我们有一个库可以进行多次异步调用并通过以下方式返回结果Source 函数看起来像这样 def findArticlesByTitle
  • Java运行命令行包含空格

    我正在尝试从我的 Java 应用程序运行 bat 文件 我已经尝试了所有能找到的方法 但似乎都不起作用 问题是 bat 文件的路径包含空格 我在用着this http viralpatel net blogs how to execute
  • 什么是神奇数字?为什么有些人认为它们不好?

    什么是神奇数字 为什么许多程序员建议避免使用它们 幻数是在代码中直接使用数字 例如 如果您有 在 Java 中 public class Foo public void setPassword String password don t d