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

时间:2010-07-27 15:22:26

标签: language-agnostic

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

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

7 个答案:

答案 0 :(得分:2)

为了避免硬编码,你应该

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:1)

这个问题背后的假设似乎无效。

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

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

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

让它们可配置是你在紧张的时间表中可能被迫进行的最后沟通妥协。