<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jose Armesto&#39;s Blog</title>
    <link>https://blog.armesto.net/tags/ddd/index.xml</link>
    <description>Recent content on Jose Armesto&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>es-es</language>
    <copyright>Powered by [Hugo](//gohugo.io). Theme by [PPOffice](https://github.com/ppoffice).</copyright>
    <atom:link href="https://blog.armesto.net/tags/ddd/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Stackless Exceptions</title>
      <link>https://blog.armesto.net/stackless-exceptions/</link>
      <pubDate>Sat, 28 Jan 2017 20:00:31 +0000</pubDate>
      
      <guid>https://blog.armesto.net/stackless-exceptions/</guid>
      <description>&lt;p&gt;Este es un post corto donde os enseñaré qué son y por qué son utiles las Stackless Exceptions, o excepciones que no contienen stack trace.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;controlando-el-flujo-de-la-aplicación-con-excepciones&#34;&gt;Controlando el flujo de la aplicación con excepciones&lt;/h2&gt;

&lt;p&gt;Digo que es un post corto porque podríamos entrar en el debate sobre si es buena práctica o no el utilizar excepciones en el código para dirigir el flujo de la aplicación. Con esto me refiero, por ejemplo, a lanzar una excepción cuando el usuario intenta gastarse más dinero del que tiene en la cuenta, y que una clase de otra capa se encargue de capturar esa excepción.
Yo es un patrón que sí utilizo, aunque soy consciente de que mucha gente cree que es un anti patrón, argumentando que es más difícil seguir el flujo del programa, y que es más caro lanzar excepciones que simplemente devolver errores. De hecho, &lt;a href=&#34;https://golang.org/doc/faq#exceptions&#34;&gt;el lenguaje Golang no permite lanzar excepciones&lt;/a&gt;, sino que cada llamada a una función devuelve dos valores: el valor en caso de éxito, y el valor en caso de error. Con esto se intenta conseguir que el flujo de la aplicación sea lineal y fácil de seguir.&lt;/p&gt;

&lt;p&gt;Aunque como digo, no voy a entrar en ese debate, sí es cierto que una de los argumentos &lt;a href=&#34;http://stackoverflow.com/a/567593/563072&#34;&gt;es el coste de lanzar una excepción&lt;/a&gt;.
Si esto es lo que nos preocupa, hay una manera de lanzar excepciones que las hace practicamente gratis: las &lt;strong&gt;stackless exceptions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Muchas veces no nos importa dónde se haya lanzado una excepción. Lo que nos importa realmente es que se ha lanzado. Siguiendo con el ejemplo antes mencionado, imaginad una excepción de negocio que se lanza cuando el usuario intenta realizar un pago pero no tiene suficiente dinero en su cuenta.
Normalmente lanzamos esa excepción para capturarla en una capa superior de la aplicación, pero no es una excepción que necesitemos saber dónde se ha lanzado. Por tanto, puedo ahorrarme el stack trace, que, precisamente, es lo que más cuesta a la hora de construir excepciones.&lt;/p&gt;

&lt;p&gt;Esta excepción es igual que cualquier otra, con la única diferencia de que no tiene stack trace.&lt;/p&gt;

&lt;h2 id=&#34;creando-stackless-exceptions&#34;&gt;Creando Stackless Exceptions&lt;/h2&gt;

&lt;p&gt;Aquí vemos un ejemplo de una excepción que no tendrá información de stack&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-java&#34;&gt;public class NotEnoughMoneyException extends Exception {

    public StacklessException(String message) {
        super(message);
    }

    /**
     * Does not fill in the stack trace for this exception
     * for performance reasons.
     *
     * @return this instance
     * @see java.lang.Throwable#fillInStackTrace()
     */
    @Override
    public Throwable fillInStackTrace() {
        return this;
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lo que hacemos para crear la excepción &lt;code&gt;NotEnoughMoneyException&lt;/code&gt;, es sobreescribir el método &lt;code&gt;fillInStackTrace()&lt;/code&gt;, que es el encargado de guardar esa información. Al sobreescribirlo y que no haga nada, no tendremos stack trace.&lt;/p&gt;

&lt;p&gt;Incluso podrías tener la excepción llamada &lt;code&gt;StacklessException&lt;/code&gt;, y hacer que las excepciones de negocio donde no te interesa el stack trace, hereden de ésta, y no repetir esto en cada excepción. Aunque esto ya es al gusto de cada uno.&lt;/p&gt;

&lt;h2 id=&#34;conclusión&#34;&gt;Conclusión&lt;/h2&gt;

&lt;p&gt;El debate sobre si utilizar excepciones para controlar el flujo de la aplicación sigue ahí, pero el argumento del coste de las excepciones desaparece con esta técnica, donde quitamos el peso del stack trace.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Jugando con conceptos de DDD</title>
      <link>https://blog.armesto.net/jugando-con-conceptos-de-ddd/</link>
      <pubDate>Wed, 29 Oct 2014 00:46:39 +0000</pubDate>
      
      <guid>https://blog.armesto.net/jugando-con-conceptos-de-ddd/</guid>
      <description>&lt;p&gt;El pasado fin de semana se celebró en Barcelona una &lt;a title=&#34;Software Craftmanship Barcelona&#34; href=&#34;http://www.softwarecraftsmanshipbarcelona.org/&#34; target=&#34;_blank&#34;&gt;nueva edición de la Software Craftmanship&lt;/a&gt;, donde se hablaron de diversos temas relacionados con las buenas prácticas a la hora de crear software. Entre ellos, en mi opinión, hubo uno que pareció suscitar mayor interés en la gente y ocupó un papel protagonista en los dos días de conferencia: &lt;strong&gt;Domain Driven Design&lt;/strong&gt;. Es un tema en el que creo que muchos estamos todavía aprendiendo, intentando dar sentido a la inmensa cantidad de conceptos e información que aparecen tanto en &lt;a title=&#34;DDD - Eric Evans&#34; href=&#34;http://www.amazon.es/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215&#34; target=&#34;_blank&#34;&gt;el libro azul&lt;/a&gt; como en &lt;a title=&#34;DDD - Vaughn Vernon&#34; href=&#34;http://www.amazon.es/gp/product/0321834577/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=479290847&amp;pf_rd_s=lpo-top-stripe&amp;pf_rd_t=201&amp;pf_rd_i=0321125215&amp;pf_rd_m=A1AT7YVPFBWXBL&amp;pf_rd_r=1N6RWXVM4AFMHH9P0EGZ&#34; target=&#34;_blank&#34;&gt;el rojo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;En esta búsqueda de sentido, me surgió una duda que creo que no aparece resuelta directamente en ninguno de los dos libros, y que compartí con el resto de asistentes en una de las charlas sobre DDD. Quiero reproducirla otra vez aquí, para poder hablar un poco más sobre el tema. Creo que no hace falta mostrar código, pero realmente me gustaría vuestra opinión, así que si es necesario, decídmelo y añadiré código.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2 id=&#34;creando-value-objects-a-partir-de-entidades&#34;&gt;Creando value objects a partir de entidades&lt;/h2&gt;

&lt;p&gt;Mi duda viene a la hora de combinar dos de los objetos básicos de DDD: las &lt;strong&gt;entidades&lt;/strong&gt; y los &lt;strong&gt;value objects&lt;/strong&gt;. En todos los ejemplos que he visto, los value objects pueden ser simples objetos que no dependen de ningún otro, o que se construyan utilizando otros value objects. Por su parte, las entidades se construyen tradicionalmente sin dependencias, o utilizando algún value object. Mi pregunta es: &lt;strong&gt;¿hay algo que nos impida construir value objects que dependan de entidades, que reciban entidades en su constructor?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cuando lancé esta pregunta durante la sesión de DDD Táctico que impartía &lt;a title=&#34;Christian Soronellas&#34; href=&#34;https://twitter.com/theUniC&#34; target=&#34;_blank&#34;&gt;Christian&lt;/a&gt;, la mayoría de gente me miró como si fuese un loco (solo &lt;a title=&#34;Carlos Ble&#34; href=&#34;https://twitter.com/carlosble/&#34; target=&#34;_blank&#34;&gt;Carlos&lt;/a&gt; parecía encontrar sentido a mis palabras), pero dejadme explicar por qué creo que construir value objects con entidades puede ser perfectamente válido.&lt;/p&gt;

&lt;p&gt;Un value object es un objeto el cual su identidad viene dada por el valor que contiene. No tiene un identificador como tal, porque su propio valor lo identifica. Dos value objects que contienen el mismo valor, son iguales.&lt;/p&gt;

&lt;p&gt;Un ejemplo de caso de uso para mi pregunta podría ser cuando intentamos modelar una aplicación para votar en unas elecciones. Una práctica que suelo utilizar es la de intentar modelar todo el dominio con value objects, y solo &amp;#8220;promocionar&amp;#8221; el objeto a entidad cuando es estrictamente necesario. En este caso, si tenemos ciudadanos que votan, y partidos políticos que pueden ser votados, veo lógico que esos sean entidades, ya que un ciudadano puede hasta cambiarse el nombre y seguir siendo el mismo ciudadano. &lt;strong&gt;Tiene una identidad que lo identifica&lt;/strong&gt; (valga la redundancia). Con el partido político pasa algo parecido: podría cambiar su logotipo, o hasta su nombre, y seguir siendo el mismo.&lt;/p&gt;

&lt;p&gt;Pero para modelar los votos que la gente hace a los partidos, quise intentar hacerlo con un value object. Este value object debe contener qué ciudadano ha votado, a qué partido político, y quizá el momento exacto en el que ha votado. Si decíamos que tanto los ciudadanos como los partidos políticos son entidades&amp;#8230; &lt;strong&gt;este objeto &amp;#8220;voto&amp;#8221; tendría que construirse a partir de entidades&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&#34;inmutabilidad-del-value-object&#34;&gt;Inmutabilidad del value object&lt;/h2&gt;

&lt;p&gt;No recuerdo quién, argumentó que, por definición, los value objects son inmutables, y si un ciudadano se cambiase el nombre entonces el voto habría cambiado, perdiendo su inmutabilidad. Pero esto no es cierto. Precisamente, debido a que las entidades tienen identidad, la forma de decir si una entidad es o no igual a otra, es comparando los identificadores de esas entidades. Si un ciudadano se cambia el nombre, sigue siendo el mismo ciudadano. Por tanto, si un value object &lt;em&gt;Voto&lt;/em&gt; contiene una entidad &lt;em&gt;Ciudadano&lt;/em&gt;, y este ciudadano se cambia el nombre, &lt;strong&gt;el value object sigue sin haber mutado, ya que sigue conteniendo la misma entidad&lt;/strong&gt;: la identidad del ciudadano es la misma.&lt;/p&gt;

&lt;p&gt;Si cambiase el ciudadano que ha votado, o el partido político al que ha votado, &lt;strong&gt;sería otro voto&lt;/strong&gt;. Es el valor del value object lo que le identifica. Es inmutable: yo no puedo coger la papeleta de un voto y tachar una cosa para poner otra.&lt;/p&gt;

&lt;p&gt;Alguien podría preguntarme que por qué complicarme la vida y no hacer una entidad. Creo que modelar con value objects es más simple, manteniendo la inmutabilidad lo máximo posible. Estos votos podrían formar parte de una entidad de elecciones (o algo parecido), que sería lo que finalmente persistiría esos votos en base de datos. Cuantas menos entidades, más sencillo de programar y más sencillo de razonar. ¿Para qué añadir identidades a cosas que no las necesitan?&lt;/p&gt;

&lt;p&gt;Ya sé que no es un ejemplo que aparezca en los libros, pero a mí es un diseño que a priori me cuadra. Solo lo he desarrollado en mi cabeza, así que no sé con qué problemas me podría encontrar. Como soy masoca, lo expongo aquí públicamente para que me lo crujáis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué os parece?&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>