2011-03-17 13 views
15

Creo que estructurar mis proyectos como muchas personas lo hacen. Usted tiene una capa de datos (DAO), capa de servicio (servicios) y capa de presentación (Spring MVC, Wicket, ...).División de servicios -> Business Objects?

Por lo general, un servicio comienza siendo bastante simple y 'corto'. Poco a poco, sin embargo, el servicio debe admitir más y más casos de uso hasta que, después de un tiempo, se convierte en una gran clase con muchas líneas y métodos, y es difícil de leer y mantener. En ese momento, puede decidir quedarse con él o comenzar a refactorizar, que es un trabajo engorroso y "peligroso" que puede llevar mucho trabajo.

Estoy buscando una solución para evitar la necesidad de futuras refacciones.
Un enfoque podría ser dividir sus servicios en varios subservicios y hacer de su servicio original una fachada de servicio. Entonces, por ejemplo, en lugar de un gran UserService, podría tener un UserServiceFacade que delegue las llamadas a PasswordService, RegistrationService, ....

No es una mala solución creo, pero no estoy demasiado con ello porque:

  1. difícil de definir de antemano en la que subservicios dividir el trabajo; si missjudged, usted todavía puede ser que necesite te aftwards Refactor o tener un servicio con sólo un método, por ejemplo,
  2. reutilización de la lógica de negocios puede ser más difícil si, por ejemplo, PasswordService y RegistrationService requerir una funcionalidad común

Otra solución podría usar Business Objects que (a mi entender) también se puede ver como un subservicio, pero luego uno por UseCase específico, por lo que puede tener BO's como CreateUserBO, CheckPasswordBO, DeleteUserBO, ....

estoy un poco más entusiasta acerca de este enfoque porque, en mi opnion, ofrece bastantes ventajas:

  1. el propio Bo es muy fácil de leer y sólo lo hace con su contrato le obliga a hacer; todo lo demás se puede delegar a otra BO, un solo BO será breve y al punto
  2. fácil de reutilizar la funcionalidad
  3. más fácil cambiar/conmutar la ejecución de un determinado caso de uso: simplemente inyectar otra aplicación con Spring
  4. fácil poner a prueba: sólo tiene que probar a uSECASE específica, las delegaciones a otra BO puede ser burlado
  5. colaboración: menos conflictos si varios desarrolladores trabajan en diferentes BO de entonces cuando trabajan en el mismo servicio

hago Sin embargo, también vemos algunas posibles desventajas:

  1. un poco de trabajo extra (en el término especie por lo menos)
  2. clases Mucho más que podría disminuir la legibilidad de su proyecto?
  3. una capa de más de abstracción: un paso adicional se requiere para encontrar la aplicación real de un caso de uso

La cuestión o más bien preguntas (lo siento) son:

  1. Are Business Objects la solución ideal para ¿este problema?
  2. ¿Estás de acuerdo con las ventajas/desventajas de los BO que menciono arriba y/o ves otros?
  3. ¿Existen otras (buenas) soluciones para evitar que megaservicios arruinen su día?
+2

+1 buena pregunta. – Nilesh

Respuesta

0

Con el primer enfoque menciona, en lugar de crear una 'fachada', ¿por qué no extender ese servicio? En ese tipo de situación, podrías volver a usar el código de la clase super/original.

Creo que si uno organiza su estructura de paquete de manera legible, entonces tener una cantidad de clases más pequeñas es preferible en cualquier caso tener grandes clases que tengan mucha funcionalidad y que estén en mayor riesgo de cambios .

Al final, creo que ambos enfoques son bastante similares, ya sea que puede terminar con un alto grado de reutilización de código, y si necesita actualizar algo estructurado, entonces es bastante fácil hacer un cambio global (relativamente hablando), y también es fácil hacer cambios específicos en la implementación.

+0

Entonces, ¿conserva el UserService pero también crea, por ejemplo, un PasswordService que amplíe UserService? –

+0

De hecho, ambas soluciones son similares, es una cuestión de granularidad. Aunque, con el enfoque BO, no necesita pensar demasiado sobre cómo organizar sus UseCases; solo toma una UseCase en ese momento (por clase). –

+2

Intentaré evitar el uso de la herencia si el único objetivo es la reutilización del código. si es posible, preferiría extraer el código común en una clase/objeto auxiliar y usar composición en su lugar. –

0

Lo que personalmente hago es que siempre uso una fachada por mis servicios. La lógica está en las clases internas del servicio, pero proporciono una interfaz que el cliente de ese servicio puede llamar.

trato de evitar desde el principio para poner ninguna lógica en la fachada. Es solo un código de placa de caldera que redirige a la lógica de código adecuada.

Así que incluso si el servicio tiene muchas características, la fachada es bastante mantenible.

Pero si el control de su base de origen conjunto, no debe dudar de refactorizar y subdividir, si usted comienza a tener demasiadas funciones en un solo servicio. Incluso si usa varias clases para hacer el trabajo, sepa claramente que su servicio será mejor a largo plazo.

+0

Tx, una fachada de servicio es sin duda un buen enfoque, pero esta fachada estaría allí en las dos soluciones anteriores. Sin embargo, refactorizar y subdividir una vez que un servicio se vuelve demasiado grande es exactamente lo que quiero evitar. –

+0

Si subdivide en advence, puede sobrediseñar. Si comienzas de forma simple, para mantenerte en forma, tendrás que refactorizar parte de tu código más adelante. No hay una solución genérica de bala de plata. –

4

te recomendaría que mirar a este artículo en Domain Driven Design si su aplicación es nada grave que la asignación de la universidad. La premisa básica es estructurar todo alrededor de sus entidades y tener un fuerte modelo de dominio. Diferenciar entre los servicios que proporcionan cosas relacionadas con la infraestructura (como el envío de correo electrónico, datos persistentes) y servicios que realmente hacen las cosas que son requisitos básicos de su negocio.

También sugeriría para explorar Spring Roo - que trae en algunas cosas revolucionario en la medida de lo strcuturing sus capas se refiere como no tener que necesitar DAO capas etc.

Espero que ayude.

+0

Nuestros proyectos son DDD al menos hasta un cierto nivel; hemos dividido nuestros dominios y están débilmente acoplados. Sin embargo, ¿podría explicar cómo DDD se relaciona con la cuestión de cómo dividir sus servicios en BO o subservicios? ¿Los BO son parte de la DDD? –

+0

Depende de su punto de vista. Si la suya es una aplicación escalonada y no compleja, entonces las BO's no representan realmente nada en DDD. Sin embargo, si tiene un modelo de dominio enriquecido y la lógica no tiene nada más que objetos de dominio, entonces cuestionaría la presencia de gran cantidad de Business Objects. Si no están machacando ninguna lógica, ¿por qué se llaman así "Business Objects"? – Nilesh