避免硬编码值的最佳实践IRL

问题描述 投票:3回答:7

理论上,源代码不应包含超过0,1和空字符串的硬编码值。 在实践中,我发现在非常紧张的交付时间内很难避免所有硬编码的值,所以我最终使用了一些并感到有点内疚。

如何协调避免硬编码值与交货时间紧张?

language-agnostic
7个回答
2
投票

为了避免硬编码你应该

  • 使用配置文件(将您的值放在XML或类似ini的文本文件中)。
  • 使用数据库表来存储您的值。

当然,并非所有值都有资格移动到配置文件。 对于那些你应该使用编程语言提供的结构,如(常量,枚举等)。

刚看到答案使用“Constatn接口”。 对海报和选民充分尊重,但不建议这样做。 您可以在以下位置阅读更多相关信息

http://en.wikipedia.org/wiki/Constant_interface


1
投票

这需要一些规划,在大多数情况下,它只是具有配置文件,或者可能是存储关键配置项的数据库表。 我没有发现你有“拥有”硬编码值的任何理由,并且它不会花费你太多额外的时间来卸载到一个配置机制,以便紧密的时间线是一个有效的借口。


1
投票

硬编码值的问题在于,有时特定代码依赖于它们并不是obvoius。 例如,在java中,可以将所有常量移动到单独的接口中,并将特定常量分隔为内部子接口。 这很方便也很明显。 此外,只需使用IDE工具(“查找用法”功能)并更改或重构它们,就可以轻松找到常量用法。

这是一个例子:

public interface IConstants {

    public interface URL {
        String ALL = "/**";
    }

    public interface REST_URL {
        String DEBUG = "/debug";
        String SYSTEM = "/system";
        String GENERATE = "/generate";
    }
} 

引用非常易读: IConstants.REST_URL.SYSTEM


1
投票

大多数非平凡的企业项目都有一些属性或配置选项的中心概念,它们已经负责从文件/数据库加载选项。 在这些情况下,通常很简单(例如,不到5分钟的工作)来扩展它以支持您需要的新属性。

如果您的项目没有,那么:

  • 它可以从中受益 - 在这种情况下编写它,从平面.properties文件中获取值。 这不应该超过一个小时,顶部,并且可以重复使用任何配置的东西
  • 即使那个小时也是浪费 - 在这种情况下,您仍然可以拥有默认值,但允许它被系统属性覆盖。 这不需要基础设施工作,并且在课堂上实施的时间最短。

硬编码的确没有借口 - 它最多只能节省几分钟,如果你的项目截止日期是几分钟,那么你就会遇到比如何编码可配置性更大的问题。


1
投票

不可否认,我在目前的业余爱好项目中对很多东西进行了硬编码。 配置文件可笑容易使用而不是(至少与Python,它配备了一个伟大而简单的.cfg分析器),我只是不打扰,因为我相信99%,我将永远不会有改变他们使用它们-即使这个假设被证明是错误的,它也足够小,可以用合理的努力来重构它。 然而,对于更大/更重要的东西,我永远不会输入if foo == "hardcoded bar" ,而是if foo == cfg.bar (可能有更有意义的cfg名称)。 Cfg是一个全局单例(是的,我知道...),它在启动时输入.cfg文件,下次一些标记值更改时,您更改配置文件而不是源。

使用动态/反射语言,当您向其添加另一个值时,甚至不需要更改加载.cfg的部分 - 使其使用文件中的所有条目动态填充cfg对象(或使用散列映射,为此事情)并完成。


1
投票

这里有2条建议:首先,如果您正在使用像C这样的语言处理嵌入式系统。只需编写一个编码约定,将#define用于任何字符串或常量。 所有#define都应该归类为.h文件。 这应该足够了 - 不是太复杂,但足以维护。 您不需要修改代码行之间的所有常量。

其次,如果您正在处理具有数据库访问权限的应用程序。 只需将所有常量值保存在数据库中即可。 您只需要一个非常简单的接口API来进行检索。

通过简单的技巧,可以扩展这两种方法以支持多语言功能。


1
投票

这个问题背后的假设在我看来是无效的。

对于大多数软件,配置文件更难以更改源代码。 对于广泛安装的软件来说,这可能很容易造成百万倍的困难:很容易就会有很多文件挂在用户安装上,而你几乎没有知识,也无法控制。

在软件中使用数字文字与具有功能或算法文字没有区别:它只是源代码。 任何软件都有责任确保这些价值正确。

失败使他们至少可以维护:有条不紊和有组织。

使它们可配置是一种最后的沟通妥协,如果你的时间紧迫,你可能会被迫进入。

© www.soinside.com 2019 - 2024. All rights reserved.