我目前正在处理的代码库中充斥着硬编码值.
我将所有硬编码值视为代码气味,并尝试在可能的情况下消除它们......但是有些情况我不确定.
以下是我能想到的两个例子让我想知道最佳做法是什么:
1. MyTextBox.Text = someCondition ? "Yes" : "No" 2. double myPercentage = myValue / 100;
在第一种情况下,最好的做法是创建一个允许我在配置文件中执行MyHelper.Yes和MyHelper.No或者类似的东西的类(虽然它不太可能改变,谁知道是否有可能曾经是一个案例,其用法将区分大小写).
在第二种情况下,除非数学定律改变,否则找不到百分比的百分比不可能改变......但我仍然想知道是否有更好的方法.
任何人都可以建议一种适当的方式来处理这种硬编码吗?任何人都可以想到硬编码是可接受的做法吗?
任何人都可以想到硬编码是可接受的做法吗?
小应用程序
单人项目
扔掉
短期生活项目
简而言之,任何其他人都无法维护的东西.
我刚刚意识到维护者编码器在过去伤害了我多少:)
当然,硬编码有时是可以接受的.以下教条很少像使用你的大脑那样有用.
(举一个这样的例子,也许回到goto战争很有意思.你知道有多少程序员会发誓所有神圣的东西都是邪恶的?为什么Steve McConnell会用十几页来讨论代码完成中的主题?)
当然,有很多来之不易的经验告诉我们,小型一次性应用程序经常会变成生产代码,但这并不是狂热的理由.敏捷专家告诉我们,我们应该做最简单的事情,可能会在需要时工作和重构.
这并不是说"最简单的东西"不应该是可读的代码.这可能是非常有意义的,即使是在一次丢失的尖峰中写道:
const MAX_CACHE_RECORDS = 50 foo = GetNewCache(MAX_CACHE_RECORDS)
这无论在三次迭代时间内,有人可能会要求缓存记录的数量是可配置的,并且您最终可能会重构该常量.
请记住,如果你去了极端的东西,如
const ONE_HUNDRED = 100 const ONE_HUNDRED_AND_ONE = 101
我们都会来到The Daily WTF并嘲笑你.:-)
认为!就这样.
真正的问题不是硬编码,而是重复.如果您采用"实用程序员"中的优秀建议,只需不要重复自己(DRY).
采用DRY的原则,任何时候都可以硬编码.但是,一旦再次使用该特定值,重构,因此该值仅硬编码一次.
它永远不会好,你只是证明了它......
double myPercentage = myValue / 100;
这不是百分比.你想写的是:
double myPercentage = (myValue / 100) * 100;
或者更正确:
double myPercentage = (myValue / myMaxValue) * 100;
但这个硬编码100与你的思想搞混了......所以去找Colen建议的getPercentage方法:)
double getpercentage(double myValue, double maxValue) { return (myValue / maxValue) * 100; }
同样正如ctacke建议的那样,在第一种情况下,如果您需要本地化这些文字,您将处于一个痛苦的世界.添加更多变量和/或函数永远不会太麻烦
如果你需要本地化,第一种情况会杀了你.将其移动到应用程序范围内的某个静态或常量将至少使其本地化更容易一些.
案例1:什么时候应该硬编码:当你没有理由认为它会改变时.也就是说,你永远不应该硬编码内联.花点时间制作静态变量或全局变量或者你的语言给你的东西.在有问题的课程中执行这些操作,并且如果您注意到代码的两个类或区域共享相同的值同样的原因(意味着它不仅仅是巧合),请将它们指向同一个位置.
案例2:对于案例2,你是对的:"百分比"的定律不会改变(这里是合理的),所以你可以硬编码内联.
案例3:第三种情况是您认为事情可能发生变化,但您不想/有时间去加载ResourceBundles或XML或其他任何东西.在这种情况下,你可以使用任何集中机制 - 讨厌的Singleton类是一个很好的 - 然后继续使用它,直到你真正需要处理问题为止.
然而,第三种情况很棘手:如果没有真正做到这一点,将应用程序国际化是非常困难的...所以你会想要硬编码的东西,并希望当i18n家伙敲门时,你的代码不是最糟糕的 - 品尝代码:)
编辑:让我提一下,我刚刚完成了一个重构项目,其中先前的开发人员将MySql连接字符串放置在代码中的100多个位置(PHP).有时它们是大写的,有时它们是小写的等等,所以它们很难搜索和替换(尽管Netbeans和PDT确实有很多帮助).还有为什么他/她这样做(一个名为POG项目基本上迫使这个愚蠢)的原因,但只是没有什么似乎不太像好的代码比一百万的地方重复同样的事情.