“成员”前缀是一种实现细节。它使您的注意力从问题领域转移到了技术解决方案领域,这使您在考虑可能的重构时偏向于头脑。- 我
你能进一步解释吗?您看到的是我为什么不使用前缀并且我不理解它的唯一原因……(我的意思是,其他人在说的是我不必使用前缀的原因,这和为什么我不应该不一样)–贝蒂·克罗克(Betty Crokker)
我的意思是扩展@CandiedOrange和@Ewan的答案。
前缀使重构更加困难
随着代码的发展,变量和方法可能会改变其范围。例如。您可以创建一个私有方法,然后发现它也应可用于其他(新)类。方法参数和局部变量可能会发生类似的情况。
假设您创建了一个计税计算器。根据变量的租约可见性范围的原理,您可以从一种将税率和基值作为参数的方法开始:(
示例可能看起来像Java-ish ...)
class TaxCalculator{
double Calculate(double p_TaxRateInpercent, double p_BaseValue){
return (100+p_TaxRateInpercent)/100 * p_BaseValue;
}
}
接下来,您必须实施反向操作,并且根据TDD,您将以最小的努力做到这一点:
class TaxCalculator{
double Calculate(double p_TaxRateInpercent, double p_BaseValue){
return (100+p_TaxRateInpercent)/100 * p_BaseValue;
}
double CalculateBase(double p_TaxRateInpercent, double p_TaxedValue){
return p_TaxedValue/((100+p_TaxRateInpercent)/100);
}
}
下一个TDD希望您将代码重构为更简洁的代码,以减少这两种方法的参数列表。
(是的,您将首先提取加倍的计算,但是请允许我理解……)
显而易见的解决方案是将税率作为构造函数参数传递给成员变量。
class TaxCalculator{
double m_TaxRateInpercent;
TaxCalculator(double p_TaxRateInpercent){
m_TaxRateInpercent = p_TaxRateInpercent;
}
double Calculate(double p_BaseValue){
return (100+m_TaxRateInpercent)/100 * p_BaseValue;
}
double CalculateBase(double p_TaxedValue){
return p_TaxedValue/((100+m_TaxRateInpercent)/100);
}
}
如您所见,我们必须更改现有方法的所有行(我们过去曾经p_TaxRateInpercent
精确的任何行)。
问题是,您在整个类中都没有IDE的支持来进行重命名。它搜索/替换的唯一帮助,这也将更改构造函数或意外包含字符串的任何部分p_TaxRateInpercent
。
您的IDE可能会为未定义的变量名提供...重构的更改,但这可能仅限于方法的范围
如果没有前缀,则仅方法签名会更改。完全不需要重命名。
更改时前缀混乱的SCM历史记录
另外,SCM记录中虽然逻辑没有变化,逻辑变化前缀的变化!SCM的历史充斥着这项技术更改,隐藏了重要的内容,并增加了与其他(真实逻辑)更改发生冲突的风险。
this
关键字吗?您不能使用引用成员this
,例如this.count
吗?