Das hängt wirklich davon ab. Wenn die Werte, mit denen Ihre Helfer arbeiten, primitiv sind, sind statische Methoden eine gute Wahl, wie Péter hervorhob.
Wenn sie komplex sind, dann SOLID gilt, insbesondere die S , die ich und die D .
Beispiel:
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();
}
}
Hier geht es um Ihr Problem. Sie können machen makeEveryBodyAsHappyAsPossible
eine statische Methode, die in den notwendigen Parametern nehmen. Eine andere Option ist:
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]);
}
}
Jetzt OurHouse
müssen Sie nicht mehr über die Feinheiten der Cookie-Verteilungsregeln Bescheid wissen. Es muss erst jetzt ein Objekt sein, das eine Regel implementiert. Die Implementierung wird in ein Objekt abstrahiert, dessen alleinige Verantwortung darin besteht, die Regel anzuwenden. Dieses Objekt kann isoliert getestet werden. OurHouse
kann mit einem bloßen Schein der getestet werden CookieDistributor
. Und Sie können leicht entscheiden, die Regeln für die Cookie-Verteilung zu ändern.
Achten Sie jedoch darauf, dass Sie es nicht übertreiben. Ein komplexes System von 30 Klassen ist beispielsweise die Implementierung von CookieDistributor
, bei der jede Klasse nur eine winzige Aufgabe erfüllt, was nicht wirklich Sinn macht. Meine Interpretation des SRP ist, dass es nicht nur vorschreibt, dass jede Klasse nur eine Verantwortung hat, sondern dass eine einzelne Verantwortung von einer einzelnen Klasse ausgeführt werden sollte.
Bei Primitiven oder Objekten, die Sie wie Primitive verwenden (z. B. Objekte, die Punkte im Raum, Matrizen oder ähnliches darstellen), sind statische Hilfsklassen sehr sinnvoll. Wenn Sie die Wahl haben und es wirklich sinnvoll ist, können Sie der Klasse, die die Daten darstellt, tatsächlich eine Methode hinzufügen, z. B. ist es sinnvoll Point
, eine add
Methode zu haben . Wieder nicht übertreiben.
Abhängig von Ihrem Problem gibt es verschiedene Möglichkeiten, dies zu tun.