Cela dépend vraiment. Si les valeurs que vos assistants exploitent sont des primitives, alors les méthodes statiques sont un bon choix, comme l'a souligné Péter.
Si elles sont complexes, puis SOLID applique, plus précisément le S , le I et le D .
Exemple:
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();
}
}
Ce serait à propos de votre problème. Vous pouvez créer makeEveryBodyAsHappyAsPossible
une méthode statique prenant en compte les paramètres nécessaires. Une autre option est:
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]);
}
}
Maintenant, OurHouse
je n'ai pas besoin de connaître la complexité des règles de distribution des cookies. Il doit seulement maintenant un objet, qui implémente une règle. L'implémentation est abstraite dans un objet dont la seule responsabilité est d'appliquer la règle. Cet objet peut être testé isolément. OurHouse
peut être testé avec un simple simulacre de CookieDistributor
. Et vous pouvez facilement décider de modifier les règles de distribution des cookies.
Cependant, veillez à ne pas en faire trop. Par exemple, avoir un système complexe de 30 classes agit comme une implémentation CookieDistributor
, chaque classe ne remplissant qu'une tâche minuscule, cela n'a pas vraiment de sens. Mon interprétation du SRP est qu’il ne stipule pas seulement que chaque classe ne peut avoir qu’une responsabilité, mais qu’une seule responsabilité doit être assumée par une classe.
Dans le cas de primitives ou d'objets que vous utilisez comme des primitives (par exemple, des objets représentant des points dans l'espace, des matrices ou autre), les classes d'assistance statique ont beaucoup de sens. Si vous avez le choix, et que cela a vraiment du sens, vous pourriez alors envisager d'ajouter une méthode à la classe représentant les données, par exemple, il est judicieux pour a Point
d'avoir une add
méthode. Encore une fois, n'en faites pas trop.
Donc, en fonction de votre problème, il y a différentes façons de s'y prendre.