<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Carlos Peix</title>
	<atom:link href="http://carlospeix.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://carlospeix.com</link>
	<description>Algo mas que un desarrollador simpático y bien parecido</description>
	<lastBuildDate>Fri, 02 Sep 2011 11:30:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Take it easy, we have builders</title>
		<link>http://carlospeix.com/2011/06/take-it-easy-we-have-builders/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=take-it-easy-we-have-builders</link>
		<comments>http://carlospeix.com/2011/06/take-it-easy-we-have-builders/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 01:56:18 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://carlospeix.com/?p=121</guid>
		<description><![CDATA[As I said before, it&#8217;s a valuable experience for me to keep in touch with different development teams. Last week we were discussing the best method to validate domain model objects. My first response to that question is: model objects should &#8230; <a href="http://carlospeix.com/2011/06/take-it-easy-we-have-builders/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>As I said before, it&#8217;s a valuable experience for me to keep in touch with different development teams.</p>
<p>Last week we were discussing the best method to validate domain model objects. My first response to that question is: model objects should never be invalid, in the first place.</p>
<p>Each domain object should be fully initialized in its constructor, either by initializing default values or receiving values ​​from the constructor.</p>
<p>Sometimes someone says that does not appreciate consructors with 20 parameters, then I question if the object is large because one or more objects are not yet discovered.</p>
<p>Not to make this post too long, suppose we agree that completely initialize the object with valid values ​​in the constructor and that no public method allows us to modify the state leaving it invalid. In this case, it is never necessary to validate our object because we know that it can never be invalid.</p>
<p>And here we come to the practice recommended to fellow developers last week: if it&#8217;s not trivial to validate a data and, once validated, to build the object, then use a <a href="http://en.wikipedia.org/wiki/Builder_pattern" target="_blank">Builder</a>. Builder&#8217;s responsibilities are:</p>
<ul>
<li>Make sure you have all the necessary data to construct the object</li>
<li>Provide a friendly interface for specifying the data</li>
<li>Construct the object</li>
</ul>
<p>The following example &#8220;fluent API&#8221;:</p>
<pre class="brush: csharp;">public class InvoiceBuilder {
    private Customer _customer;
    private DateTime _date;

    public InvoiceBuilder WithCustomer(Customer customer) {
        _customer = customer;
        return this;
    }

    public InvoiceBuilder WithDate(DateTime date) {
        _date = date;
        return this;
    }

    public Invoice Build() {
        AssertDataCompleteAndValid();
        return new Invoice(_customer, _date);
    }

    private void AssertDataCompleteAndValid() {
        if (_customer == null)
            throw new ArgumentNullException("customer");

        if (_date &lt; DateTime.Today)
            throw new ArgumentOutOfRangeException("date");
    }
}</pre>
<p>And this code would be used this way:</p>
<pre class="brush: csharp;">var invoice = new InvoiceBuilder().
    WithCustomer(jose).
    WithDate(DateTime.Today).
    Build();</pre>
<p>See you!</p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2011/06/take-it-easy-we-have-builders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No desesperen, tenemos los builders</title>
		<link>http://carlospeix.com/2011/06/no-desesperen-tenemos-los-builders/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=no-desesperen-tenemos-los-builders</link>
		<comments>http://carlospeix.com/2011/06/no-desesperen-tenemos-los-builders/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 17:56:56 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://carlospeix.com/?p=114</guid>
		<description><![CDATA[Como ya he dicho antes, el estar en contacto con equipos de desarrollo me resulta una experiencia muy valiosa. Estábamos la semana pasada discutiendo sobre el mejor método para validar objetos del modelo de dominio. Mi primera respuesta ante esa &#8230; <a href="http://carlospeix.com/2011/06/no-desesperen-tenemos-los-builders/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Como ya he dicho antes, el estar en contacto con equipos de desarrollo me resulta una experiencia muy valiosa.</p>
<p>Estábamos la semana pasada discutiendo sobre el mejor método para validar objetos del modelo de dominio. Mi primera respuesta ante esa pregunta es: nunca los objetos del modelo debieran estar inválidos, en primer lugar.</p>
<p>Cada objeto de dominio debiera inicializarse completamente en su constructor, ya sea inicializando valores por defecto, ya sea recibiendo valores desde el inicializador.</p>
<p>Algunas veces alguien menciona que no aprecia los constructores con 20 parámetros a lo cual respondo con un cuestionamiento sobre si realmente ese objeto debe ser tan “grande” o si hay uno o mas objetos no descubiertos aun.</p>
<p>Para no hacer esta entrada demasiado larga, supongamos que acordamos que inicializamos completamente el objeto, con valores válidos en el constructor y que ningún método publico nos permite modificarlo dejándolo en estado invalido (1). En este caso, nunca es necesario validar nuestro objeto puesto que sabemos que, si esta instanciado, nunca puede ser inválido.</p>
<p>Y aquí llegamos a la práctica que recomendé a unos colegas la semana pasada: si no es trivial validar una serie de datos y, una vez validados, construir el objeto, entonces usen un <a href="http://en.wikipedia.org/wiki/Builder_pattern" target="_blank">Builder</a>. Las responsabilidades del Builder son varias:</p>
<ul>
<li>Asegurarse de tener todos los datos necesarios para construir el objeto</li>
<li>Proporcionar una interfaz amigable para la especificación de todos los datos</li>
<li>Construir el objeto</li>
</ul>
<p>A continuación ejemplo con “fluent API”:</p>
<pre class="brush: csharp;">public class FacturaBuilder {
    private Cliente _cliente;
    private DateTime _fecha;

    public FacturaBuilder ConCliente(Cliente cliente) {
        _cliente = cliente;
        return this;
    }

    public FacturaBuilder ConFecha(DateTime fecha) {
        _fecha = fecha;
        return this;
    }

    public Factura Build() {
        AssertDatosSuficientesYCorrectos();
        return new Factura(_cliente, _fecha);
    }

    private void AssertDatosSuficientesYCorrectos() {
        if (_cliente == null)
            throw new ArgumentNullException("cliente");

        if (_fecha &lt; DateTime.Today)
            throw new ArgumentOutOfRangeException("fecha");
    }
}</pre>
<p>Y este código se usaría de esta manera:</p>
<pre class="brush: csharp;">var factura = new FacturaBuilder().
    ConCliente(jose).
    ConFecha(DateTime.Today).
    Build();</pre>
<p>Nos vemos!</p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2011/06/no-desesperen-tenemos-los-builders/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>&#191;Cu&#225;l es la diferencia entre el patr&#243;n strategy y state?</title>
		<link>http://carlospeix.com/2011/04/cul-es-la-diferencia-entre-el-patrn-strategy-y-state/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cul-es-la-diferencia-entre-el-patrn-strategy-y-state</link>
		<comments>http://carlospeix.com/2011/04/cul-es-la-diferencia-entre-el-patrn-strategy-y-state/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 16:04:08 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[diseño]]></category>
		<category><![CDATA[ood]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[solid]]></category>

		<guid isPermaLink="false">http://carlospeix.com/?p=111</guid>
		<description><![CDATA[El jueves pasado estuvimos viendo temas de polimorfismo en el curso Elementos avanzados de arquitectura de software con objetos y, al cabo de un ejemplo, yo plantee que lo que habíamos visto era el patrón State. Hernán me puso cara &#8230; <a href="http://carlospeix.com/2011/04/cul-es-la-diferencia-entre-el-patrn-strategy-y-state/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>El jueves pasado estuvimos viendo temas de polimorfismo en el curso <a href="http://www.10pines.com/content/elementos-avanzados-de-arquitectura-de-software-con-objetos" target="_blank">Elementos avanzados de arquitectura de software con objetos</a> y, al cabo de un ejemplo, yo plantee que lo que habíamos visto era el patrón <a href="http://www.dofactory.com/Patterns/PatternState.aspx" target="_blank">State</a>. <a href="http://twitter.com/#!/HernanWilkinson" target="_blank">Hernán</a> me puso cara de “no tanto” y sospecho que en próximas clases entenderé el porqué.</p>
<p>Sin embargo surgió un mini debate con unos de mis compañeros de curso: el argumentaba que en realidad lo que habíamos visto era el patrón <a href="http://www.dofactory.com/Patterns/PatternStrategy.aspx" target="_blank">Strategy</a>. Creo que esta es una duda común porque ambos patrones son parecidos en algunos aspectos de la implementación y en el diagrama de clases pero son conceptualmente distintos, por lo tanto me pareció bueno escribir un pequeño post.</p>
<p>El patrón <a href="http://www.dofactory.com/Patterns/PatternState.aspx" target="_blank">State</a> permite <strong>hacer diferentes cosas</strong> dependiendo del estado del objeto. En otras palabras, lo que cambia de acuerdo al estado es <strong>que</strong> se hace. Además, todas las posibilidades están incluidas en el código del modelo. A la hora de agregar nuevos estados y su correspondiente acción asociada basta con agregar una subclase sin tocar las demás (observando el Open-Close principle).</p>
<p>En cambio el patrón <a href="http://www.dofactory.com/Patterns/PatternStrategy.aspx" target="_blank">Strategy</a> permite <strong>hacer lo mismo de diferentes maneras</strong>. En otras palabras, lo que cambia es <strong>como</strong> se hace. Este patrón usualmente permite que la implementación específica (la estrategia) se pueda seleccionar por configuración, por el estado de cierto objeto, etc.</p>
<p>Les dejo algunos links en inglés que aportan mas detalles:</p>
<p><font color="#0066cc"><a href="http://stackoverflow.com/questions/1658192/what-is-the-difference-between-strategy-design-pattern-and-state-design-pattern" target="_blank">http://stackoverflow.com/questions/1658192/what-is-the-difference-between-strategy-design-pattern-and-state-design-pattern</a></font></p>
<p><font color="#0066cc"><a href="http://www.c-sharpcorner.com/UploadFile/rmcochran/strategy_state01172007114905AM/strategy_state.aspx" target="_blank">http://www.c-sharpcorner.com/UploadFile/rmcochran/strategy_state01172007114905AM/strategy_state.aspx</a></font></p>
<p><a href="http://c2.com/cgi/wiki?StrategyPattern" target="_blank">http://c2.com/cgi/wiki?StrategyPattern</a></p>
<p>[PDF] <a href="http://userpages.umbc.edu/~tarr/dp/lectures/StateStrategy.pdf" target="_blank">http://userpages.umbc.edu/~tarr/dp/lectures/StateStrategy.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2011/04/cul-es-la-diferencia-entre-el-patrn-strategy-y-state/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Volviendo al preescolar en dise&#241;o orientado a objetos</title>
		<link>http://carlospeix.com/2011/04/volviendo-al-preescolar-en-disenio-orientado-a-objetos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=volviendo-al-preescolar-en-disenio-orientado-a-objetos</link>
		<comments>http://carlospeix.com/2011/04/volviendo-al-preescolar-en-disenio-orientado-a-objetos/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 11:14:44 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[diseño]]></category>
		<category><![CDATA[ood]]></category>

		<guid isPermaLink="false">http://carlospeix.com/?p=105</guid>
		<description><![CDATA[Ayer comencé el curso Elementos avanzados de arquitectura de software con objetos de 10Pines, a cargo de Hernán Wilkinson (@HernanWilkinson). Intentaré contar mis vivencias luego de cada una de las 6 clases, sin mucho análisis, en su versión cruda. Luego &#8230; <a href="http://carlospeix.com/2011/04/volviendo-al-preescolar-en-disenio-orientado-a-objetos/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ayer comencé el curso <a href="http://www.10pines.com/content/elementos-avanzados-de-arquitectura-de-software-con-objetos" target="_blank">Elementos avanzados de arquitectura de software con objetos</a> de <a href="http://www.10pines.com/" target="_blank">10Pines</a>, a cargo de Hernán Wilkinson (<a href="http://twitter.com/#!/HernanWilkinson" target="_blank">@HernanWilkinson</a>).</p>
<p>Intentaré contar mis vivencias luego de cada una de las 6 clases, sin mucho análisis, en su versión cruda. Luego vendrá el tiempo de las conclusiones.</p>
<p>Antes de comenzar el curso estuve releyendo algún material relevante sobre diseño orientado a objetos (DOO), sobre todo el libro <a href="http://www.amazon.com/Smalltalk-Objects-Design-Chamond-Liu/dp/1583484906" target="_blank">Smalltalk, Object and Desing</a>, de Chamond Liu. Recomiendo este libro que, a pesar de su apariencia sencilla, no tiene desperdicio, una ganga por USD 24.</p>
<p>Vuelvo al curso. Es evidente que Hernán tiene mucha experiencia enseñando “objetos” ya que nos mantuvo interesados durante cuatro horas con tres simples conceptos: objetos, colaboración y mensajes, todo esto sin tocar las computadoras.</p>
<p>Lo primero que nos pidió fue que, momentáneamente, nos olvidáramos de todo lo que sabíamos de diseño orientado a objetos (DOO). Creo que es el enfoque apropiado para el curso ya que es usual que tengamos muchos conceptos mal aprendidos y eso dificultaría bastante el aprendizaje.</p>
<p>Aquellos con los que he hablado del tema sabrán que hace varios años hice mi “click” y comencé a dar el próximo paso en DOO, empezando a prestar mas atención al comportamiento en los objetos y menos al estado.</p>
<p>Ese fue el eje de la clase de ayer, el funcionamiento de cualquier programa consiste en <strong>objetos</strong> <strong>colaborando</strong> entre si mediante el envío de <strong>mensajes</strong> (“aproximadamente” métodos en Java o .NET). Cuales son esos objetos, cuales son esos mensajes forma parte de la tarea difícil del diseñador. Es ahí donde esta la fortaleza del diseño que hará que nuestro código sea fácil de mantener o una verdadera pesadilla.</p>
<p>Hernán destila Smalltalk por los poros y no tiene manera de disimularlo (y creo que tampoco quiere), personalmente valoro mucho esto porque nos permite aprender las técnicas en un entorno puro, ya habrá tiempo luego para “perder flexibilidad” en otras plataformas.</p>
<p>El próximo jueves o viernes la próxima entrega.</p>
<p>Nos vemos.</p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2011/04/volviendo-al-preescolar-en-disenio-orientado-a-objetos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Principios SOLID 1, ejemplo con SRP, DIP y OCP</title>
		<link>http://carlospeix.com/2010/11/principios-solid-1-ejemplo-con-srp-dip-y-ocp/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=principios-solid-1-ejemplo-con-srp-dip-y-ocp</link>
		<comments>http://carlospeix.com/2010/11/principios-solid-1-ejemplo-con-srp-dip-y-ocp/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 09:10:22 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[diseño]]></category>
		<category><![CDATA[ood]]></category>
		<category><![CDATA[solid]]></category>

		<guid isPermaLink="false">http://carlospeix.com/?p=66</guid>
		<description><![CDATA[<!--:es-->Ejemplo de aplicacion de los siguientes principios SOLID: principio de responsabilidad unica (o SRP, single responsability principle), principio de inversion de dependencias (o DIP, dependency inversion principle) y principio abierto-cerrado (o OCP, open-close principle).<!--:--> <a href="http://carlospeix.com/2010/11/principios-solid-1-ejemplo-con-srp-dip-y-ocp/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:es-->Les presento el primero de una serie de videos donde repetiré los refactorings basados en principios SOLID que mostré en la <a title="VAN sobre principios SOLID" href="http://carlospeix.com/es/2010/10/van-sobre-principios-solid-en-altnethispano/" target="_self">VAN de AltNetHispano</a>. La ventaja que tienen estos videos sobre los de la VAN es que estan particionados, uno para cada ejemplo y vienen acompañados con el código fuente antes y después del ejercicio.</p>
<p>El repositorio de código fuente podrán encontralo en <a title="Codigo de ejemplos SOLID" href="https://github.com/cpeix/solid-examples" target="_blank">aquí</a> y, una vez descargado, deberían ejecutar el siguiente comando para que quede tal como lo ven al principio del ejemplo:</p>
<p><code>$ git checkout ejemplos-base</code></p>
<p>Este comando posiciona el repositorio en el tag &#8220;ejemplos-base&#8221;, para dejarlo tal como queda al final de este ejemplo:</p>
<p><code>$ git checkout ejemplos-verificador</code></p>
<p>Mas abajo comento ciertos momentos interesantes en el video para aquellos que deseen un acceso directo.</p>
<p><object id="csSWF" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="464" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="/wp-content/uploads/videos/solid-verificador/solid-verificador_controller.swf" /><param name="bgcolor" value="#1a1a1a" /><param name="quality" value="best" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="flashVars" value="autostart=false#&amp;thumb=FirstFrame.png&amp;thumbscale=45&amp;color=0x000000,0x000000" /><param name="name" value="csSWF" /><param name="flashvars" value="autostart=false&amp;thumb=/wp-content/uploads/videos/solid-verificador/FirstFrame.png&amp;thumbscale=45&amp;color=0x000000,0x000000" /><param name="allowfullscreen" value="true" /><embed id="csSWF" type="application/x-shockwave-flash" width="600" height="464" src="/wp-content/uploads/videos/solid-verificador/solid-verificador_controller.swf" name="csSWF" flashvars="autostart=false&amp;thumb=/wp-content/uploads/videos/solid-verificador/FirstFrame.png&amp;thumbscale=45&amp;color=0x000000,0x000000" scale="showall" allowfullscreen="true" allowscriptaccess="always" quality="best" bgcolor="#1a1a1a"></embed></object></p>
<p>En el minuto 1:20 presento el ejemplo del verificador.</p>
<p>En el minuto 3:45 explico el refactoring aplicando el principio de responsabilidad única (SRP).</p>
<p>En el minuto 6:35, una vez concluido el refactoring anterior, comienzo a analizar el código para identificar otro problema de diseño. Explico el principio de inversion de dependencias (DIP) y como aplicarlo al ejemplo.</p>
<p>En el minuto 11:10 doy un paso más con un problema de diseño mas sutil que termina con la descripción y aplicación al ejemplo del principio abierto-cerrado (OCP).</p>
<p>En el minuto 16:15 repaso los refactorings aplicados.</p>
<p>Si tuvieran alguna consulta o duda, no duden en contactarme.</p>
<p>Nos vemos.<!--:--><!--:en--></p>
<p><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2010/11/principios-solid-1-ejemplo-con-srp-dip-y-ocp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Avance sobre la VAN sobre integracion continua</title>
		<link>http://carlospeix.com/2010/10/avance-sobre-la-van-sobre-integracion-continua/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=avance-sobre-la-van-sobre-integracion-continua</link>
		<comments>http://carlospeix.com/2010/10/avance-sobre-la-van-sobre-integracion-continua/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 11:11:57 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[integracion continua]]></category>

		<guid isPermaLink="false">http://carlospeix.com/?p=59</guid>
		<description><![CDATA[<!--:es-->Avance sobre la VAN de AltNetHispano sobre integracion continua, con Andres Vettori, JOse Romaniello y Vicenç Garcia.<!--:--> <a href="http://carlospeix.com/2010/10/avance-sobre-la-van-sobre-integracion-continua/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:es--><strong>UPDATE</strong>: les dejo el video de la VAN mas abajo y <a title="Presentación Integracion Continua" href="http://carlospeix.com/wp-content/uploads/2010/11/CI.ppt" target="_blank">la presetnación</a>.</p>
<p>Mañana viernes tendremos otra VAN interesante en <a title="AltNetHispano" href="http://altnethispano.org/" target="_blank">AltNetHispano</a>.</p>
<p>Esta vez el tema es Integración Contínua desde el punto de vista de las herramientas y las prácticas. Ya nos presentó el concepto hace unos meses el Sensei <a title="Sensei Martin Salias" href="http://salias.com.ar/" target="_blank">Martin Salias</a> en <a title="VAN sobre automatizacion" href="http://altnet-hispano.pbworks.com/van-2009-12-18-automatizacion" target="_blank">otra VAN</a> sobre automatización en general.</p>
<p>Esta vez me gustaría hablar sobre la orquestación de un entorno de integración contínua con herramientas como: un repositorio (ya sea Subversion, Git, Hg o TFS), una herramienta para escribir scripts (ya sea NAnt, MSBuild, Rake?) y una herramienta de integración contínua (ya sea CruiseControl.NET, TeamCity, TFS o Hudson).</p>
<p>También hablaré sobre distintas políticas de branching de acuerdo a las necesidades de cada proyecto y como utilizar estas políticas junto con integración contínua.</p>
<p>Luego vendrá la parte en que varios amigos me ayudarán mostrando casos reales describiendo situaciones reales en las cuales la integración contínua los ayuda día a día.</p>
<p><a title="Andres Vettori" href="http://weblogs.asp.net/andresv" target="_blank">Andres Vettori</a> (<a title="Andres Vettori en twitter" href="http://twitter.com/andresvettori" target="_blank">@andresvettori</a>) va a contar como se utiliza integración contínua con Team Foundation Server 2010 en la empresa <a title="VMBC" href="http://www.vmbc.com/" target="_blank">VMBC</a> para desarrollar aplicaciones multi-cliente basados en plataforma Microsoft (Hyper-V 2.0, Windows 2008 R2, SQL Server 2008, IIS 7.5, .NET 4.0, ASP.NET, ASP.NET MVC, Silverlight, <a title="Retina ORM" href="http://retina.codeplex.com/" target="_blank">Retina.NET</a> como ORM). Hablará de los retos que tuvieron y las etapas de madurez por las que pasaron como equipo, mostrando brevemente la solución implementada actualmente y algunas ideas que tienen para el futuro.</p>
<p><a title="Jose Romaniello" href="http://jfromaniello.blogspot.com/" target="_blank">Jose Romaniello</a> (<a title="Jose Romaniello en twitter" href="https://twitter.com/jfroma" target="_blank">@jfroma</a>) va a mostrar las distintas facilidades de configuración de TeamCity configurando un miniproyecto (que ya tendrá listo para lAN) desde cero con Mercurial/NUnit/etc.</p>
<p><a title="Vicenç Garcia" href="http://devnettips.blogspot.com/" target="_blank">Vicenç Garcia</a> (<a title="Vicenç Garcia en twitter" href="http://www.twitter.com/vgaltes" target="_blank">@vgaltes</a>) nos contará sobre la situación en una empresa anterior a la utilización de la integración contínua, el estado de caos y descontrol en el que se encontraba el equipo. Un análisis de la situación los llevó al camino obvio de empezar con un repositorio de código y un servidor de integración continua. Se decidieron por Hudson por su facilidad de configuración. También detallará su situación actual y dónde les gustaria llegar. Trabaja sobre una aplicacion cliente/servidor WinForms sobre SqlServer, Oracle, Progress<br />
y Firebird.</p>
<p>Por último y si nos queda tiempo, yo hablare de algunas experiencias reales sobre complilación, prueba y despliegue automatizado de aplicaciones ASP.NET utilizando CruiseControl, NAnt, MSBuild, etc.</p>
<p><object id="scPlayer" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="393" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/flvplayer.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="thumb=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/FirstFrame.jpg&amp;containerwidth=600&amp;containerheight=393&amp;content=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/van-2010-10-29.flv&amp;blurover=false" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="allowScriptAccess" value="always" /><param name="base" value="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/" /><param name="src" value="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/flvplayer.swf" /><param name="flashvars" value="thumb=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/FirstFrame.jpg&amp;containerwidth=600&amp;containerheight=393&amp;content=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/van-2010-10-29.flv&amp;blurover=false" /><param name="allowfullscreen" value="true" /><embed id="scPlayer" type="application/x-shockwave-flash" width="600" height="393" src="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/flvplayer.swf" base="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/" allowscriptaccess="always" scale="showall" allowfullscreen="true" flashvars="thumb=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/FirstFrame.jpg&amp;containerwidth=600&amp;containerheight=393&amp;content=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/van-2010-10-29.flv&amp;blurover=false" bgcolor="#FFFFFF" quality="high" data="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/flvplayer.swf"></embed></object><!--:--><!--:en--></p>
<p><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2010/10/avance-sobre-la-van-sobre-integracion-continua/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/fa318142-7c0d-4b7f-b1a8-685a152be582/van-2010-10-29.flv&amp;amp" length="481207982" type="video/x-flv" />
		</item>
		<item>
		<title>VAN sobre principios SOLID en AltNetHispano</title>
		<link>http://carlospeix.com/2010/10/van-sobre-principios-solid-en-altnethispano/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=van-sobre-principios-solid-en-altnethispano</link>
		<comments>http://carlospeix.com/2010/10/van-sobre-principios-solid-en-altnethispano/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 11:59:15 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[ood]]></category>
		<category><![CDATA[solid]]></category>

		<guid isPermaLink="false">http://carlospeix.com/?p=35</guid>
		<description><![CDATA[<!--:es-->Breve resumen sobre la VAN en AltNetHispano del sabado 23 de Octubre. Los temas que salieron, las consultas, los comentarios, etc.<!--:--> <a href="http://carlospeix.com/2010/10/van-sobre-principios-solid-en-altnethispano/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--:es-->El sábado pasado participé como ponente en una VAN (reunión virtual) de <a title="AltNetHispano" href="http://altnethispano.org/" target="_blank">AltNetHispano </a>sobre <a title="Principios SOLID" href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank">principios SOLID</a> (uno de los temas que más me gusta de esta profesión). <a title="VANs AltNetHispano" href="http://altnethispano.org/reuniones/historico.aspx" target="_blank">Aquí</a> podrán encontrar el listado completo de videos de VANs o verla directamente aquí:</p>
<p>Presentación: <a title="Presentación SOLID" href="../wp-content/uploads/2010/10/SOLID.ppt" target="_blank">aquí</a>. Código antes de aplicar los refactorings: <a title="Código de la presentacion SOLID" href="http://github.com/cpeix/solid-examples" target="_blank">aquí</a>.</p>
<p>Les dejo el video gentilmente editado por la gente de AltNetHispano, si quieren un adelanto, lean el resumen que dejo abajo.</p>
<p><object id="scPlayer" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="378" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/flvplayer.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="thumb=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/FirstFrame.jpg&amp;containerwidth=600&amp;containerheight=378&amp;content=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/van-2010-10-23.flv&amp;blurover=false" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="allowScriptAccess" value="always" /><param name="base" value="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/" /><param name="src" value="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/flvplayer.swf" /><param name="flashvars" value="thumb=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/FirstFrame.jpg&amp;containerwidth=600&amp;containerheight=378&amp;content=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/van-2010-10-23.flv&amp;blurover=false" /><param name="allowfullscreen" value="true" /><embed id="scPlayer" type="application/x-shockwave-flash" width="600" height="378" src="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/flvplayer.swf" base="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/" allowscriptaccess="always" scale="showall" allowfullscreen="true" flashvars="thumb=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/FirstFrame.jpg&amp;containerwidth=600&amp;containerheight=378&amp;content=http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/van-2010-10-23.flv&amp;blurover=false" bgcolor="#FFFFFF" quality="high" data="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/flvplayer.swf"></embed></object></p>
<p>Quiero compartir en este post es un breve resumen sobre los temas que surgieron como preguntas y las repercusiones con el fin de que sirva de guia para aquel que quiera ver el video de 2 horas y algo más.</p>
<p>Mostré 3 o 4 ejemplos de código real de alguno de mis proyectos o extractado de algún caso real de clientes de consultoría.</p>
<p>En el primer ejemplo transformamos una clase que violaba claramente el <a title="SR principle" href="http://www.objectmentor.com/resources/articles/srp.pdf" target="_blank">principio de responsabilidad única</a>. Separamos el código en dos clases. Luego avanzamos un poco más sobre el caso analizando una violación al <a title="DI principle" href="http://www.objectmentor.com/resources/articles/dip.pdf" target="_blank">principio de inversión de la dependencia</a> y también codificamos una solución.</p>
<p>En el segundo ejemplo tomamos como base una <a title="Consulta AOO" href="http://groups.google.com/group/altnet-hispano/browse_thread/thread/c0fde06e73a2bb07?hl=es" target="_blank">consulta</a> hecha por Edgar Ramos la <a title="Grupo AltNetHispano" href="http://groups.google.com/group/altnet-hispano?hl=es" target="_blank">lista de AltNetHispano</a>, en el que planteaba un problema que me pareció muy útil para demostrar el <a title="OC principle" href="http://www.objectmentor.com/resources/articles/ocp.pdf" target="_blank">principio abierto-cerrado</a>.</p>
<p>El tercer ejemplo vimos el <a title="IS principle" href="http://www.objectmentor.com/resources/articles/isp.pdf" target="_blank">principio de segregación de interfaces</a>. Presenté una refactorización del patrón repositorio separándolo en un repositorio básico basado en generics y uno o más <a title="Enhanced Query Object" href="http://fabiomaulo.blogspot.com/2010/07/enhanced-query-object.html" target="_blank">Enhanced Query Objects</a> del gran <a title="Fabio Maulo" href="http://twitter.com/fabiomaulo" target="_blank">@fabiomaulo</a> (el gran ausente de la VAN, el pobre estaba sin PC, parece).</p>
<p>Hablando sobre el ejemplo anterior conté una anécdota sobre un reemplazo de repositorios que tuvimos que encarar (desde IBatis.NET a NHibernate) y nos costó bastante por estar en clara violación del <a title="LS principle" href="http://www.objectmentor.com/resources/articles/lsp.pdf" target="_blank">principio de sustitucion de Liskov</a>.</p>
<p>El cuarto ejemplo fue una respuesta a la <a title="Grupo AltNetHispano" href="http://groups.google.es/group/altnet-hispano/browse_thread/thread/5133a76f94f9e062" target="_blank">consulta de un colega</a> sobre un procesador de archivos basado en reglas que fuera configurable. Propuse una solución basada en interfaces y Windsor como container de inyección de dependencias.</p>
<p>Tanto durante la VAN como en twitter (<a href="https://twitter.com/#!/mhcornejo/status/28524922491" target="_blank">aquí</a> y <a href="https://twitter.com/#!/rogernavarroitm/status/28527394357" target="_blank">aquí</a>) surgieron comentarios interesantes y preguntas (ver repercusión <a href="https://twitter.com/#%21/LesterQuite/status/28528118153" target="_blank">aquí</a>). Sobre todo esto trataré de escribir posts ampliando mis respuestas.</p>
<p>Por último los comentarios que me llenan de orgullo (<a href="https://twitter.com/#!/elduende/status/28532397423" target="_blank">aquí</a>, <a href="https://twitter.com/#!/LesterQuite/status/28533130132" target="_blank">aquí</a> y <a href="https://twitter.com/#!/rogernavarroitm/status/28533351635" target="_blank">aquí</a>) puesto que vienen de mis colegas, a los cuales también respeto mucho.</p>
<p>Si lo desean pueden descargar <a title="Presentación SOLID" href="http://carlospeix.com/wp-content/uploads/2010/10/SOLID.ppt" target="_blank">la presentación</a> y la</p>
<p>Referencias:</p>
<p>[1] <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank">http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod</a><br />
[2] <a href="http://en.wikipedia.org/wiki/Solid_(object-oriented_design)" target="_blank">http://en.wikipedia.org/wiki/Solid_(object-oriented_design)</a><br />
[3] <a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx" target="_blank">http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx</a><br />
[4] <a href="http://blogs.msdn.com/b/cdndevs/archive/2009/07/15/the-solid-principles-explained-with-motivational-posters.aspx" target="_blank">http://blogs.msdn.com/b/cdndevs/archive/2009/07/15/the-solid-principles-explained-with-motivational-posters.aspx</a><br />
[5] <a href="http://cdn.cloudfiles.mosso.com/c82752/pablos_solid_ebook.pdf" target="_blank">http://cdn.cloudfiles.mosso.com/c82752/pablos_solid_ebook.pdf</a><br />
[6] <a href="http://www.hanselminutes.com/default.aspx?showID=163" target="_blank">http://www.hanselminutes.com/default.aspx?showID=163</a></p>
<p>Gracias a todos.<!--:--><!--:en--></p>
<p><!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2010/10/van-sobre-principios-solid-en-altnethispano/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
<enclosure url="http://content.screencast.com/users/AltNetHispano/folders/VAN/media/9b81b8de-3e44-4155-a4e0-1cc5e8a8d8e8/van-2010-10-23.flv&amp;amp" length="516885289" type="video/x-flv" />
		</item>
		<item>
		<title>Code Camp 2010 en Buenos Aires, aprendiendo entre amigos</title>
		<link>http://carlospeix.com/2010/09/code-camp-2010-en-buenos-aires-aprendiendo-entre-amigos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=code-camp-2010-en-buenos-aires-aprendiendo-entre-amigos</link>
		<comments>http://carlospeix.com/2010/09/code-camp-2010-en-buenos-aires-aprendiendo-entre-amigos/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 19:24:00 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://carlospeix.com.ar/2010/09/code-camp-2010-en-buenos-aires-aprendiendo-entre-amigos/</guid>
		<description><![CDATA[Ayer anduve por el CodeCamp 2010 en Buenos Aires y, como siempre, lo mejor fue ver a muchos amigos. Primero estuve viendo Iron Ruby paso a paso a cargo de Johnny Halife mostrando la integración de componentes escritos en .NET &#8230; <a href="http://carlospeix.com/2010/09/code-camp-2010-en-buenos-aires-aprendiendo-entre-amigos/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ayer anduve por el CodeCamp 2010 en Buenos Aires y, como siempre, lo mejor fue ver a muchos amigos.</p>
<p>Primero estuve viendo <a href="http://www.codecamp.com.ar/ironruby-paso-a-paso.aspx" target="_blank">Iron Ruby paso a paso</a> a cargo de <a href="http://twitter.com/johnnyhalife" target="_blank">Johnny Halife</a> mostrando la integración de componentes escritos en .NET y código Ruby. El ejemplo no fue trivial, diría incluso que interesante para los que aun no nos convencen las técnicas de acceso a datos de Ruby. Jonhy escribio repositorios en .NET y mostro como usarlos desde IronRuby.</p>
<p>Update: Johnny publicó sus comentarios <a href="http://blogs.southworks.net/jhalife/2010/09/05/iron-ruby-code-camp-buenos-aires-2010/" target="_blank">aquí</a>.</p>
<p>Luego del break estuve en el <a href="http://www.codecamp.com.ar/randori-coding-dojo-usando-visual-studio-2010-y-c-4-0.aspx" target="_blank">Randori Coding Dojo</a> con <a href="http://twitter.com/aeidelman" target="_blank">Adrian Eidelman</a> y <a href="http://twitter.com/raltman" target="_blank">Ruben Altman</a>. Fue una experiencia interesante, estos muchachos se mandaron con una actividad muy difícil ante público desconocido porque depende fuertemente de la colaboración.</p>
<p>El ejercicio propuesto fue la lógica de un tablero de puntuación de tenis y me gusto ya que tiene un nivel de dificultad variado permitiendo atacar cuestiones sencillas al principio. Creo que logramos un buen ejemplo de TDD, pequeños pasos, solo escribir el código necesario para pasar el test, refactoring, etc.</p>
<p>Finalmente salió muy bien, aprendimos varias cosas sobre como llevar adelante este tipo de ejercicios. Seguramente postearé algo al respecto próximamente.</p>
<p>Luego del almuerzo me di una vuelta por la sesión <a href="http://www.codecamp.com.ar/1aspnet-mvc-tips-and-tricks-avanzados.aspx" target="_blank">ASP.NET MVC Tips and Tricks</a> de la gente de <a href="http://www.blackfishweb.com/" target="_blank">BalckFish</a>. Me gustaron los tips, muchos ayudan a dar un pasito mas en el esfuerzo por hacer cada vez mas eficiente nuestro software. Pueden encontrar el codigo en un proyecto Visual Studio 2010 <a href="http://www.blackfishweb.com/blog/codigo_codecamp" target="_blank">aquí</a>.</p>
<p>Por último me di una vuelta por la sesión <a href="http://www.codecamp.com.ar/productividad-mas-all%C3%A1-de-la-velocidad-de-tus-dedos.aspx" target="_blank">Productividad mas allá de la velocidad de tus dedos</a> de <a href="https://twitter.com/kzu" target="_blank">@kzu</a> y <a href="https://twitter.com/vga" target="_blank">@vga</a>. En la primera parte kzu se mando un ejercicio de TDD interesante pero puso en relieve una vez mas que el TDD es un tema difícil para mostrar en publico y con tiempo acotado. Definitivamente es algo para aprender haciendo en lugar de mirando.</p>
<p>Por último quiero felicitar a <a href="https://twitter.com/masaez" target="_blank">Miguel Saez</a> y a Microsoft por la organización, todos los años nos da un buen lugar donde encontrar amigos.</p>
<p>Nos vemos</p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2010/09/code-camp-2010-en-buenos-aires-aprendiendo-entre-amigos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De como Charly cantó sobre software</title>
		<link>http://carlospeix.com/2010/02/de-como-charly-canto-sobre-software/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=de-como-charly-canto-sobre-software</link>
		<comments>http://carlospeix.com/2010/02/de-como-charly-canto-sobre-software/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 22:23:00 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[diseño]]></category>

		<guid isPermaLink="false">http://carlospeix.com.ar/2010/02/de-como-charly-canto-sobre-software/</guid>
		<description><![CDATA[En su tema Dinosaurios Charly dice: Los amigos del barrio pueden desaparecer los cantores de radio pueden desaparecer los que están en los diarios pueden desaparecer la persona que amas puede desaparecer. y sigue en la segunda estrofa: Los que &#8230; <a href="http://carlospeix.com/2010/02/de-como-charly-canto-sobre-software/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En su tema Dinosaurios <a href="http://es.wikipedia.org/wiki/Charly_Garc&iacute;a" target="_blank">Charly</a> dice:</p>
<blockquote><p><em>Los amigos del barrio pueden desaparecer        <br />los cantores de radio pueden desaparecer         <br />los que están en los diarios pueden desaparecer         <br />la persona que amas puede desaparecer.</em></p>
</blockquote>
<p>y sigue en la segunda estrofa:</p>
<blockquote><p><em>Los que están en el aire pueden desaparecer, en el aire.        <br />Los que están en la calle pueden desaparecer, en la calle.         <br />Los amigos del barrio pueden desaparecer,         <br />pero los dinosaurios van a desaparecer.</em></p>
</blockquote>
<p>En el último renglón pronostica que los dinosaurios van a desaparecer como han aparecido y desaparecido innumerables dinosaurios en la industria del software.</p>
<p>Por supuesto que no entraré aquí en detalles sobre cuales son “mis” dinosaurios, seria una discusión inútil puesto que cada uno tendrá los suyos.</p>
<p>Lo mas importante viene a continuación:</p>
<blockquote><p><em>Si los pesados, mi amor,        <br />llevan todo ese montón         <br />de equipaje en la mano         <br />Oh! mi amor         <br />yo quiero estar liviano.</em></p>
</blockquote>
<p>y remata con el consejo:</p>
<blockquote><p><em>Cuando el mundo tira para abajo        <br />es mejor no estar atado a nada,         <br />imaginen a los dinosaurios en la cama.</em></p>
</blockquote>
<p>Aunque no hace falta que el mundo tire para abajo, la enseñanza para los que diseñamos software es bien directa: debemos andar livianos.</p>
<p>Andar livianos en en diseño de software es elegir con criterio y libertad los frameworks que necesitamos y, sobre todo, descartar lo que no necesitamos. Cuanto mas pequeños e independientes mejor.</p>
<p>No recomiendo esos frameworks que arrastran un montón de otros componentes, muchos menos los monolíticos que “solucionan todo”, desde la persistencia hasta la interfaz a usuario.</p>
<p>Andemos livianos colegas, no nos atemos a nada.</p>
<p>Sabiendo que soy mal comentarista, les dejo la <a href="http://www.letras-canciones.com.ar/letras-id=5564.html" target="_blank">letra</a> y la <a href="http://www.youtube.com/watch?v=CR614AG-FUo" target="_blank">versión cantada</a> por <a href="http://es.wikipedia.org/wiki/Charly_Garc&iacute;a" target="_blank">Charly</a></p>
<p>Nos vemos.</p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2010/02/de-como-charly-canto-sobre-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependencias ocultas entre clientes y servicios</title>
		<link>http://carlospeix.com/2010/02/dependencias-ocultas-entre-clientes-y-servicios/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dependencias-ocultas-entre-clientes-y-servicios</link>
		<comments>http://carlospeix.com/2010/02/dependencias-ocultas-entre-clientes-y-servicios/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 20:58:00 +0000</pubDate>
		<dc:creator>Carlos Peix</dc:creator>
				<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://carlospeix.com.ar/2010/02/dependencias-ocultas-entre-clientes-y-servicios/</guid>
		<description><![CDATA[Hace unos días, en una revisión de código, encontré una definición de interfaz de un servicio que no me gustó. No fue inmediatamente evidente para mi pero uno de sus métodos era un code smell. Esta es la interfaz: public &#8230; <a href="http://carlospeix.com/2010/02/dependencias-ocultas-entre-clientes-y-servicios/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hace unos días, en una revisión de código, encontré una definición de interfaz de un servicio que no me gustó. No fue inmediatamente evidente para mi pero uno de sus métodos era un <a href="http://en.wikipedia.org/wiki/Code_smell" target="_blank">code smell</a>.</p>
<p>Esta es la interfaz:</p>
<pre class="code"><span style="color: blue">public interface </span><span style="color: #2b91af">IIpStsStore</span>{
    <span style="color: blue">void </span>AddCredential(<span style="color: blue">string </span>userName, <span style="color: blue">string </span>password);
    <span style="color: blue">void </span>RemoveCredential(<span style="color: blue">string </span>userName);
    <span style="color: blue">bool </span>CredentialExist(<span style="color: blue">string </span>userName);
}</pre>
<p>El método que me olía mal es el último. Luego de exprimir el cerebro un poco me di cuenta del motivo. Ese método, a mi juicio, propicia un acoplamiento innecesario entre el cliente del servicio y la implementación de dicho servicio.</p>
<p>Si exponemos ese método seguramente el cliente del servicio lo va a usar y no tendremos control de este uso, es decir, no sabremos exactamente cuando van a utilizarlo.</p>
<p>Supongamos que la primera implementación de ese servicio accede directamente al recurso donde se almacenan las credenciales. En ese caso, si el cliente llama a AddCredential() e inmediatamente llama a CredentialExist(), todo funcionará correctamente.</p>
<p>El problema aparecerá cuando hagamos otra implementación del servicio IpStsStore que funcione en forma asíncrona. En ese caso ya no habrá garantía de que la secuencia de métodos mencionada mas arriba siga funcionando.</p>
<p>En definitiva, tenemos un acoplamiento entre el cliente y la implementación del servicio, algo que siempre debe tratar de evitarse, además, como suele ocurrir en estos casos, luego de pensar un poco el diseño, ese método tampoco era necesario, un típico caso <a href="http://en.wikipedia.org/wiki/You_ain't_gonna_need_it" target="_blank">YAGNI</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://carlospeix.com/2010/02/dependencias-ocultas-entre-clientes-y-servicios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

