Ini sangat tergantung. Jika nilai yang digunakan oleh pembantu Anda adalah primitif, maka metode statis adalah pilihan yang baik, seperti yang ditunjukkan Péter.
Jika mereka kompleks, maka SOLID berlaku, lebih khusus S , yang saya dan D .
Contoh:
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();
}
}
Ini tentang masalah Anda. Anda dapat membuat makeEveryBodyAsHappyAsPossible
metode statis, yang akan mengambil parameter yang diperlukan. Pilihan lain adalah:
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]);
}
}
Sekarang OurHouse
tidak perlu tahu tentang seluk-beluk aturan distribusi cookie. Itu harus sekarang hanya objek, yang mengimplementasikan aturan. Implementasinya diabstraksi menjadi sebuah objek, siapa yang bertanggung jawab untuk menerapkan aturan tersebut. Objek ini dapat diuji secara terpisah. OurHouse
dapat diuji dengan menggunakan tiruan belaka CookieDistributor
. Dan Anda dapat dengan mudah memutuskan untuk mengubah aturan distribusi cookie.
Namun, berhati-hatilah agar Anda tidak berlebihan. Sebagai contoh, memiliki sistem 30 kelas yang kompleks bertindak sebagai implementasi dari CookieDistributor
, di mana setiap kelas hanya memenuhi tugas kecil, tidak terlalu masuk akal. Interpretasi saya terhadap SRP adalah bahwa hal itu tidak hanya menentukan bahwa setiap kelas mungkin hanya memiliki satu tanggung jawab, tetapi juga bahwa satu tanggung jawab tunggal harus dijalankan oleh satu kelas tunggal.
Dalam kasus primitif atau objek yang Anda gunakan seperti primitif (misalnya objek yang mewakili titik dalam ruang, matriks atau sesuatu), kelas helper statis sangat masuk akal. Jika Anda memiliki pilihan, dan itu benar-benar masuk akal, maka Anda mungkin benar-benar mempertimbangkan untuk menambahkan metode ke kelas yang mewakili data, misalnya masuk akal jika Point
memiliki add
metode. Sekali lagi, jangan berlebihan.
Jadi tergantung pada masalah Anda, ada berbagai cara untuk menyelesaikannya.