Language agnostic 硬编码文字是否可以接受?

Language agnostic 硬编码文字是否可以接受?,language-agnostic,hard-coding,Language Agnostic,Hard Coding,我目前正在处理的代码库中充斥着硬编码的值 我将所有硬编码的值视为一种代码气味,并尝试在可能的情况下消除它们……但是有些情况我不确定 以下是两个让我想知道最佳实践是什么的例子: 1. MyTextBox.Text = someCondition ? "Yes" : "No" 2. double myPercentage = myValue / 100; 在第一种情况下,最好创建一个类,允许我在配置文件中执行MyHelper.Yes和MyHelper.No,或者类似的操作(尽管它不太可能更改,谁知

我目前正在处理的代码库中充斥着硬编码的值

我将所有硬编码的值视为一种代码气味,并尝试在可能的情况下消除它们……但是有些情况我不确定

以下是两个让我想知道最佳实践是什么的例子:

1. MyTextBox.Text = someCondition ? "Yes" : "No"
2. double myPercentage = myValue / 100;
在第一种情况下,最好创建一个类,允许我在配置文件中执行MyHelper.Yes和MyHelper.No,或者类似的操作(尽管它不太可能更改,谁知道它的使用是否会区分大小写)

在第二种情况下,除非数学定律改变,否则用100除以一个百分比是不可能改变的……但我仍然想知道是否有更好的方法


有人能建议一种适当的方法来处理这种硬编码吗?任何人都能想到硬编码是一种可接受的做法的地方吗?

对于第二个示例,更好的方法是定义一个内联函数:

double getpercentage(double myValue)
{
   return(myValue / 100);
}


这样一来,你所做的事情就更加明显了。

如果你需要本地化,第一个案例将杀死你。将其移动到应用程序范围内的某个静态或常量至少会使本地化变得更容易。

我倾向于根据项目的范围和大小来查看它

一些简单的项目,我是一个单独开发?当然,我硬编码了很多东西。我写的工具只有我会用吗?当然,如果它完成了任务

但是,在进行更大的团队项目时?我同意,他们是可疑的,通常是懒惰的产物。标记它们以供查看,并查看是否可以找到一个模式,在那里它们可以被抽象出来


在您的示例中,文本框应该是可本地化的,那么为什么不使用一个处理该文本框的类呢?

我不认为您的第二个文本框是真正的硬编码示例。这就像有一个Halve()方法,它接受一个用来除以的值;没有道理

除此之外,例如1,如果您想更改应用程序的语言,您不想更改类,因此它绝对应该在配置中

应该避免硬编码,就像德古拉避开太阳一样。它最终会回来咬你的屁股

有人能想到硬编码是一种可接受的实践的地方吗

  • 小型应用程序
  • 单人项目
  • 扔掉
  • 短期项目
简而言之,任何其他人无法维护的东西


哎呀,我刚刚意识到,在过去,作为一名维护编码员对我有多大的伤害:)

对于第一个值,这真的取决于它。如果您不希望应用程序得到广泛采用,那么国际化将永远不会成为问题,我认为这基本上是好的。然而,如果你正在编写某种开源软件或是一些更大的受众的东西,那就考虑到有一天可能需要翻译。在这种情况下,您最好使用字符串资源。

请记住,您将忘记任何不明显的硬编码值的含义

因此,一定要在每句话之后写一个简短的评论来提醒你

Delphi示例:


长度:=长度*0.3048;{0.3048将英尺转换为米}

案例1:什么时候应该硬编码东西:当你没有理由认为它会改变时。也就是说,你应该永远不要在线硬编码。花点时间制作静态变量或全局变量,或者任何你的语言给你的东西。在所讨论的类中执行这些操作,如果您注意到代码的两个类或区域出于相同的原因共享相同的值(这意味着这不仅仅是巧合),请将它们指向相同的位置

案例2:对于案例2,您是正确的:“百分比”定律不会改变(这里是合理的),因此您可以内联硬编码

案例3:第三种情况是,您认为事情可能会发生变化,但不想/没有时间加载ResourceBundle或XML或其他内容。在这种情况下,您可以使用任何可以使用的集中式机制——令人讨厌的Singleton类是一个很好的类——然后继续使用它,直到您真正需要处理这个问题为止

不过,第三种情况很棘手:如果不真正实现应用程序的国际化,则非常困难。。。因此,您需要硬编码的东西,只希望当i18n的家伙来敲门时,您的代码不是最糟糕的代码:)


编辑:让我提一下,我刚刚完成了一个重构项目,在该项目中,先前的开发人员将MySql connect字符串放在了代码(PHP)中的100多个位置。有时是大写,有时是小写,等等,所以很难搜索和替换(尽管Netbeans和PDT确实很有帮助)。他/她这样做是有原因的(一个名为POG的项目基本上强迫他/她这么做是愚蠢的),但是没有什么比在一百万个地方重复同样的事情更像是好代码了。

只要你不做重构、单元测试、同行代码审查就行了。而且,你不想要回头客。谁在乎呢?

这从来都不是好事,你只是证明了这一点

double myPercentage = myValue / 100;
这不是百分比。你想写的是:

double myPercentage = (myValue / 100) * 100;
或者更准确地说:

double myPercentage = (myValue / myMaxValue) * 100;
但是这个硬编码的100打乱了你的思维。。。因此,选择Colen建议的getPercentage方法:)


同样正如ctacke所建议的,在第一种情况下,如果您需要对这些文本进行本地化,那么您将处于一个痛苦的世界中。添加几个变量和/或函数从来都不会太麻烦

条件的文本应该在资源文件中;这就是它的目的。

真正的问题不是硬编码,而是重复。如果你采纳了书中的建议,就不要重复你自己

承担
double myPercentage = (myValue / myMaxValue) * 100;
double getpercentage(double myValue, double maxValue)
{
   return (myValue / maxValue) * 100;
}
const MAX_CACHE_RECORDS = 50
foo = GetNewCache(MAX_CACHE_RECORDS)
const ONE_HUNDRED = 100
const ONE_HUNDRED_AND_ONE = 101
$vat = $price * 0.175;