Sospetto di aver commesso un errore da scolaro qui, e sto cercando chiarimenti. Molte delle classi nella mia soluzione (C #) - oserei dire la maggior parte - ho finito per scrivere un'interfaccia corrispondente per. Per esempio. un'interfaccia "ICalculator" e una classe "Calculator" che la implementa, anche se non sono mai in grado di sostituire quella calcolatrice con un'implementazione diversa. Inoltre, la maggior parte di queste classi risiedono nello stesso progetto delle loro dipendenze - in realtà hanno solo bisogno di essere internal
, ma hanno finito per essere public
come effetto collaterale di implementazione delle rispettive interfacce.
Penso che questa pratica di creare interfacce per tutto derivasse da alcune falsità: -
1) Originariamente pensavo che fosse necessaria un'interfaccia per creare mock test di unità (sto usando Moq), ma da allora ho scoperto che una classe può essere derisa se i suoi membri sono virtual
, e ha un costruttore senza parametri (correggimi se sbaglio).
2) Inizialmente pensavo che fosse necessaria un'interfaccia per registrare una classe con il framework IoC (Castle Windsor), ad es.
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
quando infatti potevo semplicemente registrare il tipo concreto contro se stesso:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) Utilizzando le interfacce, ad es. parametri di costruzione per l'iniezione di dipendenza, risultati in "accoppiamento lento".
Quindi sono impazzito con le interfacce ?! Sono a conoscenza degli scenari in cui useresti "normalmente" un'interfaccia, ad es. esponendo una API pubblica, o per cose come la funzionalità "collegabile". La mia soluzione ha un piccolo numero di classi che si adattano a tali casi d'uso, ma mi chiedo se tutte le altre interfacce non siano necessarie e debbano essere rimosse? Per quanto riguarda il punto 3) sopra, non violerò un "accoppiamento lento" se dovessi farlo?
Modifica : - Sto solo giocando con Moq, e sembra che i metodi siano pubblici e virtuali, e abbiano un pubblico costruttore senza parametri, per essere in grado di deriderli. Quindi sembra che non possa avere classi interne quindi?