Eu acho que o título "Método sinalizadores como argumentos ou como variáveis de membro?" pode ser subótimo, mas como estou perdendo uma terminologia melhor, aqui vai:
Atualmente, estou tentando entender o problema de saber se os sinalizadores para um determinado método de classe ( privado ) devem ser passados como argumentos de função ou via variável de membro e / ou se existe algum padrão ou nome que cubra esse aspecto e / ou se isso sugere alguns outros problemas de design.
Por exemplo (a linguagem pode ser C ++, Java, C #, realmente não importa 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;
}
}
O que vemos acima é que o método InternalStuffInvoker
usa um argumento que não é usado dentro dessa função, mas é encaminhado apenas para o outro método privado DoInternalStuff
. (Onde DoInternalStuff
será usado em particular em outros lugares desta classe, por exemplo, no DoThatStuff
método (público).)
Uma solução alternativa seria adicionar uma variável de membro que carregasse essas informações:
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 cadeias de chamadas profundas em que o sinalizador seletor para o método interno é selecionado fora, o uso de uma variável de membro pode tornar as funções intermediárias mais limpas, pois elas não precisam carregar um parâmetro de passagem.
Por outro lado, essa variável de membro não está realmente representando nenhum estado do objeto (como não está definida nem disponível fora), mas é realmente um argumento adicional oculto para o método privado "interno".
Quais são os prós e os contras de cada abordagem?