(nel contesto di .NET per quello che vale)Quando sono necessarie le interfacce?
Tendo a non utilizzare l'ereditarietà e raramente utilizzo le interfacce. Mi sono imbattuto in qualcuno che pensa che le interfacce siano la cosa migliore dopo lo sputo. Li usa ovunque. Non capisco questo e quindi le domande che seguono. Voglio solo un controllo sulla mia comprensione delle interfacce.
Se si utilizzano le interfacce in tutto il mondo, presumo che sia possibile prevedere il futuro, i requisiti delle app sono inchiodati e nulla cambierà mai nella tua app. Per me, soprattutto durante lo sviluppo iniziale, le interfacce diventano un ostacolo. L'app è molto dinamica attraverso la sua vita. Se devi sottrarre o aggiungere membri all'interfaccia, molte cose si romperanno. Il tizio sopra dice che crea un'altra interfaccia per gestire i nuovi membri. Niente si rompe
Non è quella composizione? Perché non usare la composizione senza interfacce? Più flessibile.
Come gestisce il caso in cui un membro deve essere sottratto dall'interfaccia? Fondamentalmente lui no. Le cose si rompono e questo è fantastico perché ora puoi vedere tutte le aree interessate e risolverle. Invece di capire in modo più elegante dove sono tutti i percorsi di codice correlati, dovremmo semplicemente strappare parti di classi attraverso la forza bruta?
Penso a un'applicazione software come un grafico. Un grafico completo è il caso peggiore, avendo n (n-1)/2. Ciò significa che ogni classe parla con ogni classe. Una ragnatela confusa. n-1 è il migliore, in cui la loro è una rigida gerarchia di comunicazione. L'aggiunta di un'altra interfaccia solo per compensare un nuovo membro necessario aggiunge un vertici al grafico, il che significa più margini e una più forte realizzazione dell'equazione n (n-1)/2. La composizione senza interfacce è più simile a mixins. Solo le classi selezionate usano metodi particolari. Con un'interfaccia, tutte le classi sono obbligate a utilizzare i membri, anche se non ne hanno bisogno. L'approccio composizione/mixin non aggiunge nuovi bordi non necessari.
Devo essere in disaccordo con alcune delle vostre ipotesi. Le interfacce e l'ereditarietà hanno i loro usi e il refactoring dell'applicazione nel corso della sua vita è prevedibile. "Perché non usare la composizione senza interfacce?" Perché puoi testare elegantemente se gli oggetti disparati espongono un'interfaccia. – overslacked
In realtà l'analisi del grafico è giusta ma la tua conclusione è sbagliata. Se hai n chiamanti che chiamano m callees hai n * m bordi. Se tutte queste chiamate possono essere eseguite tramite un'interfaccia singola (ottimistica ma plausibile), allora hai solo bordi n + m. La distribuzione efficace delle interfacce ridurrà notevolmente la complessità del grafico. – CurtainDog
"... tutte le chiamate possono essere controllate attraverso un'unica interfaccia ..." Forse in un'applicazione molto semplice. "... allora hai solo bordi n + m."Se l'interfaccia è ereditata da classi che usano tutti i membri dell'interfaccia, allora è una lavata. Il mio scenario si riferisce al caso che impazzisci con le interfacce Leggi ancora l'ultima frase – 4thSpace