Secondo SOLID, non solo dovresti creare l'interfaccia e non solo dovrebbe essere in un file diverso, ma dovrebbe essere in un assembly diverso.
Perché? Poiché qualsiasi modifica a un file di origine che viene compilata in un assembly richiede la ricompilazione dell'assembly e qualsiasi modifica a un assembly richiede la ricompilazione di qualsiasi assembly dipendente. Quindi, se il tuo obiettivo, basato su SOLID, è di poter sostituire un'implementazione A con un'implementazione B, mentre la classe C dipendente dall'interfaccia I non deve conoscere la differenza, devi assicurarti che l'assemblaggio con I in esso non cambia, proteggendo così gli usi.
"Ma è solo una ricompilazione" Ti sento protestare. Beh, potrebbe essere, ma nell'app per smartphone, che è più facile sulla larghezza di banda dei dati degli utenti; scaricando un binario che è cambiato o scaricando quel binario e altri cinque con codice che dipende da esso? Non tutti i programmi sono scritti per essere utilizzati dai computer desktop su una LAN. Anche in quel caso, dove la larghezza di banda e la memoria sono economiche, i rilasci di patch più piccoli possono avere valore perché sono banali da inviare all'intera LAN attraverso Active Directory o livelli di gestione del dominio simili; i tuoi utenti aspetteranno solo pochi secondi per essere applicato al successivo accesso invece di pochi minuti per la reinstallazione dell'intera cosa. Per non parlare del fatto che, minore è il numero di assiemi che devono essere ricompilati durante la costruzione di un progetto, più velocemente sarà costruito,
Ora, il disclaimer: questo non è sempre possibile o fattibile da fare. Il modo più semplice per farlo è creare un progetto centralizzato di "interfacce". Questo ha i suoi lati negativi; il codice diventa meno riutilizzabile perché è necessario fare riferimento al progetto di interfaccia E al progetto di implementazione in altre app riutilizzando il livello di persistenza o altri componenti chiave dell'app. Puoi ovviare a questo problema suddividendo le interfacce in assiemi più strettamente accoppiati, ma poi hai più progetti nella tua app che rendono una build completa molto dolorosa. La chiave è l'equilibrio e il mantenimento del design liberamente accoppiato; di solito puoi spostare i file in base alle necessità, quindi quando vedi che una classe avrà bisogno di molte modifiche o che nuove implementazioni di un'interfaccia saranno necessarie regolarmente (forse per interfacciarsi con le versioni di altri software supportate di recente,