这真的取决于。正如Péter指出的那样,如果您的助手使用的值是基元,则静态方法是一个不错的选择。
如果它们是复杂的,那么SOLID适用,更具体的小号,在我和ð。
例:
class CookieJar {
function takeCookies(count:Int):Array<Cookie> { ... }
function countCookies():Int { ... }
function ressuplyCookies(cookies:Array<Cookie>
... // lot of stuff we don't care about now
}
class CookieFan {
function getHunger():Float;
function eatCookies(cookies:Array<Cookie>):Smile { ... }
}
class OurHouse {
var jake:CookieFan;
var jane:CookieFan;
var cookies:CookieJar;
function makeEveryBodyAsHappyAsPossible():Void {
//perform a lot of operations on jake, jane and the cookies
}
public function cookieTime():Void {
makeEveryBodyAsHappyAsPossible();
}
}
这将与您的问题有关。您可以创建makeEveryBodyAsHappyAsPossible
一个静态方法,该方法将使用必要的参数。另一个选择是:
interface CookieDistributor {
function distributeCookies(to:Array<CookieFan>):Array<Smile>;
}
class HappynessMaximizingDistributor implements CookieDistributor {
var jar:CookieJar;
function distributeCookies(to:Array<CookieFan>):Array<Smile> {
//put the logic of makeEveryBodyAsHappyAsPossible here
}
}
//and make a change here
class OurHouse {
var jake:CookieFan;
var jane:CookieFan;
var cookies:CookieDistributor;
public function cookieTime():Void {
cookies.distributeCookies([jake, jane]);
}
}
现在OurHouse
无需了解Cookie分发规则的复杂性。它现在仅必须是一个对象,该对象将实现规则。该实现被抽象为一个对象,对象的全部责任是应用规则。可以单独测试该对象。OurHouse
可以仅使用的模拟进行测试CookieDistributor
。而且,您可以轻松地决定更改Cookie分配规则。
但是,请注意不要过度使用它。例如,有一个由30个类组成的复杂系统充当的实现CookieDistributor
,而每个类仅完成一项微小的任务,就没有任何意义。我对SRP的解释是,它不仅规定每个班级可能只有一个责任,而且还要求由一个班级承担单个责任。
对于基元或像基元一样使用的对象(例如,表示空间中的点,矩阵或某物的对象),静态助手类很有用。如果您有选择,并且确实有道理,那么您实际上可以考虑将一种方法添加到表示数据的类中,例如Point
,拥有一个add
方法是明智的。同样,不要过度使用它。
因此,根据您的问题,有不同的解决方法。