Creo que el título "¿Indicadores de método como argumentos o como variables miembro?" puede ser subóptimo, pero como me falta algún atm de terminología mejor, aquí va:
Actualmente estoy tratando de entender el problema de si las banderas para un método de clase ( privado ) deben pasarse como argumentos de función o mediante una variable miembro y / o si hay algún patrón o nombre que cubra este aspecto y / o si esto sugiere algunos otros problemas de diseño.
Por ejemplo (el lenguaje podría ser C ++, Java, C #, realmente no importa en mi humilde opinión):
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;
}
}
Lo que vemos arriba es que el método InternalStuffInvoker
toma un argumento que no se usa dentro de esta función, sino que solo se reenvía al otro método privado DoInternalStuff
. (Dónde DoInternalStuff
se utilizará de forma privada en otros lugares de esta clase, por ejemplo, en el DoThatStuff
método (público)).
Una solución alternativa sería agregar una variable miembro que lleve esta información:
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;
}
}
Especialmente para cadenas de llamadas profundas donde el indicador de selección para el método interno se selecciona afuera, el uso de una variable miembro puede hacer que las funciones intermedias sean más limpias, ya que no necesitan llevar un parámetro de paso.
Por otro lado, esta variable miembro no representa realmente ningún estado de objeto (ya que no está establecida ni disponible fuera), sino que es realmente un argumento adicional oculto para el método privado "interno".
¿Cuáles son los pros y los contras de cada enfoque?