No hay una sola solución para este tipo de problema.
Boolean tiene una semántica muy baja. Si desea agregar en el futuro una nueva condición, deberá agregar un nuevo parámetro ...
Después de cuatro años de mantenimiento, su método puede tener media docena de parámetros, si estos parámetros son todos booleanos, es una trampa muy agradable para mantenedores.
Enum es una buena opción si los casos son exclusivos. Los mensajes se pueden migrar fácilmente a una máscara de bits o a un objeto de contexto.
Máscara de bits: C++ incluye el lenguaje C, puede utilizar algunas viejas prácticas simples. En algún momento una máscara de bit en un int sin signo es una buena opción (pero se pierde la verificación de tipo) y puede pasar por error una máscara incorrecta. Es una forma conveniente de moverse sin problemas desde un argumento booleano o enum a este tipo de patrón. La máscara de bits se puede migrar con cierto esfuerzo a un objeto de contexto. Puede que tenga que implementar algún tipo de aritmética de bits como operator |
y operator &
si tiene que mantener una compatibilidad de compilación.
La herencia es a veces una buena elección si la división del comportamiento es grande y este comportamiento SE RELACIONA con el ciclo de vida de la instancia. Tenga en cuenta que también tiene que usar polimorfismo y esto puede ralentizar el método si este método se usa mucho.
Y, finalmente, la herencia induce el cambio en todos los códigos de fábrica ... ¿Y qué harás si tienes varios métodos para cambiar de forma exclusiva? Desordenarás tu código de clases específicas ... De hecho, creo que esta no es una muy buena idea en general.
Método dividido: Otra solución es a veces dividir el método en varios privados y proporcionar dos o más métodos públicos.
Objeto de contexto: C++ y C falta de parámetro con nombre se puede pasar por alto agregando un parámetro de contexto. Utilizo este patrón muy a menudo, especialmente cuando tengo que pasar muchos datos a través del nivel de un marco complejo.
class Context{
public:
// usually not a good idea to add public data member but to my opinion this is an exception
bool setup:1;
bool foo:1;
bool bar:1;
...
Context() : setup(0), foo(0), bar(0) ... {}
};
...
Context ctx;
ctx.setup = true; ...
MyObj.foo(ctx);
Nota: Que esto también es útil para minimizar el acceso (o uso) de los datos estáticos o consulta a Singleton objeto, TLS ... objeto Context puede contener una mayor cantidad de caché de datos relacionados con un algoritmo . ... dejo a tu imaginación ...
patrones Anti
añado aquí varias patrón contra (para evitar un cambio de firma): * Nunca haga esto *
- * Nunca haga esto * utilizar un int/bool estático para pasar argumento (algunas personas que hacen eso, y esto es una pesadilla para eliminar este tipo de cosas). Interrumpir al menos los hilos múltiples ...
- * NUNCA HAGA ESTO * agregue un miembro de datos para pasar el parámetro al método.
En mi humilde opinión, no empieces. Será difícil de mantener con el tiempo. Y eventual refactorización es mucho más difícil entonces. – Keith
@Keith - Disculpa, no tengo claro qué querías decir. No empieces, ¿qué? – LeopardSkinPillBoxHat
No empieces a usar métodos condicionales como ese. Ya sea una subclase o un método separado que la persona que llama puede decidir. – Keith