首先介绍一下背景。我正在从“年龄->费率”中查找代码。有7个年龄段,因此查找表是3列(From | To | Rate)和7行。这些值很少更改-它们是已保持3年不变的立法费率(第一列和第三列)。我认为存储该表而不对其进行硬编码的最简单方法是在数据库中的全局配置表中,因为包含CSV的单个文本值(因此“ 65,69,0.05,70,74,0.06” 65-69和70-74层)。比较容易解析然后使用。
然后,我意识到要实现这一点,我将必须创建一个新表,一个要包装它的存储库,用于仓库的数据层测试,围绕将CSV展开到表中的代码的单元测试以及围绕查找本身的测试。所有这些工作的唯一好处是避免对查找表进行硬编码。
与用户交谈时(当前他们直接使用查找表-通过查看纸质副本)时,人们几乎认为“费率永远不会改变”。显然,这实际上是不正确的-费率是三年前才创建的,过去,“永不改变”的习惯已经改变了-因此,对于我来说,应该进行防御性编程,我绝对不应该在其中存储查找表应用程序。
除了我想YAGNI的时候。我要实现的功能未指定费率会改变。如果费率确实发生变化,它们仍将变化得很少,以至于甚至不需要考虑维护,并且该功能实际上并不十分重要,以至于如果在费率变化和更新的应用程序之间存在延迟,任何事情都将受到影响。
我几乎已经决定,如果我对查询进行硬编码,就不会失去任何价值,而且我不太担心我对这一特定功能的处理方式。我的问题是,作为专业人士,我是否可以合理地证明这一决定?硬编码值是不好的设计,但是麻烦从应用程序中删除值似乎违反了YAGNI原则。
编辑为了澄清这个问题,我不关心实际的实现。我担心自己可能会做出快速,糟糕的事情并通过说出YAGNI来证明其合理性,或者我会采取一种防御性更高的努力方法,即使在最好的情况下,最终收益也很小。作为一名专业程序员,我实施我知道有缺陷的设计的决定是否仅仅取决于成本/收益分析?
编辑虽然所有的答案都非常有趣,因为我认为这归结为个人的设计选择,我认为最好的答案是@科尔宾的和@EZ哈特为他们带来了的事情,我没有在这个问题考虑:
- 错误的二分法是通过将其移动到数据库来“正确删除硬编码的值”,而不是使用硬编码来“有效地应用YAGNI”。第三种选择是将查找表放入应用程序配置中,这不会产生正确方法的开销,而且没有YAGNI的效率。我们通常不限于任何一个或一个决定,然后可以归结为成本/收益决定。
- 代码生成可以减少将硬编码值移动到数据库的开销,并且还可以消除我过度设计的决定,即将CSV处理到表中的决定。如果查询方法的基本要求发生变化,则可能还会对生成的代码造成长期维护问题。这一切都只会影响成本/收益分析,而且如果我拥有自动化功能,那么我什至都不会考虑对这种东西进行硬编码。
我将@Corbin的答案标记为正确,因为它改变了我对开发成本的假设,并且我可能会在不久的将来向我的军械库中添加一些代码生成工具。