Penso che il titolo "Il metodo contrassegna come argomenti o come variabili membro?" potrebbe essere subottimale, ma siccome mi manca una migliore terminologia atm., ecco qui:
Attualmente sto cercando di capire se i flag per un dato metodo di classe ( private ) dovrebbero essere passati come argomenti di funzione o tramite variabile membro e / o se c'è qualche modello o nome che copre questo aspetto e / o se questo suggerisce alcuni altri problemi di progettazione.
Per esempio (il linguaggio potrebbe essere C ++, Java, C #, non importa veramente 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;
}
}
Quello che vediamo sopra è che il metodo InternalStuffInvoker
prende un argomento che non è usato all'interno di questa funzione, ma è solo inoltrato all'altro metodo privato DoInternalStuff
. (Dove DoInternalStuff
verrà utilizzato privatamente in altri luoghi in questa classe, ad esempio nel metodo DoThatStuff
(pubblico).)
Una soluzione alternativa sarebbe aggiungere una variabile membro che trasporta queste informazioni:
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;
}
}
Soprattutto per le catene di chiamate profonde in cui il flag di selezione per il metodo interno viene selezionato all'esterno, l'uso di una variabile membro può rendere più pulite le funzioni intermedie, poiché non è necessario il parametro pass-through.
D'altra parte, questa variabile membro non rappresenta realmente alcuno stato dell'oggetto (poiché non è né impostato né disponibile all'esterno), ma è in realtà un argomento aggiuntivo nascosto per il metodo privato "interno".
Quali sono i pro e i contro di ciascun approccio?