你对硬编码的态度是什么?

时间:2009-05-06 05:52:57

标签: coding-style hard-coding

我是这样的:

  

硬编码就是这样!我所有的问题都消失了。只需逐个编码即可。而问题又回来了。你好。

我绝对讨厌它,但事实是“商界人士”倾向于喜欢它,因为它需要更少的时间来获得他们想要的东西。作为一个特别是在企业环境中工作的软件开发人员,大多数人都会说:“是的,为什么要打扰,只需要硬编码”。你对硬编码的态度是什么?

17 个答案:

答案 0 :(得分:21)

  

硬编码应尽可能避免。

如果您对代码进行硬编码,则会在很大程度上完全“破坏”代码的portability。即使使用平台独立语言,您也无法说“编译一次,随处运行”。由于它不是一个好的软件工程实践,我认为避免硬编码更好。

但我知道在某些情况下我们需要它,特别是在调试代码时。我建议的方法是:首先使用硬代码开发代码,使其稳定并消除硬编码然后......

由于安全问题等原因,可能会出现一些我们需要硬编码的情况。您可能不被允许使用注册表,配置文件,因为它们可以增加攻击面。但我认为这是一种罕见的情况。

答案 1 :(得分:20)

IT中不存在银子弹。

  • 如果聪明的话,这样做。
  • 如果它哑了就不要这样做。

如果有人告诉你做蠢事,请保存电子邮件主题并保存你的J.O.B。

答案 2 :(得分:14)

硬编码没有错,只要出于正确的理由就行了!

“正确行事”意味着将所有硬编码集中在一个或两个模块中。

对于C,定义codes.h for Java中的所有值都有一个codes.java类,它只是公共常量。

硬编码有几个“正当理由”。

  • 简单。
  • 支持 - 如果您的值在外部配置文件中,则无法保护自己免受愚蠢的配置影响,并且您无法测试所有可能的配置,如果其硬编码,那么您就知道自己在处理什么。
  • 性能。
  • 可读性。您可以在编辑会话中看到您需要知道的所有内容!

还有几个原因可以避免复杂的配置文件。如果你有足够的参数和选项,你最终会用一种不太好的语言进行编程。

答案 3 :(得分:7)

从概念上讲,我不喜欢太多的硬编码。

但是在实践中,我倾向于硬编码某些值。硬编码的主要原因是:

  • 根据规范,应该有这个值,不应该改变。 使其可更改可能会使软件不稳定。
  • 这个价值可能会在以后更改,但不知道由谁和如何,所以你不知道它属于哪里。它可能属于配置文件,资源文件,数据库,注册表或其他位置。 将它放在错误的位置比使用硬编码更糟糕。

有一些“硬编码最佳实践”我认为永远不会过度工程:

  • 硬编码值应始终在常量的中心位置声明。
  • 即使值是硬编码的,它仍应作为参数传递给组件,而不必关心值的来源。它使您的组件可重用。

这使得以后可以将硬编码值移动到其他位置。

答案 4 :(得分:4)

作为一个在我早期有过硬编码经验的人(不要告诉任何人交配),我可以自信地告诉你它会回来困扰你。我做的这个应用程序(我现在现在谈论)必须完全重写,因为它有很多硬编码的内容。那是1998年的队友。

除非您以后不想支持该客户,否则不要这样做。您现在节省的时间将是稍后修复的时间。

答案 5 :(得分:4)

在嵌入式和关键软件中,硬编码有两个主要优点:

  • 它更快
  • 更简单

这意味着更少的CPU负载,即更少的功耗,更少或没有动态内存分配,更少的算法复杂性,即更容易调试,...

通常,硬编码数据放在单个头文件中以提高可维护性。

此外,通过从数据库自动生成此头文件,可以提供灵活性。

答案 6 :(得分:2)

我认为对默认值进行硬编码是可以配置的所有内容的方法:

在我们的GUI代码(客户端 - 服务器)中,我们使用三步查找:我们向首选项实例询问具有默认值的首选项。但是这个传递的默认值会被配置文件覆盖(如果存在)。

这样我们以后会有两个选择。如果客户想要不同的东西,我们可以在配置文件中更改它。我们还可以配置我们的设置对话框,使其可供用户配置。

因此,我们有了硬编码,可以被配置覆盖,可以被用户偏好覆盖。

唯一的问题是记录所有首选项键......

答案 7 :(得分:2)

通常花费更多的时间和金钱来维护代码而不是最初编写代码。代码总花费的80%通常在维护期间花费。因此,任何使维护更难的事情最终会比第一次做得更好。硬编码绝对是使维护更难的一件事,因此是一个坏主意。

答案 8 :(得分:1)

硬编码是要走的路!

但正如安东尼所说,我把可配置的值放在他们自己的类中。通过这种方式,它们可以在编译时进行配置,但不会增加使用外部xml / txt文件进行配置的复杂性。

我只使用xml / txt文件进行绝对必要的配置。否则,你只是过度工程,即使不比硬编码差,也可能同样糟糕。更不用说人们在配置文件中添加了许多内容,而您根本不希望客户端进行更改。

如果您需要针对不同客户端的不同配置,没有问题,请将硬编码值放在它们自己的assembly / dll中,并为每个客户端部署不同的配置程序集。

正如Ayende所说,hard coding everything是实现变革的关键。

答案 9 :(得分:0)

涉及的几个因素很难做出涵盖所有案件的断言。

如果它是一个有多个周期的长项目,那么如果你开始进行硬编码,很可能他们很快就会再次弹出。因此,在这些情况下,最好通过适当的解决方案进行修复。

但是如果您的项目周期短,或者预定的时间表,并且您必须运送产品,那么大多数客户会满意,如果产品有效,他们就不会关心内部。但在这些情况下,我更喜欢对解决方案进行硬编码,但让路径打开,以便将来很容易做出正确的解决方案。

无论如何,硬编码很糟糕,但是你记录得正确它可以让下一个人的生活变得更容易,并且可能不会诅咒你,至少不会诅咒你;)。

但是从我的经验来看,我开始避免使用硬编码,只有在我没有其他选择时才使用它们,并且总是将这些情况记录下来以便我可以在我有时间的时候正确地修复它。

答案 10 :(得分:0)

  

获得他们想要的东西需要更少的时间。

这几乎就是说,“我喜欢在没有评论的情况下编写我的代码,因为它需要更少的时间来获得我想要的东西。”

当然,这并不是说硬编码总是非常糟糕。 (我的意思是,在配置文件中存储比如π,e或普朗克常数这样的数学常数会有点愚蠢。另外,对正弦/余弦值进行硬编码查找表很可能比从文件中加载它要高效得多。)但纯粹为了方便而硬编码数据并不是一个明智的想法。它不灵活,以后修改数据比以前麻烦得多。

此外,硬编码可能会使本地化变得非常困难,即使在许多情况下也不是不可能。如果它是某个公司的内部应用程序,那么我认为它在某种程度上并不重要,但这并不能使它成为一般的软件开发实践。

答案 11 :(得分:0)

我通常会尝试将值放入配置文件而不是硬编码。如果值必须是硬编码的,我使用硬编码值创建一个常量,并且代码中的任何位置都引用相同的常量。如果价值需要改变,可以在一个地方完成。

对于应用程序范围的常量,我通常会创建一个类并在其中创建常量。

答案 12 :(得分:0)

如果我需要char *指向12个字符,我可以安全地写malloc(12),因为sizeof(char)将始终为1.如果我需要int *指向12个整数,我写malloc(12 * sizeof(int))

绝对正面 从不更改的一些事情进行硬编码。对于其他一切,它需要额外的两秒钟,所以为什么不继续这样做呢?

答案 13 :(得分:0)

如果硬编码正确完成,它可能是一个奖励。例如,如果您对数组大小进行硬编码而不是动态分配,则可以轻松进行调试,因为您确切知道数组在内存中的位置。这假设您确实想知道这些事情。

答案 14 :(得分:0)

我总是创造一个常数,但尽可能接近/明智地使用它的“唯一”用途。

如果我在单位的其他地方需要它,它会被移到单位的顶部。

如果在另一个单位中需要它,则常量将移动到设置单位。

如果有人想让它变性,它会被移动到设置单元(如果还没有),并从配置文件等设置。

在一天结束时,你给出的东西的名字是它的文件,至少它意味着你不会让你的73与某些人混在一起73.如果你明白我的意思。

答案 15 :(得分:0)

关于C / C ++中的硬编码字符串;我通常#define它们是避免硬编码的最简单方法(尽管在某种意义上仍然是硬编码的)。原因是编译器会捕获拼写错误的已定义标识符,而引号之间的任何内容都不会。

答案 16 :(得分:0)

我对配置的态度?它经常做得很差而且太随便 - 随着用户试图了解100个可配置值,提高TCO。仅在证明有必要时才添加可配置性(软编码)。

当必要时......应该使用与用户输入相同的不信任来处理可配置值,并在输入错误时提供清晰的错误消息。大多数组件应与配置基础架构隔离 - 就像您将大多数组件与任何数据访问基础架构隔离开来一样。一旦与配置基础架构隔离,您就可以并且应该测试组件如何处理来自配置系统的各种“输入”。最重要的是,该程序应该可以正常工作,并且配置绝对最少。

然而,这种反模式非常常见:

File.Open(configuration["widgetsFileStorage"] + "/" + widgetImage)

或者这个(你是否会将用户输入直接放入href?我不会。不知何故,很多人信任配置值太多了)。

LinkWriter.href=configuration["supportUrl"]

何时配置?正如你证明你需要的那样。良好的关注点分离将使您可以在以后轻松配置值。我放弃了将文件定位到文件定位器的责任。

File.Open(new WidgetFileLocater().GetUncPath(widgetImage))

在我的文件定位器后面的某个地方,我可能会或可能不会引用配置文件,数据库。我可能会开始硬编码到应用程序目录中的“images”目录。当我们有一个灵活的用例(有人想把它放在SAN上)时,就会出现配置,但之前没有。无论如何,大多数应用程序不应该是否配置。我可能会在文件定位器上使用一些依赖注入来验证它是否正确处理了来自配置文件的糟糕输入。

另外:配置几乎总是松散类型,而不是编译,因此比代码更危险。这种风险很少受到开发人员的尊重(但受到系统管理员的高度重视)。我已经使用像python / ironpython / boo这样的脚本语言来讨论配置需求。我有能力在编译后更改内容,使用比xml或文本更自由的语法和类型检查。

警告:我的态度假设是一个迭代的发布周期。如果你有2到10年的发布周期,比如微软,你会偏向于配置更多的值。