Questa domanda è puntuale per me - stavo scrivendo quasi esattamente tale codice ieri. Basta sostituire "Animal" con qualsiasi cosa sia rilevante nel mio progetto, anche se rimarrò con "Animal" per il gusto di discutere qui. Invece di un'istruzione "switch", ho avuto una serie un po 'più complessa di istruzioni "if", che coinvolgono molto più del semplice confronto di una variabile con determinati valori fissi. Ma questo è un dettaglio. Un metodo statico di fabbrica mi è sembrato un modo pulito di progettare le cose, dal momento che il design è emerso dal refactoring dei precedenti fastidiosi pasticci di codice.
Ho respinto questo disegno sulla base della classe base che ha conoscenza della classe derivata. Se le classi LandAnimal e SeaAnimal sono piccole, ordinate e semplici, possono trovarsi nello stesso file sorgente. Ma ho grandi metodi disordinati per leggere i file di testo non conformi agli standard definiti ufficialmente - Voglio la mia classe LandAnimal nel proprio file sorgente.
Ciò porta alla dipendenza circolare dei file - LandAnimal è derivato da Animal, ma Animal deve sapere già che LandAnimal, SeaAnimal e quindici altre classi esistono. Ho tirato fuori il metodo factory, l'ho messo nel suo file (nella mia applicazione principale, non nella mia libreria Animals) Avere un metodo statico di fabbrica mi sembrava carino e intelligente, ma mi sono reso conto che in realtà non risolveva alcun problema di progettazione.
Non ho idea di come questo si riferisca al C # idiomatico, dal momento che cambio molto linguaggio, di solito ignoro idiomi e convenzioni peculiari di lingue e stack di sviluppo al di fuori del mio solito lavoro. Semmai la mia C # potrebbe sembrare "pitonica" se ciò è significativo. Mirare alla chiarezza generale.
Inoltre, non so se ci sarebbe un vantaggio nell'usare il metodo statico di fabbrica nel caso di classi piccole e semplici che difficilmente verranno estese in futuro: avere tutto in un unico file sorgente potrebbe essere bello in alcuni casi.