Ho il sospetto di aver commesso un errore da scolaro qui e sto cercando chiarimenti. Molte classi nella mia soluzione (C #) - oserei dire la maggioranza - ho finito per scrivere un'interfaccia corrispondente per. Ad esempio un'interfaccia "ICalculator" e una classe "Calcolatrice" che la implementa, anche se non è probabile che sostituirò quella calcolatrice con un'implementazione diversa. Inoltre, la maggior parte di queste classi risiede nello stesso progetto delle loro dipendenze: devono solo esserlo internal
, ma hanno finito per essere public
un effetto collaterale dell'implementazione delle rispettive interfacce.
Penso che questa pratica di creazione di interfacce per tutto derivasse da alcune menzogne: -
1) Inizialmente pensavo che fosse necessaria un'interfaccia per creare simulazioni di unit test (sto usando Moq), ma da allora ho scoperto che una classe può essere derisa se i suoi membri lo sono virtual
, e ha un costruttore senza parametri (correggimi se Mi sbaglio).
2) Inizialmente pensavo fosse necessaria un'interfaccia per registrare una classe con il framework IoC (Castle Windsor), ad es
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
quando in effetti potrei semplicemente registrare il tipo concreto contro se stesso:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) L'uso di interfacce, ad es. Parametri del costruttore per l'iniezione delle dipendenze, provoca un "accoppiamento lento".
Quindi sono impazzito con le interfacce ?! Sono a conoscenza degli scenari in cui "normalmente" useresti un'interfaccia, ad esempio esporre un'API pubblica o per cose come la funzionalità "collegabile". La mia soluzione ha un numero limitato di classi che si adattano a tali casi d'uso, ma mi chiedo se tutte le altre interfacce non sono necessarie e dovrebbero essere rimosse? Riguardo al precedente punto 3), non dovrei violare l '"accoppiamento lento" se dovessi farlo?
Modifica : - Sto solo giocando con Moq, e sembra che i metodi siano pubblici e virtuali, e abbiano un costruttore pubblico senza parametri, per essere in grado di deriderli. Quindi sembra che non posso avere classi interne allora?