Mantener todo de acoplamiento flexible y extensible: Demasiadas capas, demasiado pequeño retorno de la inversión?

StackOverflow https://stackoverflow.com/questions/1251015

Pregunta

I (ahora más que nunca) Ver los desarrolladores a escribir grandes cantidades de capas tales como:

implementation PresentationLayer ->
    interface IMyDTO ->
        implementation MyDTO ->
            interface IMyService -> 
                implementation MyService -> 
                    interface IMyDomainRepository ->
                        implementation MyDomainRepository ->
                            interface IMyDomainObject -> 
                                implementation MyDomainObject ->
                                    interface IMyIndependentStorageLayer ->
                                        implementation MyMSSQLStorageLayer

Mirando a través de los blogs de C #, esta parece ser la mejor desde el pan en rodajas. Básicamente, todo lo que se acopla sin apretar. No utilice un objeto de dominio directamente. Ejecutar todo a través de una capa de servicio. Acceder a los datos a través de un repositorio. Todas las capas son perfectamente independientes.

No me malinterpreten, me gusta la idea, pero no es el trade-off en el tiempo enorme, especialmente en un proyecto más amplio? Es el retorno de la inversión en el mantenimiento realmente lo suficientemente grande como para justificar esto?

Las explicaciones que he leído son un poco raro, por ejemplo, "de esta manera puedo adjuntar una base de datos diferente si me necesitan". De Verdad? No creo que es un problema común que alguien de repente exige cambiar de MSSQL a Oracle y ahora siento y deseo que tenía un millón de capas que no todos saben el uno del otro.

¿Hay una tendencia de ir al agua con acoplamiento débil, o estoy simplemente leyendo los blogs equivocadas? ¿Cómo se siente acerca de esto, y ha tenido casos en los que eras muy contento después de que lo hizo el trabajo extra en el principio?

¿Fue útil?

Solución

Es muy difícil diseñar el negocio alineado concepción correcta de un software. Es decir con una ROI aceptable.

Sin embargo, para mí, el número de capas o el nivel de bajo acoplamiento de una concepción de software depende del contexto en el que se utilizará el software!

Si no está seguro acerca de lo que el software tiene que hacer, y no será probablemente no grandes modificaciones o agrega en el futuro, una aplicación de muy bajo nivel de acoplamiento con un montón de capas no es la solución. Porque hace que la arquitectura demasiado complejo sin ninguna razón y el tiempo invertido para la arquitectura no es rentable ...
Por otro lado, si usted sabe que la aplicación tendrá que ser personalizado para cada cliente y será sin duda modificar en profundidad, por lo que el tiempo dedicado a una arquitectura de bajo nivel de acoplamiento es una buena idea ...
acoplamiento de bajo nivel puede ser inteligente cuando se desea volver a utilizar parte del código para ninguna otra aplicación. En este caso, pase el tiempo para el diseño es totalmente rentable, por supuesto.
Entonces, en resumen, he de decir que todo depende de la evolución del software en el futuro y el potencial de reutilización de código para otras aplicaciones.
Pero es una buena práctica para mí hacerlo no de forma sistemática una arquitectura muy compleja.

Otros consejos

Obviamente, puede ser exagerado, y uno tiene que saber "dónde parar" la adición de capas.

Mi regla de oro es que si una capa no tiene que incluir cualquier funcionalidad / Código significativa, no lo necesito. Dicho esto, la capacidad de prueba es una cosa significativa, por lo que si una capa me compra una mejor capacidad de prueba, que se sumará a él.

Ninguna de las aplicaciones de diseño viene sin un precio. Aquí el precio se incrementa complexibility. Siempre hay que mira a través de sus opciones antes de elegir el que se adapte a sus necesidades el mejor.

Con eso se dice, creo que tu pregunta suena un poco parcial. En el mundo real, puede que no suelen ver a un cliente exige un nuevo tipo de base de datos, pero a menudo se puede ver a un nuevo cliente que quiere que el mismo tipo de datos de acceso que el anterior, pero en otra base de datos. No es sólo alrededor de la facilidad de cambio, se trata también de reutilización de códigos.

Al evaluar estas cosas por lo general encuentran que es útil para mirar a través de la lente del principio DRY y mirando a la duplicación en su proyecto.

Si está utilizando una arquitectura que es más complejo que su proyecto va a tender a ver una gran cantidad de capas que envuelven poco, además de otras capas y transmitir llamadas. Esto se repite a sí mismo.

Si por el contrario estás usando una arquitectura delgada de un sistema complejo puede encontrarse con que la creación de funcionalidad en una parte del sistema no le permite volver a utilizar esa funcionalidad en otra parte, lo que obligó a escribir un montón de muy código similar en todo el lugar. Esto se repite a sí mismo.

En mi experiencia, si está alerta para identificar la duplicación y constantemente refactorización para eliminarlo, la estructura se presentará a usted. Digamos por ejemplo que estás empezando con una arquitectura bastante básico, pero rompiendo las cosas en métodos tan pronto como tienen que ser reutilizados, y rompiendo métodos cabo en clases tan pronto como tienen que ser reutilizados por otras clases. Entonces es posible que con el tiempo darse cuenta de que sus 13 helper / Gestor / clases de controlador que ha escrito para eliminar la duplicación realmente se ven un poco como que están asumiendo la responsabilidad que podría haber sido definido con mayor claridad si hubiera entrado en una capa de servicio.

Puede ser difícil saber cuándo vale la pena, pero creo que la clave del éxito en la construcción de un sistema con un montón de capas es ser muy claro con lo que las responsabilidades de las diferentes capas deben tener. Cualquier capa se agrega debe ser útil para usted en la reducción de la complejidad de las operaciones en la capa por encima de ella y lo que es más fácil de tejer juntos funcionalidad de una manera elegante.

Tome un proyecto ejemplo hipotético. Las pruebas utilizan diferentes bases de datos SQLite en proceso para la velocidad, la base de datos de desarrollo en el ordenador de algún desarrollador es PostgreSQL, la base de datos puesta en escena es una única instalación de Oracle y la base de datos de producción es un masivamente escalable, muy caro, y muy difícil de configurar Oracle cluster.

¿Cómo alguna vez lograr eso sin separar la capa de SQL desde la capa de negocio?

Es una tendencia reciente, y los conductores menos experimentados / arquitectos están siendo presa de subirse al carro.

En el proyecto que estoy en, acceso a datos fue:

Interfaz de Servicio -> Implementación de servicio -> interfaz de delegado -> Implementación Delegado -> Interfaz de DAO -> Implementación DAO -.> Ibatis XML

Esta era (y es!) Mal en nuestro caso, ya que la mayoría del código en cualquier método de delegar la ejecución era una sola línea; que acaba de llamar la DAO. Por cada DAO, tuvimos dos clases adicionales y una configuración adicional de frijol, y no nos ganar nada en absoluto de esto.

Aceptar el cambio, refactor, y seguir adelante. Utilizar tantas capas como sea necesario para reconstruir aparte diferentes conceptos ... y luego se detiene. Si no hay ninguna mejora percibida por escrito algo de código, excepto que seguirá una plantilla, o bien reducir la velocidad y tratar de entender por qué la plantilla hizo eso, o aceptar que la plantilla es inadecuado para su aplicación e ignorar esa parte.

Actualmente estoy trabajando en un proyecto SOA grande donde se desacopla todas las capas, y casi cada clase se instancia a través de alguna fábrica abstracta. Ahora estamos tratando de descargar parte de la funcionalidad existente en los servicios alojados por separado, y es una verdadera pesadilla de pasar por las capas tratando de extrapolar los bits importantes porque hay un sin fin haga clic derecho> Ir a la definición que perseguir ... por lo que estaba a sólo 1 línea de código en la capa más externa!

No hay nada malo con desacoplamiento de por sí, y por cierto, incluso en mi proyecto hay muchas áreas en las que me resulta útil desde el punto de vista arquitectónico. Eso sí, no se deje llevar ... ser pragmáticos, y sopesar las ventajas / desventajas cuando se examinan las áreas que está considerando para desacoplar.

Saludos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top