To naprawdę zależy. Jeśli wartości, na których operują pomocnicy, są prymitywne, dobrym wyborem są metody statyczne, jak zauważył Péter.
Jeśli są one skomplikowane, a następnie STAŁY dotyczy, bardziej szczegółowo z S , z I i D .
Przykład:
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();
}
}
To dotyczy twojego problemu. Państwo może uczynić makeEveryBodyAsHappyAsPossible
metodę statyczną, która będzie miała w niezbędnych parametrów. Inną opcją jest:
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]);
}
}
Teraz OurHouse
nie musisz wiedzieć o zawiłościach zasad dystrybucji plików cookie. Musi tylko teraz obiekt, który implementuje regułę. Implementacja jest abstrahowana od obiektu, którego wyłączną odpowiedzialnością jest stosowanie reguły. Ten obiekt można przetestować w izolacji. OurHouse
można przetestować za pomocą zwykłej makiety CookieDistributor
. Możesz łatwo zmienić zasady dystrybucji plików cookie.
Uważaj jednak, aby tego nie przesadzić. Na przykład posiadanie złożonego systemu 30 klas działa jako implementacja CookieDistributor
, w której każda klasa po prostu spełnia małe zadanie, naprawdę nie ma sensu. Moja interpretacja SRP jest taka, że nie tylko dyktuje, że każda klasa może mieć tylko jedną odpowiedzialność, ale także, że jedna klasa powinna być wypełniona przez jedną klasę.
W przypadku prymitywów lub obiektów, których używasz jak prymitywów (na przykład obiektów reprezentujących punkty w przestrzeni, macierzy lub czegoś takiego), statyczne klasy pomocnicze mają wiele sensu. Jeśli masz wybór, a to naprawdę ma sens, możesz rozważyć dodanie metody do klasy reprezentującej dane, np. Rozsądne jest, Point
aby mieć add
metodę. Ponownie, nie przesadzaj.
Zatem w zależności od problemu istnieją różne sposoby rozwiązania tego problemu.