¿Qué tan esencial es hacer una capa de servicio?

68

Comencé a crear una aplicación en 3 capas (DAL, BL, UI) [maneja principalmente CRM, algunos informes de ventas e inventario].

Un colega me dijo que debo pasar al patrón de capa de servicio, que los desarrolladores llegaron al patrón de servicio desde su experiencia y que es el mejor enfoque para diseñar la mayoría de las aplicaciones. Dijo que sería mucho más fácil mantener la aplicación en el futuro de esa manera.

Personalmente, tengo la sensación de que solo está haciendo las cosas más complejas y no podría ver mucho beneficio que justifique eso.

Esta aplicación tiene una pequeña interfaz de usuario parcial adicional que usa algunas (pero solo pocas) de las funciones de la aplicación de escritorio, por lo que me encontré duplicando algo de código (pero no mucho). Solo por alguna duplicación de código, no lo convertiría para que esté orientado al servicio, pero dijo que debería usarlo de todos modos porque en general es una muy buena arquitectura, ¿por qué los programadores son tan apasionados por los servicios?

Traté de buscar en Google, pero todavía estoy confundido y no puedo decidir qué hacer.

BornToCode
fuente

Respuestas:

58

El libro de Martin Fowler "Patrones de arquitectura empresarial" establece:

La pregunta más fácil de responder es probablemente cuándo no usarla. Probablemente no necesite una capa de servicio si la lógica de negocios de su aplicación solo tendrá un tipo de cliente, por ejemplo, una interfaz de usuario, y sus respuestas de casos de uso no involucran múltiples recursos transaccionales. [...]

Pero tan pronto como visualice un segundo tipo de cliente, o un segundo recurso transaccional en respuestas de casos de uso, vale la pena diseñar en una Capa de servicio desde el principio.

Los beneficios que proporciona una capa de servicio es que define un conjunto común de operaciones de aplicación disponibles para diferentes clientes y coordina la respuesta en cada operación. Cuando tiene una aplicación que tiene más de un tipo de cliente que consume su lógica empresarial y tiene casos de uso complejos que involucran múltiples recursos transaccionales, tiene sentido incluir una capa de servicio con transacciones administradas.

Con CRM, Ventas e Inventario habrá muchos casos de uso de tipo CRUD de los cuales casi siempre hay una correspondencia uno a uno con las operaciones de la Capa de Servicio. Las respuestas a la creación, actualización o eliminación de un objeto de dominio deben ser coordinadas y transaccionadas atómicamente por las operaciones de la capa de servicio.

Otro beneficio de tener una capa de servicio es que puede diseñarse para invocación local o remota, o ambas, y le brinda la flexibilidad para hacerlo. El patrón sienta las bases para la implementación encapsulada de la lógica de negocios de una aplicación y la invocación de esa lógica por parte de varios clientes de manera consistente. Esto significa que también reduce / elimina la duplicación de código, ya que sus clientes comparten los mismos servicios comunes. Potencialmente, también puede reducir los costos de mantenimiento, ya que cuando cambia la lógica de su negocio, (generalmente) solo necesita cambiar el servicio, y no cada uno de los clientes.

En resumen, es bueno usar una capa de servicio, más aún, así que creo que en su ejemplo ha proporcionado, ya que parece que tiene varios clientes de lógica empresarial.

Deco
fuente
2
Curiosamente, Martin Fowler defiende contra la misma interfaz para la invocación local y remota, argumentando que la gran diferencia de rendimiento en la invocación remota obliga a una interfaz de grano más grueso.
psr
No entendí bien tu párrafo With CRM, Sales and Inventory there will be a lot of CRUD-type use cases of which there is almost always a one-to-one correspondence with Service Layer operations: si se trata de múltiples interfaces de usuario, entonces, ¿cómo llega el CRUD aquí? Y si no necesitara múltiples interfaces de usuario a pesar de que el CRUD funciona bien con los servicios, todavía no crearía una capa de servicio, si lo entendiera correctamente, y realmente espero que lo haga porque prefiero mantener las cosas simples (la capa de servicio es un lío a mi opinión inexperta)
BornToCode
44
En esos casos, es raro que haya un solo cliente que pueda aprovecharlo. Si solo tuviera una interfaz de usuario, puedo pensar en dos razones por las que aún puede desear la capa de servicio: seguridad y reutilización. Una configuración empresarial típica tendría la aplicación de IU disponible para clientes externos, y su capa de servicio solo estará disponible en la red. Por lo tanto, el servidor web retrasa el trabajo a una parte bloqueada de su red. En el ejemplo de ventas, podría volver a usarlo si toma las ventas de su sitio web y se expande a eBay o Amazon. Ahora tiene una interfaz de usuario, pero múltiples clientes.
Phil Patterson
55
Solo para agregar al comentario de @PhilPatterson. Varios clientes no solo tienen que estar basados ​​en la interfaz de usuario. Piense en servicios web o bibliotecas: también pueden ser clientes. Su interfaz de usuario front-end podría usar la capa de servicio, así como los servicios de software que empaqueta y dejar que otra persona use.
Deco
¿Puede proporcionar un ejemplo de una capa de servicio?
user962206
34

Agregar una capa de servicio porque ha evaluado la idea y ha concluido que es el mejor enfoque: bueno

Agregar una capa de servicio porque eso es lo que están haciendo todos los niños geniales: malo

Si tu instinto dice que no necesitas uno, entonces no lo hagas.

Uno de los desarrollos más decepcionantes en el mundo de la programación en los últimos 10 años más o menos es que se ha vuelto molestamente orientado a la `` moda '', con personas que siguen las tendencias y los vagones como si fueran los zapatos de esta temporada. No caigas en esa trampa. Porque la próxima temporada 'todos' te dirán que deberías haberlo diseñado de otra manera.

No hay nada malo o correcto con una capa de servicio: es un enfoque particular cuya idoneidad debe evaluarse en función de sus méritos técnicos para el proyecto en cuestión. No se sienta obligado a sustituir las opiniones de otras personas por su propio juicio.

Gran maestro B
fuente
27
Esto no aborda el tema en absoluto, solo hace una declaración general sobre las prácticas de desarrollo que, después de sustituir algunas palabras, podrían aplicarse a casi cualquier pregunta en este sitio. De la lectura de esta respuesta, ni siquiera estoy convencido de que sabe exactamente lo que una capa de servicio es .
Aaronaught
12
Ciertamente se puede aplicar a otras preguntas ... no lo hace menos cierto. El hecho es que ni usted ni yo tenemos el contexto necesario para expresar lo que necesita en su proyecto, por lo que decirle que sí lo necesita, o no, no es una suposición absoluta y poco profesional. Lo que el OP necesita aquí es un poco de apoyo moral para tomar las decisiones que él sabe que son las correctas.
GrandmasterB
55
@Aaronaught Independientemente de la exactitud de la respuesta, él sigue respondiendo esencialmente a la pregunta principal, "¿Qué tan esencial es una capa de servicio?". Afirma que no es esencial en absoluto y que posiblemente sea solo una moda pasajera. Si no está de acuerdo con la respuesta, vote a favor.
maple_shaft
2
@GrandmasterB Yo diría que las modas son buenas en el desarrollo de software. La mayoría de los desarrolladores son demasiado nuevos o demasiado incompetentes para tomar decisiones de diseño y arquitectura bien informadas. Sin embargo, todavía esperamos que tengan una apariencia de software de trabajo, por lo que saltar a un carro y ser coherente con una mala elección de diseño es mucho más preferible y más sostenible que la forma en que se hicieron las cosas hace años, donde codificaríamos todo lo que ellos No entendí ni aprecié.
maple_shaft
10
@maple_shaft Solo para aclarar, no estoy diciendo que las capas de servicio sean una moda. Estoy diciendo, según la forma en que se hizo la pregunta, que parece que hay un comportamiento de moda / moda / carro de parte de sus colegas para empujarlo a usar una arquitectura que no cree que esté justificada en su proyecto. Dejo claro en mi respuesta que veo las Capas de Servicio (o cualquier otro concepto) como solo eso: conceptos neutrales cuya idoneidad debe evaluarse en función de sus propios méritos para proyectos individuales. No deben aplicarse / usarse cuando el propio juicio dice que no son necesarios.
GrandmasterB
22

Hay muchos factores que intervienen en la decisión de crear una capa de servicio. He creado capas de servicio en el pasado por las siguientes razones.

  1. Código que debe ser reutilizado por varios clientes.
  2. Bibliotecas de terceros para las que tenemos licencias limitadas.
  3. Terceros que necesitan un punto de integración en nuestro sistema.
  4. Centralización de lógica comercial duplicada.

Caso 1: está creando una funcionalidad básica que debe ser utilizada por una miríada de clientes diferentes. La capa de servicio incorpora funcionalidades para que diferentes clientes aprovechen su funcionalidad provista de inmediato.

Caso 2: normalmente aloja el código en el espacio de la aplicación, pero está utilizando una biblioteca de terceros para la cual tiene licencias limitadas. En este caso, tiene un recurso que le gustaría usar en todas partes, pero solo un número limitado de ellos. Si lo aloja detrás de un servicio, toda su organización puede usarlo desde sus aplicaciones sin tener que comprar una licencia para cada alojamiento individual.

Caso 3: está creando funcionalidad para que terceros se comuniquen con usted. En su ejemplo, podría configurar un punto final de inventario para permitir que los proveedores le envíen mensajes sobre los envíos de productos entrantes.

Caso 4: ha analizado su código en toda la empresa y descubrió que equipos separados han creado lo mismo (solo implementado de manera ligeramente diferente). Con una capa de servicio, puede elegir los mejores enfoques y ahora puede implementar el proceso de la misma manera en todos los equipos al hacer que llamen al servicio. Otro beneficio de la lógica de centralización es cuando se encuentran errores. Ahora puede implementar la solución una vez y todos los clientes disfrutan del beneficio al mismo tiempo.

Dicho todo esto, hay potenciales negativos para una capa de servicio.

  1. Agrega complejidad al sistema. Donde antes solo tenía una aplicación para depurar ahora tiene dos. Los problemas de producción requieren verificar la configuración de la aplicación cliente, la configuración de la aplicación de servicio o los problemas de comunicación entre las aplicaciones cliente y servidor configuradas correctamente. Esto puede ser complicado si nunca lo has hecho antes.
  2. Un punto de falla. Si tiene una interrupción del servicio, todos los clientes se ven afectados. Cuando el código no se implementa de esta manera, el riesgo puede ser menor (aunque hay formas de mitigar esto).
  3. El control de versiones puede ser más difícil de hacer. Cuando tiene una aplicación que usa un servicio que implementa la interfaz, los cambios se pueden hacer al mismo tiempo entre los dos. Cuando tenga varios clientes ahora, debe administrar quién está en V1, quién está en V2 y coordinar la eliminación de V1 (una vez que sepa que todos se han actualizado a V2).

El punto principal es que no siempre es un slam dunk orientar el servicio de su sistema. En mi experiencia, generalmente es una buena idea (tiendo a estructurar las aplicaciones de esta manera), pero no es una decisión automática. Al final del día, debe sopesar los pros y los contras y tomar la decisión correcta para su situación.

Phil Patterson
fuente
2
+1 Gracias por la respuesta informativa. Realmente tenía dudas sobre el clima para aceptar su respuesta o la respuesta de Deco. Finalmente, debido a que no tengo mucha experiencia, decidí elegir la respuesta que recibe la mayoría de los votos. Todavía siento que tu respuesta merecería más votos a favor. En cualquier caso, realmente aprecio que hayas compartido tu conocimiento y experiencia. ¡Gracias!
BornToCode
1
¡De nada! El punto principal que se debe sacar de ambas respuestas es que se trata (principalmente) de resolver problemas de mantenimiento con tener múltiples clientes que necesitan hacer lo mismo. Cuanto mayor sea el número de clientes que utilizan el servicio, mayor será la ganancia de mantenimiento para usted.
Phil Patterson
1
También hay seguridad: las capas de servicio pueden proporcionar otro muro para que los piratas informáticos rompan y lleguen al tesoro en el DB. La falta de capas de servicio es quizás la razón por la que tantos sitios web obtienen grandes infracciones, con un servicio en el medio, los piratas informáticos obtendrían significativamente menos datos antes de ser detectados.
gbjbaanb
6

La mayoría de las capas de servicio que he visto son un completo desastre. Los servicios tienden a tener muchos métodos diferentes, 1500 LOC no son raros. Los diferentes métodos no tienen nada en común, pero comparten código. Esto da como resultado un alto acoplamiento , baja cohesión . También viola OCP , porque cada vez que se necesita una nueva operación, debe modificar el código en lugar de extender la base del código. Una capa de servicio bien construida es teóricamente posible, pero nunca la vi en la práctica.

CQRS resuelve estos problemas y evita que tenga que crear una de esas capas de servicio de procedimiento.

Jeroen
fuente
2
¿Bien construido según los estándares de quién? Ciertamente, según los estándares OO, una interfaz de capa de servicio es un desastre total. Desde una perspectiva funcional o de procedimiento, alienta un enfoque de diseño en capas hermoso. Creo que la mayor dificultad que tienen las personas con las capas de servicio es que fomentan una aplicación basada en transacciones sin estado y desalientan un enfoque orientado a objetos puros. Puedo entender ambos lados del argumento.
maple_shaft
6

Agregar una interfaz (una capa de servicio es un tipo de interfaz) lleva tiempo. Una buena toma mucho tiempo para diseñar y probar. Es muy importante hacerlo bien en el primer intento porque cambiarlo más tarde daña a todos los clientes. Además, tenga en cuenta que probablemente no sabrá qué necesita estar en esa interfaz hasta que tenga un segundo cliente con necesidades ligeramente diferentes. Mantener un servicio es un proyecto interminable en sí mismo.

En la mayoría de las organizaciones, si acude al patrocinador de su empresa y le pregunta: "¿Desea que otros departamentos se beneficien (reutilicen) este sistema que estamos desarrollando con su presupuesto?" Se reirán de ti. Primero, haga que funcione para el patrocinador de su negocio, luego comience a jugar con la reutilización de ese código (en el tiempo de su departamento).

Si sabe, de hecho, que la funcionalidad que está escribiendo hoy será reutilizada por varios clientes de servicio diferentes, entonces considere diseñar una capa de servicio desde el primer día. Si no está seguro, o ya hay muchas incógnitas en el proyecto, haga que algo simple funcione primero y luego sepárelo en servicio y cliente si tiene tiempo y presupuesto. Es mucho más fácil obtener la interfaz de servicio en el primer intento cuando comienza con un sistema en funcionamiento.

PD: si está trabajando en Java, Joshua Bloch tiene muchos consejos de interfaz fantásticos a lo largo de su libro, Effective Java.

GlenPeterson
fuente
Una gran respuesta sin teorías estériles.
danilo
2

Estoy de acuerdo contigo. No es necesario incluir una capa más si está utilizando una única interfaz de usuario.

DAL, BL y UI / Controller son una buena combinación para diseñar una aplicación. Si planea utilizar una única interfaz de usuario, no es necesario preparar una capa adicional. La inclusión de 1 capa más en la aplicación solo aumenta los esfuerzos de desarrollo / tiempo.

Otro esquema es usar múltiples IU en su aplicación, es bueno tener una capa de servicio para manejar las IU en este caso.

Desbordamiento de pila: discusión sobre el patrón de la capa de servicio

Satish Pandey
fuente
Entonces, ¿sugiere que en cada aplicación compleja que se desarrolle debe usar una capa de servicio y no solo conformarse con las capas DAL, BL, UI?
BornToCode
En caso de múltiples IU, debemos incluir una capa de servicio. En su caso, no creo que sea necesario preparar una nueva capa. Solo aumenta la complejidad de la aplicación.
Satish Pandey
0

Yo diría que tu BL es tu capa de servicio. Un lugar central donde se sienta su lógica de negocios. Esto debería ser una DLL que pueda ser utilizada por cualquier cosa que necesite esa lógica. Luego, puede colocar una capa de API web encima de eso si su aplicación tendrá UI diferentes.

usuario441521
fuente