タイトルは「メソッドフラグを引数として、またはメンバー変数として?」最適ではないかもしれませんが、より良い用語のATMがないため、次のようになります。
私は現在、特定のクラス(プライベート)メソッドのフラグを関数の引数として渡すか、メンバー変数を介して渡すか、この側面をカバーするパターンまたは名前があるかどうか、および/またはこの問題を回避しようとしています。これが他の設計上の問題を示唆しているかどうか。
例(言語はC ++、Java、C#である可能性があり、実際には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;
}
}
上記では、メソッドInternalStuffInvoker
がこの関数内ではまったく使用されない引数を取り、他のプライベートメソッドにのみ転送されることがわかりDoInternalStuff
ます。(DoInternalStuff
このクラスの他の場所、たとえばDoThatStuff
(public)メソッドでプライベートに使用される場所。)
別の解決策は、この情報を運ぶメンバー変数を追加することです:
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;
}
}
特に、内部メソッドのセレクターフラグが外部で選択されているディープコールチェーンでは、メンバー変数を使用すると、パススルーパラメーターを渡す必要がないため、中間関数をよりクリーンにすることができます。
一方、このメンバー変数は実際にはオブジェクトの状態を表していません(外部では設定も利用もできないため)が、実際には「内部」プライベートメソッドの隠された追加の引数です。
各アプローチの長所と短所は何ですか?