Tôi nghĩ tiêu đề "Phương thức cờ là đối số hoặc là biến thành viên?" có thể là tối ưu, nhưng vì tôi thiếu bất kỳ thuật ngữ nào tốt hơn, nên ở đây:
Hiện tại tôi đang cố gắng giải quyết vấn đề liệu các cờ cho một phương thức ( riêng tư ) nhất định có được chuyển qua làm đối số hàm hay thông qua biến thành viên hay không và liệu có một mẫu hoặc tên nào đó bao hàm khía cạnh này và / hoặc cho dù điều này gợi ý ở một số vấn đề thiết kế khác.
Ví dụ (ngôn ngữ có thể là C ++, Java, C #, không thực sự quan trọng IMHO):
class Thingamajig {
private ResultType DoInternalStuff(FlagType calcSelect) {
ResultType res;
for (... some loop condition ...) {
...
if (calcSelect == typeA) {
...
} else if (calcSelect == typeX) {
...
} else if ...
}
...
return res;
}
private void InteralStuffInvoker(FlagType calcSelect) {
...
DoInternalStuff(calcSelect);
...
}
public void DoThisStuff() {
... some code ...
InternalStuffInvoker(typeA);
... some more code ...
}
public ResultType DoThatStuff() {
... some code ...
ResultType x = DoInternalStuff(typeX);
... some more code ... further process x ...
return x;
}
}
Những gì chúng ta thấy ở trên là phương thức InternalStuffInvoker
này có một đối số hoàn toàn không được sử dụng bên trong hàm này mà chỉ được chuyển tiếp sang phương thức riêng tư khác DoInternalStuff
. (Trường hợp DoInternalStuff
sẽ được sử dụng riêng ở những nơi khác trong lớp này, ví dụ: trong DoThatStuff
phương thức (công khai).)
Một giải pháp thay thế sẽ là thêm một biến thành viên mang thông tin này:
class Thingamajig {
private ResultType DoInternalStuff() {
ResultType res;
for (... some loop condition ...) {
...
if (m_calcSelect == typeA) {
...
} ...
}
...
return res;
}
private void InteralStuffInvoker() {
...
DoInternalStuff();
...
}
public void DoThisStuff() {
... some code ...
m_calcSelect = typeA;
InternalStuffInvoker();
... some more code ...
}
public ResultType DoThatStuff() {
... some code ...
m_calcSelect = typeX;
ResultType x = DoInternalStuff();
... some more code ... further process x ...
return x;
}
}
Đặc biệt đối với các chuỗi cuộc gọi sâu nơi cờ chọn cho phương thức bên trong được chọn bên ngoài, sử dụng biến thành viên có thể làm cho các hàm trung gian sạch hơn, vì chúng không cần phải mang tham số truyền qua.
Mặt khác, biến thành viên này không thực sự đại diện cho bất kỳ trạng thái đối tượng nào (vì nó không được đặt cũng không có sẵn bên ngoài), nhưng thực sự là một đối số bổ sung ẩn cho phương thức riêng tư "bên trong".
Những ưu và nhược điểm của từng phương pháp là gì?