2009-09-08 23 views
5

En un componente OO, cuando se tiene sólo una aplicación disponible para una clase y que la clase no se haya publicado a otros componentes, ¿aún así es aconsejable tener una interfaz y trabajar con la interfaz?(Programación a una interfaz v/s trabajar con clase concreta) cuando sólo hay una clase concreta

Soy plenamente consciente de la 'programación de una interfaz' principio de diseño y también lo utilizan ampliamente.

Últimamente, he estado observando que la mayoría de las veces una aplicación diferente (aunque sea posible y tendría sentido) no es necesaria. Como resultado de trabajar siempre con interfaces, el código de la aplicación tendría una buena cantidad de interfaces con una sola implementación para cada una y la interfaz parece una sobrecarga.

En su lugar, es preferible trabajar sólo con la clase concreta e introducir la interfaz sólo cuando se necesita una segunda aplicación? De todos modos, hoy en día extraer una interfaz usando IDEs es muy sencillo. Y cuando se introduce la nueva interfaz, las referencias a la antigua clase concreta se pueden cambiar para usar la nueva interfaz en su lugar.

¿Qué opinas?

+0

Posible engaño - http://stackoverflow.com/questions/720115/should-you-create-an-interface-when-there-currently-is-only-going-to-be-one-cla – Nate

Respuesta

0

Que yo sepa, hay tres situaciones en las que una interfaz se justifica:

  1. Es parte de la arquitectura (Admito que esto no está muy bien definida).
  2. tiene más de 1 aplicación.
  3. Es una interfaz pública.

No tenga miedo de usar clases concretas. No genere mecánicamente una interfaz para cada clase.

6

Creación de interfaces para tipos concretos es un acto de equilibrio delicado como usted puede crear fácilmente una explosión interfaz que proporciona ningún beneficio y sólo complica el espacio de dominio con tipos redundantes.

Mi regla de oro es crear sólo interfaces para tipos que son parte de una API de cara al público. Todos los tipos que están dedicados a la implementación de la API y nunca están expuestos desde la API no necesitan una interfaz.

+0

+1 b/c al mover elementos de no-usar-una-interfaz a usar-una-interfaz, puede ser imposible si es parte de su API pública y ha lanzado su código a usuarios externos. – Shizzmo

13

Una de las razones por las que sigo programando en una interfaz incluso con una sola implementación es porque hace que escribir mis pruebas sea un lote más fácil. Puedo configurar proxies para probar lo que quiero probar y no tengo que preocuparme por el acoplamiento ajustado.

Esto no siempre va a ser conveniente, pero es algo vale la pena pensar cuando usted está tratando de decidir. ¿Crees que deberás probar ampliamente esta clase/objeto? Si crees que lo serás, puede ser mucho más fácil lidiar con la interfaz que con la clase concreta.

La alternativa a la que sería la de no utilizar la interfaz y subclase de la clase concreta, que trabaja también, pero de nuevo depende.

+0

Estoy de acuerdo, he estado saliendo últimamente de '¿cuál es la solución más comprobable y repetible'? Pensar en eso ha permitido que mi base de código sea mucho más simple y, al mismo tiempo, muy impulsada, en los frentes más importantes, por las interfaces. – nyxtom

+1

Tanto EasyMock como JMock admiten la burla de clase, por lo que el argumento de prueba es mudo. –

+1

Esto tiende a ponerte en el infierno de la interfaz. Si no necesita declarar sus métodos como definitivos, puede usar la clasificación de easymock. Si esa no es una opción, puede usar powermock. Hoy no hay excusa para agregar interfaces solo para facilitar las pruebas. Al menos no en las circunstancias mencionadas anteriormente. – Buhb

3

Interfaces Se crearán, no se ha creado. Debería tener una necesidad específica de una interfaz antes de crear una. Si no ha necesitado más de una implementación, no necesita una interfaz. Recuerde siempre, YAGNI

+2

Estoy de acuerdo. Solo recuerde poner su sombrero de cliente al desarrollar - si su clase será utilizada por otros lo maldecirán si no proporciona una interfaz. Puede que no lo necesite, pero lo harán si la clase tiene funcionalidades/dependencias de importancia. – SingleShot

+0

@SingleShot De acuerdo, depende del tipo de software que está escribiendo. Una gran cantidad de software de "aplicación" no está escrito con actores externos en mente – Kevin

0

Además de las buenas respuestas ya dadas (facilidad de prueba y API públicas) me gusta usar interfaces porque hace que sea más fácil enfocarse en "qué" deberían estar haciendo sus clases que "cómo" lo están haciendo.

0

Generalmente: No. No necesita una interfaz si solo está implementando la funcionalidad una vez. Las interfaces como las de todo tienen un compromiso: introducen un poco más de trabajo (costo) y pueden aportar un beneficio adicional. Si el costo supera el beneficio, ¡probablemente no deberías hacerlo!

Cuestiones relacionadas