Yo y otros dos colegas estamos tratando de entender cómo diseñar mejor un programa. Por ejemplo, tengo una interfaz ISoda
y múltiples clases que implementan la interfaz como Coke
, Pepsi
, DrPepper
, etc ....Usa correctamente la inyección de dependencia
Mi colega está diciendo que es mejor para poner estos elementos en una base de datos como una llave/valor par. Por ejemplo:
Key | Name
--------------------------------------
Coke | my.namespace.Coke, MyAssembly
Pepsi | my.namespace.Pepsi, MyAssembly
DrPepper | my.namespace.DrPepper, MyAssembly
... entonces tiene archivos de configuración XML que se asignan a la entrada de la clave correcta, consultar la base de datos de la clave, a continuación, crear el objeto.
No tengo razones específicas, pero siento que este es un mal diseño, pero no sé qué decir ni cómo argumentar correctamente en contra.
Mi segundo colega sugiere que microadministremos cada una de estas clases. Así que, básicamente, la entrada sería ir a través de una sentencia switch, algo similar a esto:
ISoda soda;
switch (input)
{
case "Coke":
soda = new Coke();
break;
case "Pepsi":
soda = new Pepsi();
break;
case "DrPepper":
soda = new DrPepper();
break;
}
Esto parece un poco mejor para mí, pero sigo pensando que hay una mejor manera de hacerlo. He estado leyendo sobre contenedores IoC los últimos días y parece una buena solución. Sin embargo, todavía soy muy nuevo en los paquetes de inyección de dependencia y IoC, por lo que no sé cómo defenderlo correctamente. ¿O tal vez soy el equivocado y hay una mejor manera de hacerlo? Si es así, ¿alguien puede sugerir un método mejor?
¿Qué tipo de argumentos puedo presentar para convencer a mis colegas de que prueben otro método? ¿Cuáles son los pros/contras? ¿Por qué deberíamos hacerlo de una manera?
Desafortunadamente, mis colegas son muy resistentes al cambio, así que estoy tratando de descubrir cómo puedo convencerlos.
Editar:
parece que mi pregunta es un poco difícil de entender. Lo que intentamos averiguar es cómo diseñar mejor una aplicación que utiliza múltiples interfaces y contiene muchos tipos concretos que implementan esas interfaces.
Sí, sé que almacenar estas cosas en la base de datos es una mala idea, pero simplemente no sabemos de una mejor manera. Es por eso que estoy preguntando cómo lo hacemos mejor.
public void DrinkSoda(string input)
{
ISoda soda = GetSoda(input);
soda.Drink();
}
¿Cómo podemos implementar correctamente GetSoda
? ¿Deberíamos reconsiderar todo el diseño? Si es una mala idea pasar cadenas mágicas como esta, ¿cómo deberíamos hacerlo?
Entradas del usuario como "Diet Coke", "Coke", "Coke Lime", o lo que sea que instancia un tipo de Coke
, por lo que varias palabras clave se asignan a un solo tipo.
Mucha gente ha dicho que el código anterior es malo. Sé que es malo. Estoy buscando razones para presentarlas a mis colegas y discutir por qué es malo y por qué tenemos que cambiar.
Pido disculpas si esta explicación aún es difícil de entender. Es difícil para mí describir la situación porque realmente no entiendo cómo expresarlo en palabras.
Es realmente difícil entender cuál es el problema real que está tratando de resolver. – mquander
Su segundo bloque de código se ve como algo que vería al usar el patrón de fábrica. ¿Está preguntando cómo determinar el tipo de ISode que se le pasó? – NitroxDM
Guau - almacenar nombres de tipos en la base de datos, usar un archivo XML para asignar palabras a los registros de la base de datos, y luego usar el reflejo para crear instancias de ellos - ahora ** que ** es ** empresarial! ** – Aaronaught