Javascript 违反了哪项原则?

Javascript 违反了哪项原则?,javascript,java,python,solid-principles,single-responsibility-principle,Javascript,Java,Python,Solid Principles,Single Responsibility Principle,我不擅长命名,我擅长感觉 假设我们有这个假设函数: function computePowerAndPrintResult(int x){ print(x*x); } 它已经在函数的命名中尖叫,这里有一些错误,就我个人而言,我从来没有写过这样的代码。 这里违反了哪条原则?这是单一责任原则吗?是。这个名字确实是一个赠品。违反单一责任原则,函数负责两件事:计算平方和打印结果 此外,还违反了良好的命名意义:至少它应该被称为computeSquareAndPrintResult,因为不指定指数的幂

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

假设我们有这个假设函数:

function computePowerAndPrintResult(int x){
  print(x*x);
}
它已经在函数的命名中尖叫,这里有一些错误,就我个人而言,我从来没有写过这样的代码。
这里违反了哪条原则?这是单一责任原则吗?

是。这个名字确实是一个赠品。违反单一责任原则,函数负责两件事:计算平方和打印结果


此外,还违反了良好的命名意义:至少它应该被称为computeSquareAndPrintResult,因为不指定指数的幂没有多大意义。我个人称之为printSquareOf,所以你可以把它叫做printSquareOf,它读起来非常自然。

不,它不是。单一责任指的是一个类别。当一个类做得太多时,它就被违反了。当一个函数做得太多时,尽管你需要分解它

现在我并不是说这不是一个迹象

在我看来,你需要一个类来计算功率,一个类来管理打印

但是:假设我需要实现一个我将调用的API,它将返回计算能力的PDF。我需要一个api,将计算和打印结果

然后我将创建GetSquareValueOutput,它将负责协调从SquareValueCalculator类获取数据,然后使用Printer类进行打印

最后一个GetSquareValueOutput也可以称为computePowerAndPrintResult,它不会破坏任何东西。我不会选择这个名字,因为它暗示着代码的味道,但最终它只是一个上下文问题。

TL;DR:将名称更改为printSquare。那么这个名字要短得多,同样准确地描述了你所做的事情,但是。。。如果你真的想担心单一责任原则,你还是在违反它。这更多地说明了SRP是如何被过度热情地应用的,而不是一种糟糕的方法

深入研究这个名字 “computePower”是个坏名字,原因有二:

“幂”是一个X到Yth幂的二进制运算,而实际上你并没有这么做;您已将Y锁定为“2”,并且该操作也有一个通用名称:“square”

“计算”通常是多余的。平方已经意味着计算正在进行。看看java的AtomicInteger或BigInteger,它们的方法名为add,在BI的情况下,应该是plus,但重点是,它不是computePlus。注意,这取决于几个因素;例如,在java中,使用get启动属性getter是很常见的,在一个具有不相关属性的类中,或者说square没有人们想说的那么清楚,它的几何相关,因此square可能被误解为是指形状而不是数学运算,那么这也过于简单化了

这意味着方法名的一部分应该是正方形,而不是computePower

然后我们有了andPrintResult部分。这里的结果是多余的。除了结果,它还会打印什么

您有两种选择:

此方法应命名为square,并应返回该值,而不打印任何内容。用另一种方法打印东西。 “作为一个代码气味是……”。。嗯。大概你可以把这个方法命名为printSquare,它很短,很清晰,不包含和,但是,它和computePowerAndPrintResults一样违反了规则。
在许多方面,printSquare直接违反了SRP,但如果您将名称更改为reportSquare,代码将计算该正方形,然后通过依赖项注入(例如“reporter output stream”)将其报告给已配置的注入,突然之间它没有违反SRP,但我们所做的只是重新定义一些单词,代码保持不变。

也许您可以使用内置库函数,例如python中的pow和javascript中的Math.pow,现在,对于您的问题,您可以使用pow