<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>Lucas Ontivero : Dise&amp;#241;o, Desarrollo, Herramientas, Productividad</title><link>http://geeks.ms/blogs/lontivero/archive/tags/Dise_26002300_241_3B00_o/Desarrollo/Herramientas/Productividad/default.aspx</link><description>Etiquetas: Dise&amp;#241;o, Desarrollo, Herramientas, Productividad</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Por qué no me gustan las plantillas T4</title><link>http://geeks.ms/blogs/lontivero/archive/2011/08/05/por-qu-233-no-me-gustan-las-plantillas-t4.aspx</link><pubDate>Fri, 05 Aug 2011 04:53:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:198846</guid><dc:creator>Lucas Ontivero</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lontivero/rsscomments.aspx?PostID=198846</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lontivero/commentapi.aspx?PostID=198846</wfw:comment><comments>http://geeks.ms/blogs/lontivero/archive/2011/08/05/por-qu-233-no-me-gustan-las-plantillas-t4.aspx#comments</comments><description>&lt;p&gt;A mi anterior entrada la titul&amp;eacute; &amp;ldquo;Las plantillas T4 son basura&amp;rdquo; cosa que respondi&amp;oacute; m&amp;aacute;s a mi estado de bronca contra &amp;eacute;stas que a su verdadero valor como herramienta. Muchos me preguntaron sobre el por qu&amp;eacute; de tal calificaci&amp;oacute;n y la verdad es que ese por qu&amp;eacute; es demasiado largo de explicar pero voy a mostrar la punta del ovillo para que a quien le interese pueda descubrirlo por s&amp;iacute; solo.&lt;/p&gt;
&lt;p&gt;Veamos un par de ejemplo muy sencillos, el primero es crear un CVS partir de una array definido como sigue:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_7876C733.png"&gt;&lt;img height="74" width="347" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_thumb_5F00_2F23FC6B.png" alt="image" border="0" title="image" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lo que queremos obtener es lo siguiente:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_26C02714.png"&gt;&lt;img height="46" width="203" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_thumb_5F00_4E36F37E.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table width="100%" cellpadding="2" cellspacing="3" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="349" valign="top"&gt;
&lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="410" valign="top"&gt;
&lt;p&gt;&lt;strong&gt;StringTemplate&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="349" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_6903198A.png"&gt;&lt;img height="82" width="329" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_thumb_5F00_4BADC1C0.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="410" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_71373F21.png"&gt;&lt;img height="38" width="419" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_thumb_5F00_7711E2BA.png" alt="image" border="0" title="image" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ambos dan por resultado exactamente la misma salida. Ahora, como no soy experto en ninguno de los dos, doy por seguro que existen mejores maneras de hacerlo tanto usando T4 como StringTemplate. Pero, si damos por v&amp;aacute;lido el ejemplo, podemos ver claramente la diferencia en legibilidad y, aunque el ejemplo es muy peque&amp;ntilde;os, en mantenibilidad la diferencia tambi&amp;eacute;n es evidente.&lt;/p&gt;
&lt;p&gt;Pero veamos algo levemente m&amp;aacute;s complejo, solo un poquito m&amp;aacute;s complejo, generemos una tabla html para ver algunas diferencias. Aunque con StringTemplate lo har&amp;iacute;a as&amp;iacute;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_2EE426DE.png"&gt;&lt;img height="224" width="501" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_thumb_5F00_330DFEA3.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;Voy a refactorizarla y compararla en la tabla de abajo.&lt;/p&gt;
&lt;table width="770" cellpadding="2" cellspacing="3" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="349" valign="top"&gt;
&lt;p&gt;&lt;strong&gt;T4&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="410" valign="top"&gt;
&lt;p&gt;&lt;strong&gt;StringTemplate&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="349" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_5C5520D4.png"&gt;&lt;img height="562" width="456" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_thumb_5F00_2048DF1F.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td width="410" valign="top"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_1D537A6C.png"&gt;&lt;img height="468" width="362" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lontivero/image_5F00_thumb_5F00_50135B13.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nuevamente aqu&amp;iacute; estoy seguro de que existen mejores maneras de hacerlo tanto con T4 como con StringTemplate pero bueno, que valga el ejemplo. as&amp;iacute; que veamos&amp;hellip; (suspiro prolongado) por donde empezar&amp;hellip;.?. quiz&amp;aacute;s deba aclarar que mientras que la plantilla de la derecha est&amp;aacute; completa, a la de la izquierda&amp;nbsp; le quit&amp;eacute; varios renglones con directivas varias del tipo &amp;lt;@template&amp;gt; y &amp;lt;@output&amp;gt;.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Antes de comenzar pregunto: &amp;iquest;soy yo, o en la plantilla del lado izquierdo hay mucho amarillito? &lt;/p&gt;
&lt;p&gt;Bueno, ahora si, lo primero es que dado que en la plantilla de la izquierda tenemos c&amp;oacute;digo, este puede explotar con alguna exception. Por ejemplo, que sucede si data es NULL? S&amp;iacute;, tendremos una bonita exception y entonces quiz&amp;aacute;s debamos depurar la plantilla. S&amp;iacute;, le&amp;iacute;ste bien: depurar una plantilla! por m&amp;aacute;s rid&amp;iacute;culo que suene, es algo que probablemente debamos hacer. En cambio, con la plantilla de la derecha obtendremos simplemente una tabla html vac&amp;iacute;a, no muy &amp;uacute;til pero v&amp;aacute;lida al fin. &lt;/p&gt;
&lt;p&gt;Otro punto es que cualquiera que haya usado T4 ha sufrido alguna vez la p&amp;eacute;rdida de alguna etiqueta de apertura o cierre y ha perdido la vista tratando de encontrar donde es que le falta abrir o cerrar un tag. Y es que en semejante sopa de tags cualquiera se pierde. Por eso es com&amp;uacute;n ver comentarios en la plantilla al estilo: &lt;em&gt;&lt;span style="color:#333333;"&gt;// cierra foreach&lt;/span&gt;&lt;/em&gt; ya que uno termina pregunt&amp;aacute;ndose &amp;iquest;que es lo que est&amp;aacute; cerrando esta llave? Bueno, esa llave est&amp;aacute; cerrando un foreach!&lt;/p&gt;
&lt;p&gt;En cuanto a la calidad de la salida solo puedo decir que con la plantilla de la derecha, sin ning&amp;uacute;n esfuerzo adicional, obtengo un html perfectamente tabulado mientras que con la de la derecha&amp;hellip;.uhmmm, bueno&amp;hellip; requiere alg&amp;uacute;n trabajito adicional que se resuelve agregando m&amp;aacute;s c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;Tal vez algo que me agrada de StringTemplate es que nos mantiene protegidos de sus mecanismos internos, es decir, uno no est&amp;aacute; obligado, y de hecho no deber&amp;iacute;a estarlo, a entender c&amp;oacute;mo es que funciona internamente. Pero T4 si nos obliga, solo basta ver los distintos tipos de bloques que existen para darse cuenta: &amp;iquest;Standard feature block?, &amp;iquest;Class feature block? Adem&amp;aacute;s deben ir en un orden espec&amp;iacute;fico o no compilan. S&amp;iacute;, esas son las tuber&amp;iacute;as sali&amp;eacute;ndose hacia afuera a las que me refiero, el creador debe estar consciente de a d&amp;oacute;nde va a ir a parar lo que pone en cada block seg&amp;uacute;n el tipo de bloque, debe entender o imaginar como es la clase que T4 genera por detr&amp;aacute;s. Por tal motivo, T4 es solo para programadores. &lt;/p&gt;
&lt;p&gt;Corto ac&amp;aacute; pero antes debo aclarar que no basta solo con &amp;ldquo;ver&amp;rdquo; las diferencias sino con &amp;ldquo;entender&amp;rdquo; las diferencias, entender todo lo conceptual que hay por detr&amp;aacute;s de la elegancia de StringTemplate (o de la inelegancia de T4). &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=198846" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Dise_26002300_241_3B00_o/default.aspx">Dise&amp;#241;o</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/.Net/default.aspx">.Net</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Languages/default.aspx">Languages</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Conceptos/default.aspx">Conceptos</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Herramientas/default.aspx">Herramientas</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Productividad/default.aspx">Productividad</category></item><item><title>TDD y Yo</title><link>http://geeks.ms/blogs/lontivero/archive/2010/06/13/tdd-y-yo.aspx</link><pubDate>Sun, 13 Jun 2010 22:30:57 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:178018</guid><dc:creator>Lucas Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lontivero/rsscomments.aspx?PostID=178018</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lontivero/commentapi.aspx?PostID=178018</wfw:comment><comments>http://geeks.ms/blogs/lontivero/archive/2010/06/13/tdd-y-yo.aspx#comments</comments><description>Hace poco comencé un nuevo desarrollo y decidí grabar algunos videos de los cuales solo publiqué los primeros tres. Sucede que el hecho de saber que alguien me estaba mirando me hacía prestar mayor atención a mis palabras que al código que debía escribir. No obstante a ello, continué grabándome para tomar el tiempo y estudiarme. La primera parte de ese desarrollo está completado y estos son los números: 66 pruebas unitarias. 15 clases. (solo 4 centrales, el resto son datacontracts, excepciones y...(&lt;a href="http://geeks.ms/blogs/lontivero/archive/2010/06/13/tdd-y-yo.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=178018" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Dise_26002300_241_3B00_o/default.aspx">Dise&amp;#241;o</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/.Net/default.aspx">.Net</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Project+Management/default.aspx">Project Management</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Investigaciones/default.aspx">Investigaciones</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Gestion+de+Proyectos/default.aspx">Gestion de Proyectos</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Gesti_26002300_243_3B00_n+de+proyectos/default.aspx">Gesti&amp;#243;n de proyectos</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Conceptos/default.aspx">Conceptos</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Herramientas/default.aspx">Herramientas</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Productividad/default.aspx">Productividad</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/XP/default.aspx">XP</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/TDD/default.aspx">TDD</category></item><item><title>[Unit Tests] Contras de implementar test unitarios</title><link>http://geeks.ms/blogs/lontivero/archive/2009/09/28/unit-tests-contras-de-implementar-test-unitarios.aspx</link><pubDate>Tue, 29 Sep 2009 00:46:21 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:156951</guid><dc:creator>Lucas Ontivero</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lontivero/rsscomments.aspx?PostID=156951</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lontivero/commentapi.aspx?PostID=156951</wfw:comment><comments>http://geeks.ms/blogs/lontivero/archive/2009/09/28/unit-tests-contras-de-implementar-test-unitarios.aspx#comments</comments><description>He querido compartir en este video de 7 minutos mis experiencias con la implementación de test unitarios cuando la inversión en capacitación es escaza. Que peligros encierra una pobre capacitación y ante que escenario nos podemos encontrar es de los objetivos de este video. &amp;#160; &amp;#160; Lucas Ontivero...(&lt;a href="http://geeks.ms/blogs/lontivero/archive/2009/09/28/unit-tests-contras-de-implementar-test-unitarios.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=156951" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Software+Factories/default.aspx">Software Factories</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Dise_26002300_241_3B00_o/default.aspx">Dise&amp;#241;o</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Series/default.aspx">Series</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Tips/default.aspx">Tips</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Desarrollo/default.aspx">Desarrollo</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Empresas/default.aspx">Empresas</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Conceptos/default.aspx">Conceptos</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Cursos/default.aspx">Cursos</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Herramientas/default.aspx">Herramientas</category><category domain="http://geeks.ms/blogs/lontivero/archive/tags/Productividad/default.aspx">Productividad</category></item></channel></rss>