Io e altri due colleghi stiamo cercando di capire come progettare al meglio un programma. Ad esempio, ho un'interfaccia ISoda
e classi multiple che implementano tale interfaccia come Coke
, Pepsi
, DrPepper
, ecc ....Utilizzare correttamente dipendenza dipendenza
mio collega sta dicendo che è meglio mettere questi elementi in un database come una chiave/valore paio. Per esempio:
Key | Name
--------------------------------------
Coke | my.namespace.Coke, MyAssembly
Pepsi | my.namespace.Pepsi, MyAssembly
DrPepper | my.namespace.DrPepper, MyAssembly
... quindi avere i file di configurazione XML che mappano l'input per la chiave corretta, interrogare il database per la chiave, quindi creare l'oggetto.
Non ho motivi specifici, ma mi sembra che questo sia un cattivo progetto, ma non so cosa dire o come argomentare correttamente contro di esso.
Il mio secondo collega sta suggerendo di gestire micro ognuna di queste classi. Quindi, in pratica l'ingresso sarebbe passare attraverso uno switch, qualcosa di simile a questa:
ISoda soda;
switch (input)
{
case "Coke":
soda = new Coke();
break;
case "Pepsi":
soda = new Pepsi();
break;
case "DrPepper":
soda = new DrPepper();
break;
}
questo sembra un po 'meglio per me, ma io continuo a pensare che ci sia un modo migliore per farlo. Ho letto i contenitori IoC negli ultimi giorni e sembra una buona soluzione. Tuttavia, sono ancora molto nuovo all'input di dipendenza e ai contenitori IoC, quindi non so come discuterlo correttamente. O forse sono io quello sbagliato e c'è un modo migliore per farlo? Se è così, qualcuno può suggerire un metodo migliore?
Che tipo di argomenti posso portare sul tavolo per convincere i miei colleghi a provare un altro metodo? Quali sono i pro/contro? Perché dovremmo farlo in un modo?
Sfortunatamente, i miei colleghi sono molto resistenti al cambiamento, quindi sto cercando di capire come posso convincerli.
Edit:
Sembra che la mia domanda è un po 'difficile da capire. Quello che stiamo cercando di capire è come progettare al meglio un'applicazione che utilizza più interfacce e contiene molti tipi concreti che implementano tali interfacce.
Sì, so che archiviare questa roba nel database è una cattiva idea, ma semplicemente non conosciamo un modo migliore. Questo è il motivo per cui sto chiedendo a come facciamo.
public void DrinkSoda(string input)
{
ISoda soda = GetSoda(input);
soda.Drink();
}
Come implementare correttamente GetSoda
? Dovremmo ripensare l'intero design? Se è una cattiva idea passare le stringhe magiche come questa, allora come dovremmo farlo?
Gli input utente come "Diet Coke", "Coca Cola", "Coca Cola" o qualsiasi altro istanzializza un tipo di Coke
, quindi più parole chiave vengono mappate su un singolo tipo.
Un sacco di persone hanno detto che il codice pubblicato sopra è cattivo. So che è cattivo. Sto cercando dei motivi per presentare ai miei colleghi e discutere perché è male e perché dobbiamo cambiare.
Mi scuso se questa spiegazione è ancora difficile da capire. È difficile per me descrivere la situazione perché non capisco davvero come metterla in parole.
È davvero difficile capire quale sia il vero problema che stai cercando di risolvere. – mquander
Il secondo blocco di codice sembra qualcosa che si vedrebbe quando si utilizza il modello di fabbrica. Stai chiedendo come determinare il tipo di ISode passato a te? – NitroxDM
Wow - memorizzando i nomi dei tipi nel database, utilizzando un file XML per mappare le parole ai record del database e quindi usando il reflection per istanziarli - ora ** that ** is ** enterprisey! ** – Aaronaught