He trabajado/visto algunos proyectos de aplicaciones web de hibernación de primavera que tienen tantas interfaces como clases de dao y servicio real.¿Por qué siempre tener interfaces de implementación únicas en las capas de servicio y dao?
siempre pensé que estos dos como las principales razones para tener estas interfaces de aplicación individuales:
primavera puede cablear implementación real como dependencias en una clase dada (acoplamiento débil)
public class Person { @Autowired private Address address; @Autowired private AccountDetail accountDetail; public Person(Address address, AccountDetail accountDetail) { // constructor
Mientras estoy probando la unidad, puedo crear clases simuladas y probar una clase aisladamente.
Address mockedAddress = mock(Address); AccountDetail mockedAccountDetail = mock(AccountDetail); Person underTestPerson = new Person(mockedAddress, mockedAccountDetail); // unit test follows
embargo, en los últimos tiempos, me di cuenta de que:
primavera puede cablear las clases concretas de aplicación como dependencias:
public class Person {
@Autowired
private AddressImpl address;
@Autowired
private AccountDetailImpl accountDetail;
public Person(AddressImpl address, AccountDetailImpl accountDetail) {
// constructor
marcos Mock como EasyMock pueden burlarse de clases concretas, así
AddressImpl mockedAddress = mock(AddressImpl);
AccountDetailImpl mockedAccountDetail = mock(AccountDetailImpl);
Person underTestPerson = new Person(mockedAddress, mockedAccountDetail);
// unit test follows
Además, según la discusión this, creo que el resumen es que, en una sola aplicación, las interfaces se usan en exceso, probablemente fuera de la convención o el hábito. Por lo general, tienen más sentido en los casos en que interactuamos con otra aplicación, por ejemplo, slf4j, utilizada por muchas aplicaciones en todo el mundo. Dentro de una sola aplicación, una clase es casi una abstracción como lo es una interfaz.
Por lo tanto, mi pregunta es por qué todavía necesitamos interfaces y luego tenemos implementaciones únicas como * clases ServiceImpl y * DaoImpl e innecesariamente aumentamos el tamaño de nuestra base de códigos. ¿Hay algún problema en burlarse de las clases concretas que no conozco?
Cada vez que hablo de esto con mis compañeros, la única respuesta que recibo es que el servicio de implementación y las clases dao basadas en interfaces es EL DISEÑO que todos siguen: mencionan las mejores prácticas de primavera, OOP, DDD, etc. todavía no se obtiene una razón pragmática detrás de tener tantas interfaces dentro de una aplicación aislada.
En cuanto a las respuestas que obtuvo, no veo cómo se puede invocar a DDD como una razón para lanzar una interfaz en frente de cada objeto. DDD no tiene nada que ver con eso. Incluso OOP es una mala justificación. Si toma elementos como L, I y D de SOLID, solo especifican cómo debe diseñar abstracciones, como interfaces y para qué debe usarlas, y no * las debe usar todo el tiempo *. Así que como dijiste, creo que todo se reduce a lo de "mejores prácticas de primavera" o simplemente a las personas que lo hacen por hábito. – guillaume31