将数据值硬编码到程序中是否有优势?


13

我是一个自学成才的新手程序员,因此,如果我不喜欢程序员的话,我深表歉意。

我正在从事一个项目,在该项目中,我将向开发人员提供不断更新的数据,这些开发人员实际上将创建一种工具,用于根据对数据的查询生成报告。

似乎每个参与人员都认为他们需要将数据值(不是模式,而是域/值本身)硬编码到报告生成程序中。

例如,假设我们正在报告人员情况;该报告将分为几类,每个部门都有一个标题,然后在每个部门标题下将是职务的子标题,然后在每个子标题下将是雇员列表。开发人员希望对部门和职位进行硬编码。另一方面,我认为他们可以/将在运行时查询这些事情,对它们进行排序,并根据存在的值动态生成报告标题。

由于潜在价值的列表将随着时间而变化(例如,将创建/重命名部门,将添加新的职务),因此需要不断更新代码。在我看来,我们可以跳过代码维护步骤,并动态组织报告。

由于我不是开发人员,所以我想知道自己缺少什么。将值硬编码到这样的工具中可能有什么优势?这通常是程序的设计方式吗?



报表是否为交叉表,这意味着行中的值应显示为列?
图兰斯·科尔多瓦

1
@Brendan-如果您对报告中的值进行硬编码,则需要在两个位置(数据源和报告)中更改列表,而如果报告是动态的,则只需在一个位置(报告)中进行更改。

1
@Brendan为什么您最终会有三个位置?也许我的理解是不正确的,但我正在设想一个sql查询从数据库中获取数据,应用程序将按部门对返回的值进行汇总/分组。如果您愿意承担多个数据库查询的开销,则可以根据需要选择不同的部门/角色标题。数据绝不会存在于多个位置中-报告是由数据驱动的。

1
@Brendan我也不同意您对它的定义在一个地方-您描述它的方式在多个位置,分散在整个源代码中。

Answers:


9

维基百科:

硬编码(也称为硬编码或硬编码)是指软件开发实践,即可能仅在回顾时才将可能被视为输入或配置数据的内容直接嵌入到程序或其他可执行对象的源代码中,或数据,而不是从外部源获取数据或使用给定输入在程序本身中生成数据或格式化。

硬编码被认为是反模式。

硬编码被认为是一种反模式,当输入数据或所需的格式发生更改时,硬编码就需要更改程序的源代码,这对于最终用户而言,通过程序外部的某种方式更方便地更改细节可能更为困难。

有时您无法避免,但它应该是暂时的。

经常需要硬编码。程序员可能没有针对最终用户的动态用户界面解决方案,但仍必须提供功能或发布程序。这通常是暂时的,但是从短期的意义上来说,确实可以解决交付代码的压力。以后,进行软编码以允许用户传递参数,这些参数为最终用户提供了一种修改结果或结果的方法。

  • 消息的硬编码使程序国际化变得困难。
  • 硬编码路径使其很难适应另一个位置。

硬编码的唯一优点似乎是快速交付代码。


5
可以,但是“唯一优势”通常非常重要。编程中的设计决策通常是关于将来的证明和现在的快速交付之间的权衡,因此,硬编码可能是一个完美的选择。有时,不进行硬编码是一个糟糕的设计选择。

-1我认为这不是有用的答案。从本质上说,“不恰当地将值嵌入到源代码中”是不合适的。我认为OP需要有关何时事物可能属于源代码并因此不属于Wikipedia定义的指导。
内森·库珀

硬编码应该是您流程中至关重要的部分,并且考虑到它是微服务时代已经过时的反模式,《 Angular Tour of Heroes》教程是一个大型软件公司的引人注目的例子,它直接将甚至强制要求中间步骤。此外,当您移至动态数据时,您仍应保留一些硬编码数据作为后备,可能是由环境变量控制,甚至是代码本身的布尔切换控制,以便可以将错误和安全问题适当地隔离开来。线。
Google搜索的内容

24

真?没有可能的有效用例?

尽管我同意硬编码通常是一种反模式,或者至少是一种非常难闻的代码味道,但在很多情况下它是有道理的:

  • 简单(YAGNI),
  • 输入实际上是恒定的,并且永远不会改变(即,它代表自然或业务常数,或者近似于1。例如0,PI,...),
  • 嵌入式软件(记忆和分配限制会浮现在脑海),
  • 安全软件(这些值不可用和/或不易于解码或逆向工程,例如加密令牌和盐),
  • 生成的代码(您的预处理器或生成器是可配置的,但会吐出带有硬编码值的代码),
  • 可能还有更多。

还是一个反模式过度工程也是如此!这与软件的预期寿命有关!

并不是说我有很多很好的理由,通常我会不愿意使用硬编码的值。但是有些人出于正当的理由很容易获得通过。

并且不要以为简单/ YAGNI太琐碎而忽略了第一个:可能没有理由为一个很好的简单脚本实现疯狂的解析器和值检查器,该脚本很好地在狭窄的用例中完成了一项工作。

很难找到平衡。有时候,您没有预料到软件会比最初的简单脚本变得强大并且持续时间更长。但是,通常情况却恰恰相反:我们过度设计了东西,并且一个项目的搁置速度比您阅读Pragmatic Programmer的速度还快。与早期的原型相比,您浪费了时间和精力。

这就是反模式的卑鄙之处:它们同时存在于频谱的两个极端中,并且其外观取决于查看代码的人员的敏感性。


这很有趣,因为我自己进行了此操作,而且动态地处理这些值对于我而言变得更加容易,快捷和干净。我是用Python编写的,但我相信最终产品将用Java编码-如果这样做有所不同。当我对值进行硬编码时,它感觉过度设计,因为必须在多个位置跟踪每个传入的列。
汤姆,

@Tom:您是说实现(甚至重用)配置查找库比使用硬编码值更容易,更快捷吗?非常适合您。另外,我看不出您的最后一句话如何适合过度工程的定义。这显然很乱,而且如果将其硬编码和复制显然会更糟(这不是您要提问的问题,我可能会误解了,但是在我看来,您好像意味着价值没有被硬编码每次,但只在程序中的一个点)。
haylem 2016年

无论如何,我只是指出适用的情况。我还指出,我的最后一句话会引起争议。您不能取悦所有人和团队拥有不同技能水平的人。
haylem

1
@汤姆,不要卖得太短。您肯定会做某事。通过查看“部门”和“职务”字段而不是硬编码,编写一种快速的算法来组织数据听起来更容易,并且耗时更少Department = ['IT', 'Sales', 'Operations', 'HR', 'Finance']。如果引入了新的部门或标题,维护硬编码阵列也将更加困难。
克里斯G

1
您可以进行更复杂的事情,但仍然需要进行硬编码。我几年前写的一个想法是,一组值的所有可能排列。我需要找到一个随机有效方向,选择一个随机排列,然后获得第一个有效结果,这是迄今为止最有效的解决方案,因为它在O(N ^ 3)循环中非常重要。
罗伦·佩希特尔

4

有时可以对值进行硬编码。例如,有些数字(例如0)或一个或多个n ^ 2-1值用于位掩码,出于算法目的,它们必须是某些值。将这样的值允许为可配置的值没有任何价值,只会带来问题的可能性。换句话说,如果更改值只会破坏事情,则可能应该对其进行硬编码。

在您提供的示例中,我看不到硬编码在哪里有用。您提到的所有内容(包括标题)都已经/应该已经存在于数据库中。如果不存在,甚至可以驱动显示的内容(例如排序顺序)。


谢谢。排序顺序是我关心的一个问题。但是,在我们的情况下,这无关紧要,而且我什至都不认为可以将其添加为数据库中的另一个表。
汤姆,

1
我应该注意,在数据库中管理所有这些都是一种选择。您也可以使用配置文件或其他解决方案,但是硬编码似乎不是一个好的选择。经常使用DB选项,因为它很容易创建一个界面来允许用户管理这些选项。也有一样的工具其中是专门为这个目的而设计的。
JimmyJames

-1

要实现一个健壮的解决方案,以允许最终用户可以对这些值进行硬编码而改为可配置,则需要对这些值进行健壮的验证。他们是否输入了空字符串?他们是否在非数字的地方输入了应该是数字的地方?他们在做SQL注入吗?等等。

硬编码避免了很多此类风险。

这并不是说硬编码始终是,甚至经常是一个好主意。这只是要考虑的因素之一。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.