2010-03-09 21 views
10

Estoy creando el modelo de dominio en mi sistema. Al diseñar mis objetos modelo, ¿debo hacer interfaces para cada objeto de entidad? La gente me ha dicho que a nuestro nivel web no debería importarle la implementación de una entidad y que deberíamos poder cambiar implementaciones, pero no estoy seguro de que eso ocurra alguna vez.¿Los objetos del modelo deben tener interfaces?

Por ejemplo, si tenemos una clase del profesor que mantiene una lista de los estudiantes, el método getStudents podría ser:

public List<Student> getStudents() { 
     return this.students; 
} 

o esto:

public List<Student> getStudents() { 
    return someExternalService.retrieveStudents(); 
} 

entiendo este beneficio, pero ¿cuál es la práctica general?

+0

"práctica general" no es necesariamente lo mismo que "buenas prácticas", sobre todo cuando se trata de diseño OO :) – skaffman

+3

No entiendo tu ejemplo. ¿Su pregunta es si el profesor debería implementar alguna interfaz o usar una dependencia a través de una interfaz? Tengo respuestas diferentes para estos dos casos. Tu texto me hace pensar que estás pensando en lo primero, pero el ejemplo me hace pensar que quieres lo último. ¿Qué es? –

+0

Martinho, mi pregunta es si el profesor debería implementar una interfaz y tener las clases resultantes de TeacherImpl. – sma

Respuesta

7

A menos que tenga buenas razones para pensar que tendrá que cambiar el modelo, no me preocuparía todavía. Basado en el principio de YAGNI (You ain't gonna need it)

+0

Gracias por la respuesta. Estoy de acuerdo con ambos. De hecho, tengo un seguimiento de esto que publicaré como una pregunta separada. Implica asociaciones de modelado. – sma

+4

En mi opinión, YAGNI aplica más a la funcionalidad que al diseño. Las interfaces no contribuyen a la saturación del código ni a las complicaciones en las pruebas, por ejemplo; en mi experiencia, ese es el problema de la ausencia de interfaces en aras de la conveniencia. –

+0

@Noel - Creo que tienes razón sobre sus orígenes, pero creo que puede ser útil para evitar la sobreingeniería. He encontrado un par de ocasiones para decirle a alguien "No vas a necesitar eso" y pueden refutar tu reclamo y presentar un buen argumento para la adición, o pueden encontrar que no pueden justificarlo y decidir/darse cuenta de que es realmente no es un requisito Estoy de acuerdo en que en este caso no hay un gran daño al agregar interfaces, pero podría llevar a que se agregue más código "por si acaso". – David

2

Ninguno de los proyectos en los que he visto o participado tenía interfaces para entidades de dominio.

Sin embargo, en uno de mis proyectos que tenía interfaz NamedEntity:

public interface NamedEntity { 
    int getId(); 
    String getName(); 
} 

Todas las entidades del dominio implementado esta interfaz. Me dio la posibilidad de no crear diferentes convertidores jsf para diferentes entidades, sino crear un convertidor que utilizara esta interfaz en lugar de clases de dominio concretas.

+0

Buen ejemplo. Nitpick: decir que ninguno de los proyectos que has visto o participado tenía ese fenómeno, y luego rápidamente te proporcionará un ejemplo de uno ... –

+0

Este upvote reveló error (o simplemente un comportamiento claro) en tan contando reputación. – Roman

+0

Estoy de acuerdo. Realmente no quiero que nadie tenga una interfaz, pero otros están en desacuerdo. – sma

1

No puedo hablar de la práctica general, pero no se trata simplemente de ocultar la implementación.

Se trata de formalizar la interfaz como base para la documentación y los contratos.

Al abstraer sus modelos en interfaces, está creando documentación para desarrolladores de clientes de servicio. Dependiendo de su estilo de desarrollo, es posible que ya tenga o no una descripción formal de su servicio (por ejemplo, una descripción basada en WSDL). Las interfaces pueden llenar esa necesidad.

+0

En realidad, algo se aplica a mi situación. Hay desarrolladores de clientes de servicios que basan los servicios en mis objetos modelo, por lo que quizás el enfoque de la interfaz no sea malo. – sma

0

Mi opinión general es que no crearía un conjunto uno a uno de interfaces para los modelos de dominio, ya que esto no hace otra cosa que duplicar la estructura de clases de su modelo de dominio. No agrega nada útil.

Los dos casos que se me ocurre de inmediato donde sería tener en cuenta las interfaces de introducción está:

  1. una interfaz describe el contrato/comportamiento de un conjunto de clases en el modelo de dominio, donde es útil modelar el comportamiento que forma independiente de las clases que implementan
  2. que necesita para exponer su modelo de dominio a los clientes externos y querer ocultar los detalles de implementación de los

En otras palabras, agregue interfaces si lo ayudan a describir el comportamiento o lo ayudan a ocultar los detalles de implementación de los clientes. Otras razones pueden ser válidas, pero son dos las que se me ocurren.

+0

Sí, estoy completamente de acuerdo. Esto en realidad comenzó como el número 2 en el que exponíamos el modelo de dominio a clientes externos. Desde entonces, ese enfoque cambió y ahora estoy atascado con una interfaz para cada objeto modelo. Consideré deshacerme de él, pero quería consultar primero con la comunidad. – sma

1

Creo que hay una diferencia importante entre tener interfaz para el servicio para recuperar el objeto y el propio objeto modelo.

En tiempo de ejecución del servicio para cargar un objeto de modelo puede variar en función de donde se está solicitando los datos. Pero el formato y tipo de objeto de datos esperado no cambia, no importa cómo se crea este objeto. Por lo tanto, los objetos modelo que llevan el estado no necesitarían una interfaz, pero las clases de servicio para crear y cargar estos objetos modelo necesitan la interfaz.

La única razón para el modelo de objetos para tener las interfaces tendría sentido si modelo de objetos no es sólo un simple tipo de grano de objeto, sino objetos que expone a algún tipo de comportamiento.

0

Extracción de una interfaz es una de las refactorizaciones más simples; en el peor de los casos es un re-nombre de clase -> método de movimiento. El esfuerzo por cambiar de opinión, una vez que haya encontrado una razón para hacerlo, es mínimo. Siempre he encontrado que si una decisión es fácil de cambiar, refuerza YAGNI y KISS aún más. El contraargumento es que no es demasiado esfuerzo crear inicialmente una interfaz, lo cual es cierto, pero el mantenimiento se acumula con el tiempo si la decisión se toma muchas veces, a menudo no se usa.

Cuestiones relacionadas