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

Language agnostic 避免硬编码值IRL的最佳实践,language-agnostic,Language Agnostic,理论上,源代码不应包含超过0、1和空字符串的硬编码值。在实践中,我发现在交付时间非常紧张的情况下很难避免所有硬编码的值,因此我最终使用了其中的一些值,并感到有点内疚 如何协调避免硬编码的值与紧凑的交付时间?这需要一点计划,在大多数情况下,它就像拥有一个配置文件,或者可能是一个存储关键配置项的数据库表一样简单。我认为没有任何理由“必须”使用硬编码的值,也不需要花费太多额外的时间来将配置机制转移到时间紧迫的配置机制上。硬编码的值的问题是,有时特定的代码并不依赖于它们。例如,在java中,可以将所有常

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


如何协调避免硬编码的值与紧凑的交付时间?

这需要一点计划,在大多数情况下,它就像拥有一个配置文件,或者可能是一个存储关键配置项的数据库表一样简单。我认为没有任何理由“必须”使用硬编码的值,也不需要花费太多额外的时间来将配置机制转移到时间紧迫的配置机制上。

硬编码的值的问题是,有时特定的代码并不依赖于它们。例如,在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\u URL.SYSTEM

为了避免硬编码,您应该

  • 使用配置文件(将您的值放入XML或类似ini的文本文件中)
  • 使用数据库表存储您的值
当然,并非所有值都有资格移动到配置文件中。对于那些,您应该使用编程语言提供的结构,例如(常量、枚举等)

刚才看到了使用“Constatn接口”的答案。对海报和选民表示应有的尊重,但不建议这样做。您可以通过以下网址了解更多信息:


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

如果您的项目没有,则:

  • 它可能会从中受益——在这种情况下,编写它,从flat.properties文件中获取值作为开始。这最多不应该超过一个小时,并且可以在将来用于任何配置
  • 即使那个小时也是一种浪费——在这种情况下,您仍然可以有一个默认值,但允许系统属性覆盖它。这不需要基础设施工作,也不需要在类中花费最少的时间来实现

对值进行硬编码真的没有任何借口——它最多只会为您节省几分钟,如果您的项目截止日期以分钟为单位,那么您将遇到比如何为可配置性编码更大的问题。

无可否认,在我目前的爱好项目中,我硬编码了很多东西。配置文件非常容易使用(至少在Python中,它附带了一个很棒且简单的.cfg解析器),我只是不想麻烦使用它们,因为我有99%的信心我永远不必更改它们——即使这个假设被证明是错误的,它也足够小,可以用合理的努力重构它。然而,对于更大/更重要的注释,如果foo==“hardcoded bar”,我将永远不会键入
,而是如果foo==cfg.bar
(可能有一个更有意义的cfg名称)。Cfg是一个全局单例(是的,我知道…),它在启动时被送入.Cfg文件,下一次某些sentinel值更改时,您将更改配置文件而不是源文件

使用动态/反射语言,您甚至不需要在向.cfg添加其他值时更改加载该.cfg的部件-使其使用文件中的所有条目动态填充cfg对象(或者使用hashmap,就此而言),然后就可以完成了。

2此处的建议: 首先,如果您正在使用C语言处理嵌入式系统,只需制定一个编码约定,对任何字符串或常量使用#define。所有的#define都应该在一个.h文件中进行分类。这应该足够了——不太复杂,但对于可维护性来说足够了。您不需要破坏代码行之间的所有常量

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


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

在我看来,问题背后的假设是无效的

对于大多数软件来说,更改源代码的配置文件要困难得多。对于广泛安装的软件来说,这可能是一个非常困难的因素:用户安装上很容易会挂起很多文件,而您对这些文件知之甚少,无法控制

在软件中使用数字文字与使用函数或算法文字没有什么不同:它只是源代码。这是任何软件的责任,打算是有用的,以获得这些价值观的权利

如果做不到这一点,它们至少是可维护的:良好的名称和组织


如果你的日程安排很紧,那么让它们可配置是你可能被迫采取的最后一种妥协。

应该是社区维基,如果有的话。为了好玩,我现在的要求之一是:1)扫描每日会计文件,查找五个交易代码。2) 仅从这些字段中选择学分(记录类型“5”)。3) 如果第四个字段不是0,请将该字段移动到第五个字段。4) 如果第六个字段的前九个位置是数字,请将这些数字移到第五个字段。5) 如果五个交易代码中的特定一个没有通用总账账户,则第六个字段中的九位数字必须作为合同存在于第二个文件中。在这些步骤中,只有#5有一些sor