mvc - java model view controller example
¿Los roles de un servicio y una fachada son similares? (11)
Antes de intentar responder, permítanme aclarar algo: hay tres cosas distintas en las aplicaciones empresariales: Fachada , Capa de servicio y Fachada remota .
Fachada : al envolver el (los) subsistema (s), sigue siendo un objeto y la aplicación de IU (MVC) generalmente vive en el mismo proceso. Por lo tanto, la comunicación se realiza de la manera habitual OO: métodos de llamada, propiedades de lectura, escuchar los eventos.
Capa de servicio : cuando la capa de lógica de negocios se vuelve madura y demasiado compleja para que el MVC interactúe directamente con ella, entonces la Capa de servicio se pone entre ellos. Service Layer es una API que MVC utiliza como un contenedor de la lógica comercial. No es remota y no se requiere el uso de DTO ya que no hay cables involucrados en la comunicación.
Remote Facade - (simplemente, cualquier servicio remoto) es un híbrido entre Fachada y Service Layer. Remote Facade comienza a existir cuando desea exponer algún tipo de contenedor sobre el sistema (y lo llamamos Facade) como un límite de distribución. Una de las razones puede ser permitir que varias aplicaciones UI (MVC) usen la misma Fachada Remota.
-
Comparaciones
Fachada vs. Capa de servicio : son similares ya que ambos envuelven subsistemas. La diferencia es que Service Layer está más orientado a las necesidades de aplicaciones de UI (MVC) y expone las funciones para simplificar el trabajo con lógica de negocios. Por otro lado, Facade está exponiendo funcionalidades para simplificar la lógica comercial, pero no necesariamente simplifica la comunicación con la aplicación UI (MVC).
Fachada vs. Fachada Remota (¿Servicio?) : Definitivamente diferente ya que Remote Facade debe usar DTO como mensajes de comunicación. Remote Facade necesitará algún tipo de proxy si aún desea usarlo como un objeto regular (propiedades, eventos); pero el proxy usará DTO de todos modos para el objeto real, es decir, Remote Facade.
-
Flujos posibles:
controller-facade-dao
- dudoso, pero aún posible. Facade no se usa generalmente para ajustar solo DAL. Debe haber algo más maduro además como un subsistema. Pero, si la fachada es parte de la lógica comercial, entonces sí, esto es posible. Todavía el subsistema debe ser más enfatizado. Para mí, el ajuste DAL no es suficiente para llamarlo Facade.
controller-service-dao
- absolutamente posible. Muchos servicios remotos trabajan directamente con la base de datos a través de DAL.
controller-facade-service-dao
- tal vez, si trata el servicio como un subsistema.
Agregaría uno más que pueda tener sentido:
controller-service [layer]-facade (part of business)-subsystem (eg accounting, business on its own)-dao
- Estoy seguro de que puede traducir esto.
-
Recuerde, el servicio (o fachada remota) puede existir en cualquier lugar del flujo. Eso solo está dictado por sus necesidades de distribución.
Cuanto más leo, más confundido estoy.
Tenga en cuenta que toda la pregunta está relacionada con la forma en que el servicio y las fachadas se ajustan al patrón MVC.
Según entiendo, una Fachada no es un objeto súper inteligente, es simplemente una forma de exponer una interfaz / API simple para realizar una operación compleja (por ejemplo: realizar un pago de $ 10, es una operación compleja que involucra una cantidad de operaciones, pero dicha complejidad puede ser manejada por una fachada que simplemente llamará al objeto correspondiente en un orden particular ... etc.)
Ahora, un servicio es una forma de realizar llamadas a varios DAO para obtener estructuras de datos complejas (no estoy muy seguro de esto, pero es lo que entiendo hasta ahora).
La pregunta es, ¿cuál es la diferencia entre una fachada y un servicio? Al final del día, la fachada puede acceder perfectamente a varios DAO para realizar una operación compleja al proporcionar una interfaz simple, y un servicio parece algo similar.
Lo mismo sucede con las transacciones, entiendo que un servicio es el lugar para comenzar las transacciones, pero igualmente siento que también podrían colocarse en fachadas, después de todo, una fachada también puede llamar a varios DAO.
Entonces, ¿qué pila tendría más sentido?
controlador-fachada-dao controlador-servicio-dao
o tal vez
controller-facadade-dao Y a veces controller-facade-service-dao ??
Es el "contexto" lo que importa. Fachada y Servicio no son contradictorios.
Primero, nunca escuché sobre "Servicio" y "Fachada" en el contexto de MVC.
Cuando las personas hablan sobre el Servicio, se trata más de un sistema o componente que proporciona acciones comerciales significativas al mundo exterior. A veces puede ver "Servicio" relacionado con "Unidad de trabajo" (y, por lo tanto, transacción).
El servicio también se usa en el contexto de un enfoque de aplicación de estratificación: tenemos Servicio encima de DAO, para lo cual el Servicio accederá a los datos a través de DAO y la lógica de negocios se colocará en la capa de Servicios, algo así.
Fachada se utiliza generalmente en el contexto del patrón de diseño, y el enfoque se trata de "ocultar operaciones complicadas y exponerlo como una operación simple".
Fachada puede ser o no ser un Servicio (una operación en Fachada puede no representar una Unidad de trabajo, pero sigue siendo una fachada válida), de manera similar, un Servicio puede o no ser una Fachada (un Servicio no puede ocultar ninguna complicada operaciones pero todavía es un Servicio).
Una vez más, todo se trata del "contexto" que importa.
Por ejemplo, cuando habla de capas de aplicaciones, es simplemente irracional decir "XXX es una fachada para acceder a DAO". Del mismo modo, si está hablando de "enfoque de diseño", es más razonable decir "XXX es una fachada para el back-end múltiple" en lugar de llamarlo "Servicio" aquí (aunque XXX es en realidad un Servicio).
FACADE es un patrón de diseño que resuelve el problema donde existe la necesidad de una interfaz unificada para muchas interfaces en un subsistema, por lo que define una interfaz de nivel superior que hace que el subsistema sea más fácil de usar.
SIN EMBARGO, UN SERVICIO proporciona acceso a recursos o un conjunto de interfaces / objetos y puede no necesariamente simplificar dicho acceso. Por lo tanto, puede emplear el patrón de fachada para diseñar mejor su servicio, de modo que pueda guardar al cliente averiguando cómo construir para usarlo.
Literalmente, Fachada, como su nombre lo indica, significa la fachada del edificio. Las personas que caminan más allá de la carretera solo pueden ver la fachada. No saben nada sobre lo que hay adentro, el cableado, las tuberías y otras complejidades. La cara oculta todas las complejidades del edificio y muestra una cara amigable más simple.
En términos de software, fachada esconde las complejidades de los componentes de software detrás de ella proporcionando una interfaz más simple, no tiene la funcionalidad propia y no restringe el acceso al substsyem . Comúnmente utilizado en Object Oriented Design. Buenos ejemplos son SLF4J: es una API que es una fachada simple para los sistemas de registro que permite al usuario final conectar el sistema de registro deseado en el momento del despliegue.
Un servicio es una interfaz pública que proporciona acceso a una unidad de funcionalidad y siempre se escribe en una especificación. Necesita respaldar los contratos de comunicación ( comunicación basada en mensajes, formatos, protocolos, seguridad, excepciones, etc. ) que sus diferentes consumidores requieren. Hay servicios de proceso : encapsulación de flujos de trabajo comerciales, servicio de lógica de negocios , encapsulación de reglas / funciones, servicios de datos , interacción con entidades, administración de acceso a datos, servicios de infraestructura , funciones de utilidad como monitoreo, registro y seguridad. Los servicios son principalmente unidades de funcionalidad reutilizables, no asociadas y débilmente acopladas.
Son muy similares, pero depende de cómo lo mires.
La diferencia que veo, las fachadas están diseñadas al revés. Miras el subsistema y diseñas una fachada para proporcionar un acceso más simple. Los servicios se diseñan desde el exterior. Usted observa que sus clientes / clientes definen un contrato y diseñan el servicio.
Lo primero a tener en cuenta es que un patrón de diseño es una descripción de un problema común (diseño) con una solución estándar. En algunos casos hay varias formas de resolver el problema de una manera que se ajuste a todos los requisitos (por ejemplo, los patrones Iterator y Singleton tienen toneladas de diferentes implementaciones; por ejemplo, verificar el trabajo de Alexandrescu
y compararlo con el GoF estándar). soluciones) y en algunos casos hay diferentes patrones con la misma solución (código) (por ejemplo, comparar los diagramas de clase de los patrones Compuesto y Decorador en el libro GoF).
Según el GoF, el propósito del patrón Facade es (cita literal):
Proporcionar una interfaz unificada para un conjunto de interfaces en un subsistema. Facade define una interfaz de nivel superior que hace que el subsistema sea más fácil de usar.
Los servicios tienen la intención de proporcionarle a un usuario una única interfaz de nivel superior con una funcionalidad determinada. Eso no necesariamente lo convierte en fachada, porque un servicio no es estrictamente hablando, por definición, una unified interface to a set of interfaces in a subsystem.
Pero podemos hacerlo mejor que eso
Su pregunta fue si los patrones son "similares". Si consideramos que son "similares" cuando el patrón A es igual a B y el patrón B es igual a A, entonces debemos responder 2 preguntas:
Pregunta 1: ¿ es un Service
una Facade
? Un servicio definitivamente debe exponer la funcionalidad y es definitivamente una interfaz única que expone esta funcionalidad. La funcionalidad normalmente se descompone en pedazos pequeños, entonces sí, los servicios se ajustan a los requisitos subyacentes de una fachada. En otras palabras: ante el problema de exponer las interfaces subyacentes como una interfaz unificada de "servicio", el patrón de fachada se ajusta a los requisitos y se utiliza para resolver el problema del servicio. La respuesta a esto es sí .
Pregunta 2: ¿ es una Facade
un Service
? Los servicios normalmente se diseñan como unidades de funcionalidad reutilizables, no asociadas y débilmente acopladas. Pensar en la comunicación entre componentes es importante para los servicios, ya que generalmente se basan en una interfaz TCP / IP como SOAP o WCF. Esto también significa que la funcionalidad a menudo se reescribe para ajustarse más al paradigma de services
, lo que agrega un requisito implícito de rendimiento para el patrón. Las fachadas no tienen este requisito adicional. En otras palabras: una fachada no es un servicio .
En términos exactos, estos conceptos están estrechamente relacionados, pero no son lo mismo.
Pero lo podemos hacer mejor
Esta línea de pensamiento plantea la pregunta si un servicio es una versión extendida de una fachada . Es si un servicio cumple con todos los requisitos de una fachada y se extiende a eso.
Si lee detenidamente la descripción por parte del GoF, la respuesta es sí, es decir: si se cumple una condición: el servicio debe exponer los subsistemas . En realidad, creo que esta condición normalmente se mantiene, o estás sobre-diseñando tus servicios, aunque estrictamente hablando, supongo que esto no es una restricción difícil.
Mi comprensión del patrón clásico de GoF Facade es que está destinado principalmente a ocultar un diseño deficiente. Como regla general, diría que uno solo debería necesitar una Fachada para el código heredado.
También creo que este patrón hizo su camino como un patrón de núcleo J2EE (Session Facade) principalmente porque la especificación EJB (al menos hasta 2.x) resultó inherentemente en un diseño de capa de servicio pobre.
Por lo tanto, mi respuesta a su pregunta sería sí , una fachada es en realidad un servicio que no se ha implementado correctamente la primera vez. Si necesita ocultar la complejidad del código del cliente, generalmente significa que solo logró proporcionar una biblioteca, no una capa de servicio; entonces, en este caso, la fachada se convierte en su capa de servicio.
Por otro lado (suponiendo que tengas una capa de dominio decente), si realmente necesitas proporcionar la opción de generar flujos complejos con una sola llamada a un método (algo parecido a macros / alias), esto normalmente estaría mejor ubicado en la capa de aplicación y no en su dominio central: observe que he cambiado la terminología de capas al diseño impulsado por dominio, donde no hay "acceso a datos" o capa de "servicio", sino "aplicación", "dominio", "infraestructura" .
Por lo general, estos términos se utilizan solo en sus contextos específicos.
Contexto de uso común ''Fachada'': API simple para partes complejas de la aplicación (como libs de terceros)
Contexto ''Servicios'': desbloquea y muestra las entidades comerciales en el sistema. (SOA, DAO, Seguridad, etc.)
Puede ver patrones como un lenguaje que evoluciona. Nunca pareció ser el final perfecto, cada patrón tiene su propia historia y contexto. A veces, las clases se pueden ver como Servicios y Fachadas al mismo tiempo, a veces no.
Por ejemplo: llamar a la API de terceros por el término ''Servicio'' podría considerarse un uso incorrecto, debido a un contexto incorrecto.
Sí, Fachada y Servicio no están del todo sin relación. Y a veces implementamos la capa de servicio como fachada para que el cliente no se preocupe por muchos detalles del servicio. Cuanto más simple sea la invocación / interfaz de un servicio, más fácil y sencillo será el código de los clientes.
El Martin Fowler dice ... A Service Layer defines an application''s boundary [Cockburn PloP] and its set of available operations from the perspective of interfacing client layers. It encapsulates the application''s business logic, controlling transactions and coordinating responses in the implementation of its operations
A Service Layer defines an application''s boundary [Cockburn PloP] and its set of available operations from the perspective of interfacing client layers. It encapsulates the application''s business logic, controlling transactions and coordinating responses in the implementation of its operations
Así que la capa de servicios se usa a veces como Fachada.
Un servicio es una forma de escribir una interfaz a un sistema externo, como una tienda de identidades LDAP, una pasarela de pago o una interfaz de administración de aplicaciones. Es una forma conceptual de ver el sistema externo como un proveedor de servicios útiles tal vez con comportamientos internos en lugar de un bulto pasivo para ser operado.
Una fachada es una forma de cerrar cualquier cosa (incluso un servicio) para presentarlo bien a otro componente. Las fachadas se usan a menudo cuando:
- Una biblioteca o componente es complejo y su aplicación solo necesita un subconjunto. Su Fachada presenta la API simplificada para la aplicación
- Está utilizando varias bibliotecas o componentes y necesita unificarlos, presentando una API consolidada para la aplicación
- La biblioteca que está utilizando tiene una configuración compleja o un conjunto de dependencias, y la fachada engloba todo eso en el contexto de su aplicación.
El poco confuso es que puedes (y muchas veces lo haces) crear una fachada sobre uno o más servicios. El servicio es la forma en que el componente realmente accede al recurso, y la fachada es el bit que simplifica el componente (como la configuración de opciones, la conexión, etc.).
Si escribe su propio DAO, probablemente creará su servicio exactamente como lo necesita, por lo que escribir una fachada es una indicación de que lo hizo mal. Si el DAO es creado por un tercero y es más complejo que sus necesidades, entonces puede crear una fachada del servicio.
Ahora, un servicio es una forma de realizar llamadas a varios DAO para obtener estructuras de datos complejas (no estoy muy seguro de esto, pero es lo que entiendo hasta ahora).
Yo diría que el DAO es un patrón de diseño propio: ver wikipedia .
Si contrastamos un DAO con un servicio, tenemos:
- Nivel de API:
- DAO: acceso detallado a propiedades
- Servicio: acceso de grano grueso a los servicios
- Donde se encuentra la implementación:
- DAO: Principalmente en el cliente, pero almacenando datos (sin comportamiento) en la base de datos
- Servicio: principalmente en el servidor
- Cómo se invoca la interfaz
- DAO: el cliente se vincula directamente al objeto en el mismo espacio de nombres y JVM
- Servicio: El cliente es simplemente un stub para una operación de red, cross-vm o cross-namespace
... la fachada puede acceder perfectamente a varios DAO para realizar una operación compleja al proporcionar una interfaz simple, y un servicio parece algo similar.
Una fachada podría envolver la capa DAO, pero realmente no veo que esto suceda de manera útil. Lo más probable es que necesite una API para acceder a las propiedades individuales de los objetos, atravesar el gráfico de objetos y similares, y eso es precisamente lo que proporciona el DAO.
Lo mismo sucede con las transacciones, entiendo que un servicio es el lugar para comenzar las transacciones ...
Absolutamente, porque la transacción es un servicio provisto por la base de datos y en otro componente o sistema
... pero también siento que también podrían colocarse en las fachadas, después de todo, una fachada también puede llamar a varios DAO.
Y de muchas maneras, el servicio de administrador de transacciones es una fachada hacia una implementación de back-end mucho más compleja, coordinando la transacción en la web, la aplicación, la base de datos y otros componentes que reconocen las transacciones. Sin embargo, esto ya ha sido eliminado por la implementación del servicio de transacción. En lo que respecta a nosotros, el usuario, solo existe la interfaz pública.
Este es, de hecho, el punto conceptual de estos patrones de diseño: proporcionar al usuario la cantidad justa de API, abstrayendo las complejidades de la implementación detrás del muro de hierro de la interfaz del componente.
Entonces, ¿qué pila tendría más sentido?
controlador-fachada-dao controlador-servicio-dao
o tal vez
controller-facadade-dao Y a veces controller-facade-service-dao ??
- El DAO es un tipo de servicio a la base de datos, pero realmente el DAO es un patrón de diseño en sí mismo.
- Si escribe su propio DAO, nunca debería necesitar una fachada.
Por lo tanto, la respuesta correcta es:
- controlador - dao
Una interfaz de servicio típicamente representa preocupaciones comerciales: realizar algunas operaciones u obtener información. No sería irrazonable que el proveedor del servicio implemente su servicio como una fachada frente a los servicios de back-end internos; nunca lo vería.
Su fachada puede envolver algunas interfaces generales, que pueden incluir interfaces de servicio.
Por ejemplo, puede tener una interfaz de servicio para una cuenta bancaria (operación: transferencia bancaria) y una API local para sus registros contables locales (transfiero dinero). Puede presentar una fachada con una operación de "mover dinero" que utiliza la interfaz de servicio del banco y también administra su chequera local.
Fachada y capa de servicio tiene una especie de similitud, pero ambos tienen dos significados distinguidos . Déjame explicar esto usando un simple ejemplo.
Imagine que se nos pide crear una nueva aplicación comercial. Esto tiene el requisito de crear una aplicación de check-in, pero con más características de valor agregado y características de tarjeta de fidelidad.
Supongamos que la aplicación debe ser compatible con las funciones de check-in de Facebook y Foursquare si el usuario desea utilizarla. Esta característica es muy necesaria porque algunos usuarios son reacios a utilizar varias aplicaciones que realizan la misma función o se deshacen de la conectividad social.
para obtener una idea de alto nivel, consulte la api de muestra en el siguiente enlace https://docs.google.com/file/d/0B3v8S0e-PvVpdWFJOVhqc1d2SHc/edit?usp=sharing
La API anterior de check-in ubicada en la fachada de ABC es un ejemplo de uso de Facade.
Tiene nuestra API de servicio y también funciones de registro de facebook y foursqure basadas en la selección del cliente. Las API de Facebook y foursqure pueden tener implementaciones específicas (SOAP, Restful, etc.) y requisitos de seguridad (OAuth, etc.), etc.
Satisfacer uno de estos requisitos de API (facebook, foursqure) necesita cumplir un conjunto diferente de tareas. estos serán diferentes sub sistemas con en nuestro requisito de verificación.
Así que el uso simplista de fachada es satisfacer varios subsistemas activados por un método simple
Pero si consideramos nuestra propia API, que es la API de registro ubicada en MngCheckinSvc. Esta es una API de capa de servicio . Esta es la API que contiene los requisitos de verificación de nuestra aplicación. Esta es la API que proporciona acceso público desde su MngCheckinSvc para manejar el requisito de registro de la aplicación.
Esto tendrá comportamientos internos complejos, pero la mayoría de ellos serán implementaciones lógicas específicas de la aplicación.
Esta API (MngCheckinSvc.checkin (....)) puede acceder a diferentes conjuntos de DAO, API internas, puede haber otros servicios internos, etc. para cumplir con el registro de comerciante en la aplicación.