これは本当に依存します。ヘルパーが操作する値がプリミティブの場合、Péterが指摘したように、静的メソッドが適切な選択です。
それらが複雑な場合、SOLID、より具体的にはS、I、およびDが適用されます。
例:
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();
}
}
これはあなたの問題についてでしょう。あなたはできる作りmakeEveryBodyAsHappyAsPossible
に必要なパラメータになります静的メソッドを、。別のオプションは次のとおりです。
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]);
}
}
今OurHouse
クッキー配分ルールの複雑さについて知っている必要はありません。ルールを実装するオブジェクトのみが必要になります。実装は抽象化されてオブジェクトになります。オブジェクトの唯一の責任はルールを適用することです。このオブジェクトは単独でテストできます。OurHouse
単なるモックを使用してテストできますCookieDistributor
。また、Cookieの配布ルールを簡単に変更できます。
ただし、無理をしないように注意してください。たとえば、30クラスの複雑なシステムがの実装として機能するCookieDistributor
場合、各クラスは単に小さなタスクを実行するだけで、実際には意味がありません。SRPの私の解釈は、各クラスが1つの責任しか持たないことを指示するだけでなく、1つのクラスが1つの責任を実行する必要があるということです。
プリミティブのように使用するプリミティブまたはオブジェクト(たとえば、空間内のポイント、マトリックス、または何かを表すオブジェクト)の場合、静的ヘルパークラスは非常に理にかなっています。選択肢があり、それが本当に理にかなっている場合、データを表すクラスにメソッドを追加することを実際に検討することができます。たとえばPoint
、add
メソッドを持つのが賢明です。繰り返しますが、無理をしないでください。
そのため、問題に応じて、さまざまな方法で対処できます。