Value Objects y OneToMany

52 views
Skip to first unread message

Víctor Garcia Merediz

unread,
Sep 21, 2018, 7:34:24 AM9/21/18
to DDD-es
Hola,

Tengo una duda acerca de los Value Objects.

Para trastear y practicar un poco estoy desarrollando un sistema de tracking publicitario. Hasta ahora, para empezar sólo tengo la entity Click, que tiene como única propiedad a parte del id el browser, el cual lo he definido como Value Object y que está definido como browser y version:


class Click extends Entity
{
    private $id;
    private $browser;

    public function __construct(
        ClickId $id = null,
        Browser $browser
    )
    {
        $this->id = $id;
        $this->browser = $browser;
    }

    public function id(): ClickId
    {
        return $this->id;
    }

    public function browser(): Browser
    {
        return $this->browser;
    }
}



class Browser extends Entity
{
    private $browser;
    private $version;
    private $clicks;

    public function __construct(
        $browser,
        Version $version
    )
    {
        $this->browser = $browser;
        $this->version = $version;
    }

    public function browser()
    {
        return $this->browser;
    }

    public function version(): Version
    {
        return $this->version;
    }

    public function equals(Browser $browser): bool
    {
        return $browser->browser() == $this->browser()
            && $browser->version() == $this->version();
    }

    public function clicks(): Collection
    {
        return $this->clicks;
    }
}

class Version
{
    private $version;

    public function __construct(
        $version
    )
    {
        $this->version = $version;
    }
}

Tengo bastante claro que Browser es un ValueObject, ya que está definido por sus propiedades (nombre del navegador y versión) pero me mosquea un poco lo de los clicks. Necesto añadirle esa propiedad pero entonces ya no es immutable no? Como lo veis?

Jose Fernandez

unread,
Sep 21, 2018, 8:28:11 AM9/21/18
to ddd...@googlegroups.com
Hola!

Lo primero que quiero expresar es que no te desanimes y el hecho de que estas intentándolo es digno de admirar. Lo segundo es que NUNCA lo vas a hacer bien la primera vez, así que no pierdas mucho tiempo tratando de diseñarlo en el moropo (cabeza) y escribe el código como lo ves en el momento. Ya veras como el diseño empieza a tener sentido, o no, una vez que empiezas a lidiar con repositorios, etc. 

El primer problema que veo es que heredas ambos, Click y Browser, de Entity. Por qué no tienes una clase base ValueObject? Desde el punto de vista de DDD, son dos cosas diferentes. 

Si la memoria no me falla, me parece PHP ese código. No tengo mucha referencia de sus objetos nativos, pero hablaré de C#. 

La estructura DateTime es para mi la mejor manera de explicar ValueObject. Es un objeto que encapsula muchas propiedades y operaciones respecto a si mismo de manera que las entidades o el agregado raíz no tienen que, por ejemplo, calcular UTC en una fecha. Todo eso es delegado al DateTime. 

En tu caso, me atrevería a cuestionar por qué Browser es un ValuéObject cuando en realidad parece un set de data que es importante en este dominio. 

Si algo yo creara un AR UserClick y tendría dos VO Click y Browser. Pero aún así, no estoy seguro si es la solución porque no tengo conocimiento del dominio ni el contexto (Bounded Context). 

Lo otro es que usualmente tus values objects se puedan construir dado un único valor inicial, de manera que a la hora de persistirlo no necesites tener una tabla aparte con una relación y mas bien una columna en una tabla de un Entity, por ejemplo, una fecha. 
Estoy asumiendo base de datos relacionar. 
Esto no es obligatorio pero te ahorrará dolores de cabeza. 

Tienes que hacer DDD con una mentalidad abierta de constante refactory. 

Sent from my iPhone
--
Has recibido este mensaje porque estás suscrito al grupo "DDD-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a ddd-es+un...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a ddd...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/ddd-es.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Víctor Garcia Merediz

unread,
Sep 25, 2018, 4:18:40 AM9/25/18
to DDD-es
Hola PPCUBAN,

Muchas gracias por tú respuesta.

Te voy a hacer caso y voy a empezar a picar código, porqué me estoy atascando en cada detalle y no avanzo nada.
Reply all
Reply to author
Forward
0 new messages