违反了哪条原则?

avkwfej4  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(284)

**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

5个月前关门了。
改进这个问题
我不擅长命名,我擅长感觉。
假设我们有一个假设函数:

function computePowerAndPrintResult(int x){
  print(x*x);
}

它已经在函数的命名(“and”)中尖叫,这里出了问题,我个人从来没有写过这样的代码。这里违反了哪条原则?是单一责任原则吗?

wfypjpf4

wfypjpf41#

不,不是。单一责任是指一个类。当一个类做的太多时,它就被违反了。当一个函数做得太多时,尽管你需要分解它。
我并不是说这不是一个迹象。
在我看来,你需要一个类来计算功率,一个类来管理打印。
但是:假设我需要实现一个我将调用的api,它将返回计算能力的pdf。我需要一个api,既可以计算和打印结果。
然后我会创建 GetSquareValueOutput 它将负责协调从 SquareValueCalculator 类,然后使用 Printer 班级。
这是最后一次 GetSquareValueOutput 不如打电话来 computePowerAndPrintResult 它不会破坏任何东西。我不会选择这个名字,因为它暗示着代码的味道,但最终它只是上下文的问题。

k7fdbhmy

k7fdbhmy2#

热释光;医生:把名字改成 printSquare . 那么这个名字要短得多,同样准确地描述了你所做的事情,但是。。。如果你真的想担心单一责任原则,你还是在破坏它。这更说明了srp是如何容易被过度使用的,而不是一种糟糕的方法。

深入了解那个名字

“computepower”是个坏名字,原因有两个:
“幂”是一个二进制运算(x是yth的幂),你并不是真的这么做;您已将y锁定到“2”,并且该操作也有一个通用名称:“square”。
“compute”通常是多余的。正方形已经暗示计算正在进行。看看java的atomicinteger或biginteger,它们的方法名为 add (实际上,对于bi,应该是 plus )但关键是,它不是 computePlus . 注意,这取决于几个因素;例如,在java中,用 get ,在具有不相关属性或其他属性的类中 square 并不像人们想的那么清楚(比如说,它的几何关系,所以 square 可能会被误解为是指形状而不是数学运算),那么这也是过于简单化的问题。
这意味着方法名的一部分应该是 square 而不是 computePower .
然后我们有了 andPrintResult 部分。在这里 Result 这是多余的。除了结果,它还能打印什么?
您有两种选择:
此方法应命名为 square 并且应该返回该值而不打印任何内容。用另一种方法打印东西。
“作为一个代码的味道是。。嗯。也许 吧。听着,你可以命名这个方法 printSquare 它是短的,清晰的,不包含 and 然而,这是违反规则的 computePowerAndPrintResults .
在很多方面 printSquare 直接违反了srp,但是如果你把名字改成 reportSquare ,代码将计算平方,然后将其报告给已配置的(通过依赖项注入注入,例如)“reporter output stream”,突然之间这并不是违反srp,但我们所做的只是重新定义了一些单词,代码保持不变。

bvjxkvbb

bvjxkvbb3#

对。这个名字确实是一个赠品。违反了单一责任原则,函数负责两件事:计算平方和打印结果。
同时,良好的命名意识也遭到了侵犯:至少它应该被命名 computeSquareAndPrintResult 因为 Power 不指定指数没有多大意义。我个人会称之为 printSquareOf 所以你可以这样称呼它 printSquareOf(x) ,读起来很自然。

相关问题