¿Cuál es la diferencia entre objetos de dominio, POCO y entidades?

81

Tenía la impresión de que todos son básicamente iguales. ¿Los objetos modelo también son iguales?

Ahora mismo, en mi arquitectura, tengo:

class Person 
{

    public string PersonId;        
    public string Name;
    public string Email;

    public static bool IsValidName() { /* logic here */ }
    public static bool IsValidEmail() { /* logic here */ }
}


class PersonService
{
    private PersonRepository pRepository;

    PersonService()
    {
        pRepository = new PersonRepository();
    }

    public bool IsExistingEmail(string email)
    {
        //calls repo method to see if email is in db
    }


    public Person GetPerson(email)
    {
        return pRepository.Get(email);
    }


    public void SavePerson(Person p)
    {
        if (Person.IsValidEmail(p.Email) && !IsExistingEmail(p.Email)
        {
            pRepository.Save(p);
        }
    }

}


class PersonRepository
{
    public void Save(Person p)
    {
        //save to db
    }

    public Person Get(string email)
    {
        //get from db
    }

    public bool IsExistingEmail(string email)
    {
        //see if email in db
    }

}

¿Cuál de las clases anteriores son POCO, Domain Object, Model object, entity?

jpshook
fuente

Respuestas:

115

Mis definiciones Layman (no estándar)

  • POCO- Objeto% Insert_Your_Language% antiguo y sencillo. Un tipo sin lógica en él. Simplemente almacena datos en la memoria. Por lo general, solo verá propiedades automáticas, a veces campos y constructores.
  • Domain objectuna instancia de una clase relacionada con su dominio. Probablemente excluiría cualquier satélite o objeto de utilidad del objeto de dominio, por ejemplo, en la mayoría de los casos, los objetos de dominio no incluyen cosas como registro, formateo, serialización, encriptación, etc., a menos que esté creando específicamente un producto para registrar, serializar, formatear o encriptar respectivamente. .
  • Model objectCreo que es lo mismo que Domain object. La gente tiende a usar esto indistintamente (puedo estar equivocado)
  • Entity una clase que tiene id
  • Repositoryuna clase que se dirige a un almacenamiento de datos desde un lado (por ejemplo, una base de datos, un servicio de datos u ORM) y al servicio, la interfaz de usuario, la capa empresarial o cualquier otro organismo solicitante. Por lo general, oculta todas las cosas relacionadas con los datos (como replicación, agrupación de conexiones, restricciones clave, transacciones, etc.) y simplifica el trabajo con datos.
  • Servicesoftware que proporciona algunas funciones normalmente a través de una API pública. Dependiendo de la capa, puede ser, por ejemplo, un contenedor autónomo RESTful o una clase que le permite encontrar una instancia particular del tipo necesario.

Respuesta original

Estos son términos que se utilizan principalmente en el diseño controlado por dominio (distribuido). Ellos no son los mismos. El término Objeto modelo se puede utilizar como sinónimo del objeto de dominio .

Objetos de dominio. Objetos del área específica de la empresa que representan algo significativo para el experto en el dominio. Los objetos de dominio están representados principalmente por entidades y objetos de valor. En términos generales, la mayoría de los objetos que viven en la capa de dominio contribuyen al modelo y son objetos de dominio.

Entidad. Un objeto definido fundamentalmente no por sus atributos, sino por un hilo de continuidad e identidad. (Lo que significa que debe tener una identificación )

POCO. Un objeto simple sin lógica complicada, generalmente tiene solo algunas propiedades y se usa con ORM o como un objeto de transferencia de datos

class Person- Entidad y POCO, la instancia de esta clase es Objeto de dominio
class PersonService- Servicio
class PersonRepository- Repositorio

oleksii
fuente
4
Consulte mi ejemplo de código anterior y hágame saber cómo aplicaría los términos.
jpshook
Buena respuesta. Estaba listo para responder a esta, pero esa sería una copia de tu respuesta. Puedo agregar que además de los objetos Entidad y Valor, también tiene Eventos de Dominio, etc. Todos los objetos y viven en la capa de Dominio y contribuyen al modelo son objetos de Dominio.
Magnus Backeus
1
Si no es necesario identificar un POCO, ¿cómo puede cargarlo un ORM? ¡Eso no es lógico!
Pascal
1
¿Por qué esta información descaradamente falsa es la más votada y aceptada? POJO NO es un tipo sin lógica. De hecho, Martin Fowler acuñó específicamente el término POJO para contrastarlo con Entity Beans ("estábamos señalando los muchos beneficios de codificar la lógica empresarial en objetos Java normales en lugar de utilizar Entity Beans"). martinfowler.com/bliki/POJO.html
ESTE USUARIO NECESITA AYUDA
1
Lamento si mi comentario fue redactado enérgicamente, pero nuevamente, su experiencia personal realmente no importa cuando el autor del término definió POJO para contener explícitamente la lógica empresarial. De hecho, clasificaría su práctica bajo un modelo de dominio anémico ( martinfowler.com/bliki/AnemicDomainModel.html ) que considera un anti-patrón, y recomienda que use POJO en su lugar. Si es un anti-patrón está fuera del alcance de esta definición, pero una cosa está clara: POJO no significa un objeto sin lógica comercial.
ESTE USUARIO NECESITA AYUDA
18

Es más una connotación de función; un objeto de dominio es algo que es específico de su implementación lógica y puede ser más complejo que un simple POCO; una entidad tiene una connotación para representar algo (generalmente en referencia a un medio de persistencia), y un POCO es solo un identificador rápido para una clase. Un modelo es solo un término que se usa para representar un objeto (generalmente contiene un estado y generalmente se ocupa de la interfaz de usuario o la base de datos).

No es que haya una diferencia funcional, son términos diferentes para describir algo más de cerca. Como la diferencia entre un coche de carreras, una camioneta y un sedán familiar. Todos son automóviles, pero cada término es más descriptivo.

Tejs
fuente
Actualicé para incluir una muestra de código, ¿pueden comentar? Solo quiero asegurarme cuando estoy haciendo preguntas, que estoy usando los términos correctos.
jpshook
18

básicamente se trata de lógica interna

  1. Los objetos de dominio tienen lógica de dominio interna para cosas como validación, etc.
  2. El modelo es básicamente un objeto de dominio ligero, conocen los datos que tienen, pero nada realmente sobre cómo se usarán
  3. Las entidades contienen datos y tienen algún conocimiento interno de dónde provienen y dónde se guardarán, actualizarán, etc.
  4. POCO tiene datos y puede tener algún conocimiento interno sobre sí mismo, cosas como cuál es el valor total de todos los elementos de una colección de propiedades
  5. DTO es el elemento más simple de todos, solo contiene datos y no tiene lógica

Básicamente, todos se usan para lo mismo, es solo lo inteligentes que quieres que sean

según su ejemplo de código, la clase Person sería un objeto de dominio o un modelo, los otros 2 son un servicio y un repositorio. Los objetos de dominio, Pocos, modelos, dtos, etc.se usan como mensajes, se pasan de una capa a la siguiente, una clase de servicio como PersonService es una capa en la aplicación y lo mismo con la clase Repository como PersonRepository. para una buena vista general, eche un vistazo a http://bob-the-janitor.blogspot.com/2009/07/n-tier-design-revisit-part-1-over-view.html en este caso, se trata de usar una entidad de datos que es básicamente un dto

Bob el conserje
fuente
11

Ya hay buenas explicaciones de Dominio y Modelo en las respuestas anteriores.

En una entidad de contexto de base de datos significa elemento en un modelo de relación de entidad ERD . (es decir, una fila en una tabla)

En Microsoft-Dotnet-EntityFramework-World Entity significa un objeto que se puede cargar y guardar en una base de datos utilizando un contexto de datos (base). Por lo general, una entidad no puede existir sin su contexto de datos (base). (Unidad-) Probar la funcionalidad comercial de estas clases es difícil.

Los Pocos (Objetos CommonRuntime antiguos simples) pueden existir sin PersistenceFramework (EntityFramework o NHibernate), por lo que son mucho más fáciles de probar.

La palabra poco es la adaptación de pojo (objeto simple de Java antiguo) que se creó en el mundo de Java por la misma razón.

k3b
fuente
¿Cuál es el motivo de la votación negativa? La pregunta era "¿Cuál es la diferencia entre objetos de dominio, POCO y entidades?" Expliqué la diferencia entre Entity y Poco
k3b
"Ya hay buenas explicaciones de Dominio y Modelo en las respuestas anteriores". ¿Cómo puedo seleccionar una respuesta que dependa de otras respuestas como una respuesta válida?
jpshook
notario público. En retrospectiva, debería haber comentado pidiéndole que proporcione una respuesta completa. Pensará 2x la próxima vez.
jpshook
3

Un objeto de dominio es una entidad en la capa de dominio de su aplicación, por ejemplo. una clase de dirección. "Modelo" significa lo mismo: una entidad en el "Modelo de dominio".

Un POCO (objeto CLR simple y antiguo) es un objeto que no tiene un comportamiento (métodos) definido y solo contiene datos (propiedades). Los POCO se usan generalmente como DTO (objetos de transporte de datos) para transportar datos entre capas, y los datos se usan comúnmente para poblar un objeto / entidad de dominio.

MattDavey
fuente
¿No puede una POCO ser una entidad? Pensé que los POCO pueden tener un comportamiento, pero ¿deben ser persistentes ignorantes?
jpshook
@Developr Sí, sus modelos / entidades de dominio podrían ser de hecho POCO - esto es lo que se conoce como modelo de dominio "anémico" - consulte martinfowler.com/bliki/AnemicDomainModel.html
MattDavey
¿Cómo consideraría esto anémico? ¿Cómo se define "objeto de dominio enriquecido"? Si los objetos de dominio no pueden interactuar directa o indirectamente con la base de datos, ¿qué tipo de funcionalidad enriquecida pueden tener?
jpshook
@Developr Consideraría un modelo de dominio compuesto por objetos POCO anémicos porque tradicionalmente las clases POCO no tienen ninguna funcionalidad rica, solo datos. Siguiendo el principio de Seperation of Concerns ( en.wikipedia.org/wiki/Separation_of_concerns ), un objeto en el modelo de dominio no debería preocuparse en absoluto por el acceso a la base de datos (de ahí el término popular "ignorancia persistente"). El tipo de funcionalidad que debería tener una entidad en el modelo de dominio sería lógica empresarial: deberían capturar y encapsular las reglas lógicas y los flujos de trabajo del problema / dominio que representan.
MattDavey