问题描述
我不擅长命名,我不擅长感觉。
假设我们具有以下假设功能:
function computePowerAndPrintResult(int x){
print(x*x);
}
在该函数的名称(“和” )中已经大叫一声,这里有些错误,我个人从来没有写过这样的代码。 这里违反了哪个原则?这是单一责任原则吗?
解决方法
是的。这个名字确实是一个赠品。违反 single 责任原则,该函数负责两件事:计算平方和打印结果。
也违反了良好的命名意义:至少应将其命名为computeSquareAndPrintResult
,因为Power
没有指定指数没有太大意义。我个人将其称为printSquareOf
,因此您可以像printSquareOf(x)
这样称呼它,它看起来很自然。
不,不是。单一责任是指一个阶级。当一个班级做得太多时,就会被违反。当功能需要执行很多工作时,您需要对其进行分解。
现在我并不是说这不是表明它确实存在。
在我看来,您需要一个用于计算功率的类以及一个用于管理打印的类。
但是:假设我需要实现一个我将调用的API,它将返回计算能力的PDF。我需要一个既能计算并打印结果的api。
然后,我将创建GetSquareValueOutput
,它负责协调从SquareValueCalculator
类中获取数据,然后使用Printer
类进行打印。
最后一个GetSquareValueOutput
也可以称为computePowerAndPrintResult
,并且不会破坏任何内容。我不会选择该名称,因为它暗示了代码的味道,但最终这只是上下文的问题。
TL; DR:将名称更改为printSquare
。然后,名称要简短得多,可以准确地描述您的工作,但是...如果您真的想担心单一责任原则,那么您仍在打破它。除了说这是一种不好的方法之外,这还说明了如何轻松地过度使用SRP。
深入了解这个名字
“ computePower”是一个不好的名字,原因有二:
-
'Power'是一个二进制运算(X到Yth的幂),您实际上并没有这样做。您已将Y锁定为“ 2”,并且该操作也有一个通用名称:“ square”。
-
“计算”通常是多余的。平方已经意味着计算正在进行中。看例如java的AtomicInteger或BigInteger,它们具有名为
add
的方法(实际上,对于BI,应为plus
),但要点是,它不是computePlus
。请注意,这取决于一些因素。例如,在Java中,通常使用get
来启动属性获取器,在具有不相关属性的类中,否则square
并不像人们希望的那样清晰(例如,其几何相关,因此square
可能会被误认为是指形状而不是数学运算),那么这也就简化了事情。
这意味着方法名称的一部分应该为square
,而不是computePower
。
然后我们有andPrintResult
部分。这里Result
是多余的。除了结果以外,还要打印什么?
您有2个选择:
- 此方法应命名为
square
,并且应返回该值且不打印任何内容。制作另一种打印东西的方法。 - '和'是代码气味是..嗯。也许。看起来,您可以将这种方法命名为
printSquare
,它简短,清晰并且不包含and
,但是,它与computePowerAndPrintResults
一样违反了规则。
在许多方面,printSquare
完全违反了SRP,但是如果您将名称更改为reportSquare
,则代码将计算平方,然后将其报告给已配置的平方(通过依赖注入注入)例如)“报告程序输出流”,突然间这并不违反SRP,但是我们所做的只是重新定义了一些单词,代码保持不变。