Ich denke der Titel "Methodenflags als Argumente oder als Mitgliedsvariablen?" mag suboptimal sein, aber da mir eine bessere Terminologie fehlt, geht es weiter:
Ich versuche gerade, mich mit dem Problem auseinanderzusetzen, ob Flags für eine bestimmte ( private ) Klassenmethode als Funktionsargumente oder über eine Mitgliedsvariable übergeben werden sollen und / oder ob es ein Muster oder einen Namen gibt, der diesen Aspekt und / oder abdeckt ob dies auf andere Designprobleme hindeutet.
Zum Beispiel (Sprache könnte C ++, Java, C # sein, spielt meiner Meinung nach keine Rolle):
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;
}
}
Was wir oben sehen, ist, dass die Methode InternalStuffInvoker
ein Argument verwendet, das in dieser Funktion überhaupt nicht verwendet wird, sondern nur an die andere private Methode weitergeleitet wird DoInternalStuff
. (Wo DoInternalStuff
wird privat an anderen Orten in dieser Klasse verwendet, z. B. in der DoThatStuff
(öffentlichen) Methode.)
Eine alternative Lösung wäre das Hinzufügen einer Mitgliedsvariablen, die diese Informationen enthält:
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;
}
}
Insbesondere bei tiefen Aufrufketten, bei denen das Selektor-Flag für die innere Methode außerhalb ausgewählt ist, kann die Verwendung einer Elementvariablen die Zwischenfunktionen sauberer machen, da sie keinen Pass-Through-Parameter enthalten müssen.
Andererseits repräsentiert diese Mitgliedsvariable keinen Objektstatus (da sie weder festgelegt noch außerhalb verfügbar ist), sondern ist wirklich ein verstecktes zusätzliches Argument für die "innere" private Methode.
Was sind die Vor- und Nachteile jedes Ansatzes?