Isso realmente depende. Se os valores em que seus ajudantes operam são primitivos, os métodos estáticos são uma boa opção, como Péter apontou.
Se eles são complexos e, em seguida SÓLIDO aplica-se, mais especificamente, o S , o eu e o D .
Exemplo:
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();
}
}
Isso seria sobre o seu problema. Você pode criar makeEveryBodyAsHappyAsPossible
um método estático, que terá os parâmetros necessários. Outra opção é:
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]);
}
}
Agora OurHouse
não é necessário conhecer os meandros das regras de distribuição de cookies. Agora, ele deve apenas um objeto que implemente uma regra. A implementação é abstraída para um objeto, cuja única responsabilidade é aplicar a regra. Este objeto pode ser testado isoladamente. OurHouse
pode ser testado usando um mero mock do CookieDistributor
. E você pode facilmente decidir alterar as regras de distribuição de cookies.
No entanto, tome cuidado para não exagerar. Por exemplo, ter um sistema complexo de 30 classes age como a implementação de CookieDistributor
, onde cada classe apenas cumpre uma tarefa minúscula, realmente não faz sentido. Minha interpretação do SRP é que ele não apenas determina que cada classe possa ter apenas uma responsabilidade, mas também que uma única responsabilidade deve ser realizada por uma única classe.
No caso de primitivas ou objetos que você usa como primitivas (por exemplo, objetos representando pontos no espaço, matrizes ou algo assim), as classes auxiliares estáticas fazem muito sentido. Se você tem a opção, e isso realmente faz sentido, você pode realmente considerar adicionar um método à classe que representa os dados, por exemplo, é sensato que um Point
tenha um add
método. Novamente, não exagere.
Portanto, dependendo do seu problema, existem diferentes maneiras de solucioná-lo.