Según SOLID, no solo debe crear la interfaz, y no solo debe estar en un archivo diferente, sino que debe estar en un ensamblaje diferente.
¿Por qué? Debido a que cualquier cambio en un archivo fuente que se compila en un ensamblaje requiere la recompilación del ensamblaje, y cualquier cambio en un ensamblaje requiere la recompilación de cualquier ensamblaje dependiente. Entonces, si su objetivo, basado en SOLID, es poder reemplazar una implementación A con una implementación B, mientras que la clase C que depende de la interfaz I no tiene que saber la diferencia, debe asegurarse de que el ensamblaje con I en esto no cambia, protegiendo así los usos.
"Pero es solo una recompilación" Te escucho protestar. Bueno, eso puede ser, pero en la aplicación de su teléfono inteligente, que es más fácil en el ancho de banda de datos de sus usuarios; ¿descargar un binario que cambió o descargar ese binario y otros cinco con código que depende de él? No todos los programas están escritos para ser consumidos por computadoras de escritorio en una LAN. Incluso en ese caso, donde el ancho de banda y la memoria son baratos, las versiones de parches más pequeñas pueden tener valor porque son triviales para enviar a toda la LAN a través de Active Directory o capas de administración de dominio similares; sus usuarios esperarán solo unos segundos para que se aplique la próxima vez que inicien sesión en lugar de unos minutos para que todo se reinstale. Sin mencionar que, cuantos menos ensambles se deben volver a compilar al construir un proyecto, más rápido se construirá,
Ahora, el descargo de responsabilidad: esto no siempre es posible o factible de hacer. La forma más fácil de hacer esto es crear un proyecto centralizado de "interfaces". Esto tiene sus propios inconvenientes; el código se vuelve menos reutilizable porque el proyecto de interfaz Y el proyecto de implementación deben ser referenciados en otras aplicaciones que reutilicen la capa de persistencia u otros componentes clave de su aplicación. Puede superar ese problema dividiendo las interfaces en ensamblajes más estrechamente acoplados, pero luego tiene más proyectos en su aplicación, lo que hace que una compilación completa sea muy dolorosa. La clave es el equilibrio y mantener el diseño débilmente acoplado; por lo general, puede mover los archivos según sea necesario, por lo que cuando vea que una clase necesitará muchos cambios o que se necesitarán nuevas implementaciones de una interfaz regularmente (tal vez para interactuar con versiones de otro software recientemente admitidas,