Điều này thực sự phụ thuộc. Nếu các giá trị mà trình trợ giúp của bạn hoạt động là nguyên thủy, thì các phương thức tĩnh là một lựa chọn tốt, như Péter đã chỉ ra.
Nếu họ rất phức tạp, sau đó RẮN áp dụng, cụ thể hơn là S thì tôi và D .
Thí 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();
}
}
Đây sẽ là về vấn đề của bạn. Bạn có thể tạo makeEveryBodyAsHappyAsPossible
một phương thức tĩnh, sẽ lấy các tham số cần thiết. Một lựa chọn khác là:
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]);
}
}
Bây giờ OurHouse
không cần biết về sự phức tạp của các quy tắc phân phối cookie. Nó chỉ phải bây giờ là một đối tượng, trong đó thực hiện một quy tắc. Việc thực hiện được trừu tượng hóa thành một đối tượng, trách nhiệm duy nhất của ai là áp dụng quy tắc. Đối tượng này có thể được thử nghiệm trong sự cô lập. OurHouse
có thể được kiểm tra bằng cách sử dụng một mock đơn thuần của CookieDistributor
. Và bạn có thể dễ dàng quyết định thay đổi quy tắc phân phối cookie.
Tuy nhiên, hãy cẩn thận rằng bạn không làm quá. Ví dụ, có một hệ thống phức tạp gồm 30 lớp đóng vai trò là việc thực hiện CookieDistributor
, trong đó mỗi lớp chỉ hoàn thành một nhiệm vụ nhỏ, không thực sự có ý nghĩa. Giải thích của tôi về SRP là nó không chỉ ra lệnh rằng mỗi lớp chỉ có thể có một trách nhiệm, mà còn một trách nhiệm duy nhất nên được thực hiện bởi một lớp duy nhất.
Trong trường hợp nguyên thủy hoặc đối tượng bạn sử dụng như nguyên thủy (ví dụ các đối tượng đại diện cho các điểm trong không gian, ma trận hoặc một cái gì đó), các lớp trợ giúp tĩnh có rất nhiều ý nghĩa. Nếu bạn có sự lựa chọn và nó thực sự có ý nghĩa, thì bạn thực sự có thể xem xét việc thêm một phương thức vào lớp đại diện cho dữ liệu, ví dụ như Point
việc có một add
phương thức là hợp lý . Một lần nữa, đừng lạm dụng nó.
Vì vậy, tùy thuộc vào vấn đề của bạn, có nhiều cách khác nhau để đi về nó.