tipos tipo polimorfismo interfaz interfaces implementacion herencia clases abstractas c#

tipo - polimorfismo c#



Interfaz C#e implementación en el mismo archivo-¿buena idea? (7)

Claro que no hace daño tenerlo así, y herramientas como resharper pondrán la implementación debajo de la interfaz en el código. Sin embargo, también le dan la opción de mover la implementación a otro archivo.

Tiene razón, no le impide explotar los beneficios de las interfaces para la prueba de unidades, pero es posible que desee considerar colocar las interfaces en otro conjunto por completo. De esa manera, podría programar contra interfaces e intercambiar implementaciones a voluntad, dándole más separación. Como siempre, no hay una respuesta correcta o incorrecta, solo se reduce a lo que usted está tratando de lograr.

Hace poco vi un código C # donde la declaración de la interfaz y la implementación están en el mismo archivo, como este

namespace MyNameSpace.Foo { public interface IFoo{ void DoThis(); } public class Foo : IFoo { public void DoThis(); } }

A primera vista, parece incorrecto tener una declaración e implementación en el mismo archivo, pero hay beneficios prácticos. Por ejemplo, cuando va a la definición en Visual Studio, la interfaz y la implementación están en el mismo archivo. Este enfoque no le prohíbe tener otras implementaciones de la interfaz, como pueden ser necesarias para las pruebas unitarias. Para interfaces que solo tendrán una implementación, creo que esto puede ser un enfoque pragmático.

¿Buena o mala idea?

Extendiendo la pregunta:
¿Cómo usa la gente Visual Studio para navegar a una implementación cuando tiene una referencia de interfaz IFoo myFoo = FooFactory.getFoo(MY_FOO); Si hago clic derecho en IFoo y selecciono Ir a definición, puedo obtener la declaración de la interfaz. ¿Hay alguna manera de obtener la lista de implementaciones de IFoo, ya que eso es lo que realmente me interesa obtener?


Considero esto como una mala idea.

Mantenga la interfaz y la implementación separadas. De lo contrario hay posibilidades para que arruines el diseño. Incluya el archivo y obtenga la implementación automáticamente incluso si solo desea la interfaz, luego accidentalmente (porque es conveniente) use el Impl en lugar de la interfaz y sí, cierre el acoplamiento.


Lo hago en java para interfaces pequeñas con pocos métodos. En este caso, proporciono una o más implementaciones básicas en el archivo de interfaz.

Esto evita pequeñas clases dispersas alrededor.

Pero no puedo decir si es una mala práctica o las mejores prácticas, aunque mis compañeros de trabajo nunca se quejaron.


Me limito a seguir la regla de "una clase, un archivo". Con clase también me refiero a interfaces, enumeraciones, etc.

¿Y qué hay de malo en poner el cursor en el nombre de la interfaz y presionar F12?


Mi recomendación es seguir siempre una regla de un elemento por archivo .cs, ya sea una declaración de enumeración, una interfaz o una clase. El nombre del archivo .cs debe coincidir con el nombre de la cosa que contiene.

Regla simple, fácil de seguir. Utilizamos StyleCop internamente para controlar esto.

Si combina este enfoque con un uso razonable de los espacios de nombres, entonces debería significar que la vista del explorador de soluciones en Visual Studio facilita la navegación por los componentes de sus proyectos. Tenga en cuenta que ReSharper ofrece un enfoque alternativo a esta navegación, pero usarlo no es para todos los gustos (y no todos pueden tener un complemento como ReSharper).

Travis G ha preguntado acerca de los puntos más finos, como delegados y declaraciones personalizadas de EventArgs. Como los EventArgs personalizados son clases, los pondría en sus propios archivos (de nuevo, manteniendo la regla simple). Los delegados los declararía con la clase que los usa. Si descubrí que había muchos delegados que se usaron en muchos lugares, podría considerar colocarlos a todos en un archivo Delegates.cs (a veces hago esto con constantes, en un archivo Consts.cs).

Sin embargo, parte de esto es ciertamente subjetivo y se adentra en los campos de las guerras religiosas de software.


Personalmente...

Si solo es probable que se use una interfaz (a corto plazo) para una clase (como cuando se proporciona una interfaz para inyección de dependencia), la colocaré en la parte superior del archivo de clase. Durante el desarrollo (cuando la clase puede estar cambiando) es un PITA tener que cambiar dos archivos cada vez que cambia la superficie pública.

Por supuesto, si existe la posibilidad de que la interfaz sea implementada por más de una clase, entonces la coloco en un archivo separado.


Tener la definición y la implementación de la interfaz en el mismo archivo no tiene nada que ver con las pruebas unitarias, ya que esa interfaz estará disponible de todos modos.

Generalmente comienzo con una interfaz simple y una implementación en el mismo archivo. Cuando las cosas crecen, las divido cuando otro código necesita hacer referencia a esa interfaz.