违反哪个原则?

问题描述

我不擅长命名,我不擅长感觉。

假设我们具有以下假设功能

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”是一个不好的名字,原因有二:

  1. 'Power'是一个二进制运算(X到Yth的幂),您实际上并没有这样做。您已将Y锁定为“ 2”,并且该操作也有一个通用名称:“ square”。

  2. “计算”通常是多余的。平方已经意味着计算正在进行中。看例如java的AtomicInteger或BigInteger,它们具有名为add的方法(实际上,对于BI,应为plus),但要点是,它不是computePlus。请注意,这取决于一些因素。例如,在Java中,通常使用get来启动属性获取器,在具有不相关属性的类中,否则square并不像人们希望的那样清晰(例如,其几何相关,因此square可能会被误认为是指形状而不是数学运算),那么这也就简化了事情。

这意味着方法名称的一部分应该为square,而不是computePower

然后我们有andPrintResult部分。这里Result是多余的。除了结果以外,还要打印什么?

您有2个选择:

  1. 此方法应命名为square,并且应返回该值且不打印任何内容。制作另一种打印东西的方法。
  2. '和'是代码气味是..嗯。也许。看起来,您可以将这种方法命名为printSquare,它简短,清晰并且不包含and,但是,它与computePowerAndPrintResults一样违反了规则。

在许多方面,printSquare完全违反了SRP,但是如果您将名称更改为reportSquare,则代码将计算平方,然后将其报告给已配置的平方(通过依赖注入注入)例如)“报告程序输出流”,突然间这并不违反SRP,但是我们所做的只是重新定义了一些单词,代码保持不变。