Questo dipende davvero. Se i valori su cui i tuoi aiutanti operano sono primitivi, i metodi statici sono una buona scelta, come ha sottolineato Péter.
Se sono complessi, si applica SOLID , in particolare S , I e < a href="http://en.wikipedia.org/wiki/Dependency_inversion_principle"> D .
Esempio:
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();
}
}
Questo riguarderebbe il tuo problema. puoi rendere makeEveryBodyAsHappyAsPossible
un metodo statico, che prenderà i parametri necessari. Un'altra opzione è:
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]);
}
}
Ora OurHouse
non ha bisogno di conoscere la complessità delle regole di distribuzione dei cookie. Deve solo ora un oggetto, che implementa una regola. L'implementazione viene sottratta ad un oggetto, la cui unica responsabilità è quella di applicare la regola. Questo oggetto può essere testato separatamente. OurHouse
può essere testato con l'utilizzo di un semplice mock di CookieDistributor
. E puoi facilmente decidere di cambiare le regole di distribuzione dei cookie.
Tuttavia, fai attenzione a non esagerare. Ad esempio, avere un sistema complesso di 30 classi si comporta come l'implementazione di CookieDistributor
, in cui ogni classe svolge semplicemente un piccolo compito, in realtà non ha senso. La mia interpretazione dell'SRP è che non solo stabilisce che ogni classe può avere una sola responsabilità, ma anche che una singola responsabilità dovrebbe essere svolta da una singola classe.
Nel caso di primitive o oggetti usati come primitive (per esempio oggetti che rappresentano punti nello spazio, matrici o qualcosa del genere), le classi di helper statico hanno molto senso. Se hai la scelta, e ha davvero senso, potresti effettivamente considerare di aggiungere un metodo alla classe che rappresenta i dati, ad es. è ragionevole che un Point
abbia un metodo add
. Ancora una volta, non esagerare.
Quindi, a seconda del problema, ci sono diversi modi per farlo.