2010-04-21 17 views
48

Sé que esta es probablemente una pregunta ancestral, pero ¿cuál es la mejor práctica? Usar un objeto de modelo de dominio en todas las capas de su aplicación, e incluso valores de enlace directamente a ellos en el JSP (estoy usando JSF). O convierta un objeto de modelo de dominio en un DTO en la capa DAO o Servicio y envíe un DTO liviano a la capa de presentación.DTO u objeto de modelo de dominio en la capa de vista?

Me han dicho que no tiene sentido utilizar DTO porque los cambios en la base de datos darán lugar a cambios en todos sus DTO, mientras que el uso de objetos modelo en todas partes solo requerirá cambios en el objeto modelo afectado. Sin embargo, la facilidad de uso y la naturaleza liviana de los DTO parecen superar eso.

Debo notar que mi aplicación utiliza objetos de modelo de Hibernate Y usa sus propios objetos de modelo creados a medida (lo que significa que no están vinculados a ninguna sesión de base de datos, siempre separados). ¿Alguno de los escenarios anteriores es más beneficioso para un patrón de Objeto de Modelo estricto? El uso de Hibernate ha sido un gran PITA en lo que respecta a cosas como excepciones de inicialización diferida.

estoy editando esta pregunta con la esperanza de promover la discusión (no estoy seguro si estoy haciendo este derecho):

El problema que tengo con los objetos del modelo es que no son flexibles en absoluto. Un comentario a continuación dice que la aplicación debe diseñarse de modo que los objetos modelo se puedan usar en todas las capas. ¿Por qué? Si un usuario quiere una pieza de funcionalidad ridícula, ¿se supone que debo decirles 'bueno, eso no funcionará con objetos modelo'?

Simple y llanamente, hay ocasiones en que los objetos del modelo no funcionarán. Puede tener:

public class Teacher { 
    List<Student> students; 
    [tons of other Teacher-related fields] 
} 
public class Student { 
    double gpa; 
    [tons of other Student-related fields] 
} 

pero tal vez no necesite toda esa información. Solo necesita el apellido del maestro, la cantidad de alumnos que enseña este año y el promedio general de todos los alumnos combinados. ¿Qué harías en ese caso? Recupere la información completa del docente y las relaciones de los alumnos, y luego su código obtiene un recuento de la Lista de alumnos, y luego calcula el promedio total de todos los gpas. Parece mucho más esfuerzo que simplemente crear un DTO con 'String lastName', 'int numStudents' y 'double combinedGpa;

Puede parecer que he pensado en esto, pero todavía tengo que trabajar en una aplicación en la que los objetos modelo se puedan utilizar completamente y sin problemas en cada instancia. Las aplicaciones habituales en el mundo real con demandas de usuarios fuera de lo común simplemente no funcionan de esa manera.

Respuesta

30

Realmente depende de la complejidad de su aplicación. Mezclar objetos de dominio en la capa de vista tiene dos consecuencias posibles:

  1. tendrá la tentación de modificar su objeto de dominio para acomodar cosas que hay en la capa de vista
  2. Su capa de la vista contendrá una complejidad adicional causado por una no coinciden con lo que ofrecen los objetos de su dominio y lo que realmente necesita su vista. Es posible que no pueda evitar esta complejidad, pero probablemente no pertenezca a la capa Ver.

Si los objetos de su dominio son simples y sus vistas son pocas, omitir los DTO podría ser lo más simple.

Por otro lado, si su modelo de dominio es probable que evolucione y se vuelva complejo y si sus vistas son numerosas y variadas, tener una vista de objetos específicos podría ser una buena idea. En el mundo de MVC, el uso de ViewModels es común y tiene mucho sentido para mí.

-4

DTO es ampliamente considerado como un anti-patrón hoy en día, y el consejo es por lo general "evitarlos a toda costa".

Una de las principales ventajas de un marco ORM como Hibernate es que puede usar objetos de dominio en todos los niveles, y realmente no necesita DTO. La advertencia, por supuesto, es que tienes que dedicar algún tiempo a PIENSA en esas relaciones: cuándo utilizar la recuperación perezosa, cuándo usar ansioso, etc.

+0

Sí, lo entiendo. Simplemente parece que agrega complejidad innecesaria a veces. Si tengo un objeto que dice que representa a un Profesor y a veces solo necesito la información del encabezado (nombre, dirección), tengo que enviar un objeto de dominio medio poblado al front-end. Es simplemente un poco engañoso y no me parece correcto. – sma

+4

@ smayers81: ¿por qué solo llenas tus objetos de dominio a mitad de camino? Suena como una optimización innecesaria (no si usted ha perfilado o ha descubierto un problema por supuesto). Eso suena como la raíz de su problema: tratar sus objetos de dominio como DTO. ¿Por qué no simplemente empujar sus objetos de dominio totalmente hidratados a la parte delantera? Si descubre que tiene un problema de rendimiento, entonces tiene un caso para DTO (o para eludir por completo los objetos personalizados y trabajar directamente con la abstracción de conjunto de registros que proporciona su marco). –

+0

Porque siempre lo sentí, ¿por qué enviar todos esos datos por el cable si no es realmente necesario? Creo que fue todo el ímpetu detrás de la idea de Hibernate de la recolección diferida (podría estar equivocado) – sma

7

Otro voto para objetos de dominio. En lo que se refiere al Diseño Dirigido por Dominio, el modelo de dominio es el rey y debería usarse siempre que sea posible. La aplicación debe diseñarse de manera tal que la mayoría de las capas (barra Capa de infraestructura) puedan usar objetos de dominio.

Creo que los DTO son útiles solo cuando los objetos necesitan ser serializados. Si no hay transferencia a través del cable o en una arquitectura incompatible, no los usaría. El patrón DTO es útil para mantener la serialización fuera del objeto de dominio. Teniendo en cuenta que la interacción UI/Dominio no necesita serialización, manténgala simple y use los objetos reales.

+3

. Pensé que era necesaria la serialización para la sesión gestión estatal en entornos agrupados Incluso los objetos modelo que tenemos ahora (los de Hibernación Y los personalizados, los separados) son Serializables. – sma

+2

No creo que se estuviera refiriendo a la serialización de la que está hablando (a-la Serializable).Creo que se refería a la serialización en cosas como XML, JSON, AMF (Flex), CSV, etc. – Aquarelle

2

Escenarios cuando el objeto de dominio son problemáticos para ser enviado:

  1. es posible que necesite información agregada u otros tipos de campos calculados '' enviado a la capa de interfaz de usuario (en el ejemplo Flex/GWT) y no quiere echar a perder el dominio del objeto
  2. puede encontrarse con una necesidad de serialización de gráfico de objetos cíclico (en su ejemplo, si el estudiante tenía relación con la lista), algunos protocolos de tener problemas con que
  3. Hibernate LazyInitializationException cuando se trata de los serializadores marco (blazeds para el serializador de flex/GWT)

no estoy seguro de que es una respuesta clara en aquellos cirumcstances

7

Creo que tener DTO no es generalmente un anti patrón. Hay muchas personas y sistemas que los utilizan y el beneficio que obtienes es la capa de vista desacoplada que se puede diseñar y modularizar independientemente del modelo de dominio. Aunque estoy de acuerdo en que debe usar objetos de dominio cuando sea posible, hay situaciones en las que puede tener problemas cuando vincula la capa de vista directamente con el modelo de dominio.

me han hecho buenas experiencias con un modelo de vista que sólo se envuelve alrededor de los objetos de dominio y delega la mayor parte de las operaciones a them.This desacopla vista y la capa de dominio, permite la composición flexible de los objetos de dominio y todavía no es mucho trabajo implementar desde el patrón de delegación de soporte IDE.

1

En mi opinión, no hay ningún problema con el uso de objetos de modelo de dominio en cada capa. Usted dijo que no necesita toda la información. Cuando esté en sus JSP, use solo los datos que necesita. Nadie te está forzando a buscar todas las propiedades. También dijiste que necesitas hacer cálculos relacionados con las propiedades del objeto para obtener GPA, # de estudiantes, etc. Tienes 3 opciones: crea propiedades sintéticas en tu objeto de modelo de dominio que te devuelven los datos correctos, envueltos agradablemente y ordenado; hacer los cálculos en el controlador o capa de servicio, y exponerlos a través de los getters apropiados; o manejarlo todo dentro de su JSP. Necesita recuperar/compilar/disputar los datos DE CUALQUIER FORMA, entonces, ¿por qué agregar más complejidad con un DTO?

Además, con cada DTO, está creando una.) Una clase extra que ahora tiene que mantener, y b) al MENOS 1 método extra en algún lugar de alguna clase que construye y rellena el DTO (DAO, método de fábrica) , etc.) Más mantenimiento = desarrollador infeliz 6 meses después.

Entonces, hay mis argumentos en contra de los DTO. Los uso, pero solo en ciertos escenarios, como cuando realmente necesito optimizar la velocidad y/o el uso de memoria, y el costo de hidratar un objeto de modelo de dominio completo es demasiado. Los servicios web son un buen ejemplo de cuándo prefiero usar DTOs.

-1

Creo que lo que deberíamos considerar aquí en primer lugar es el costo de la introducción de una nueva capa. Tome DTO por ejemplo; para eso necesitamos un mapeo. Como alguien dijo, la traducción es mala y debe evitarse siempre que sea posible.

Por otro lado, creo que hay muy pocas cosas que generalmente no debería hacer. Aquellos que dicen que todos los DTO son malvados están equivocados, ¡siempre depende del caso de uso! ¿Están realmente justificados?

Y, por último, personalmente creo que los objetos del dominio se deben dejar ir a la vista misma. Imagine cómo es la integración del wicket. Pero tome Spring MVC, por ejemplo, el dominio se mantendría en la capa de aplicación probablemente ...

0

El comportamiento de una clase o sus métodos internos no deberían exponerse a capas que no se preocupen por su comportamiento. Transfiere datos, no comportamiento. Use objetos de dominio dentro del dominio. La web no es un dominio controlado, y los desarrolladores de UI no necesitan preocuparse por el comportamiento del dominio, solo los datos.

El dominio debe estar encapsulado y protegido de modificaciones por parte de alguien que no tenga que ver con el estado del dominio.

El comportamiento de fuga no es el mejor hábito.

Si es un proyecto pequeño, también lo construyó con los principios correctos. De esa manera siempre tenemos en cuenta por qué hacemos lo que hacemos, y no solo cómo.

Cuestiones relacionadas