<?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/"><channel><title>Variable not found en Geeks.ms : patrones</title><link>http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx</link><description>Etiquetas: patrones</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Desacoplando controladores ASP.NET MVC, paso a paso</title><link>http://geeks.ms/blogs/jmaguilar/archive/2013/04/10/desacoplando-controladores-asp-net-mvc-paso-a-paso.aspx</link><pubDate>Wed, 10 Apr 2013 16:16:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:209089</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=209089</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2013/04/10/desacoplando-controladores-asp-net-mvc-paso-a-paso.aspx#comments</comments><description>Hace poco, en el post donde trataba la inyecci&amp;oacute;n de dependencias y desacoplamiento de Hubs de SignalR , el amigo Maxxx comentaba que podr&amp;iacute;a estar bien ver c&amp;oacute;mo podr&amp;iacute;amos emplear las mismas t&amp;eacute;cnicas con ASP.NET MVC. Y ciertamente, me ha parecido muy interesante porque es un escenario que encuentro habitualmente en empresas de desarrollo: comprenden los beneficios de reducir el acoplamiento entre componentes, pero les parece algo demasiado complejo como para aplicar...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2013/04/10/desacoplando-controladores-asp-net-mvc-paso-a-paso.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=209089" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/buenas+pr_26002300_225_3B00_cticas/default.aspx">buenas pr&amp;#225;cticas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category></item><item><title>Inyección de dependencias en Hubs de SignalR</title><link>http://geeks.ms/blogs/jmaguilar/archive/2013/02/19/inyecci-243-n-de-dependencias-en-hubs-de-signalr.aspx</link><pubDate>Tue, 19 Feb 2013 17:34:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:208498</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=208498</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2013/02/19/inyecci-243-n-de-dependencias-en-hubs-de-signalr.aspx#comments</comments><description>Cuando estamos implementando Hubs de SignalR, podemos encontrarnos f&amp;aacute;cilmente con que &amp;eacute;stos necesitan utilizar componentes externos para llevar a cabo su tarea. Por ejemplo, es bastante probable que un servicio en tiempo real proporcionado por un Hub tenga que utilizar una clase de servicios o cualquier otro componente externo de una aplicaci&amp;oacute;n, como en el siguiente c&amp;oacute;digo: ? 1 2 3 4 5 6 7 8 9 10 11 public class MyHub: Hub { public Task sendMessage( string text) { using...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2013/02/19/inyecci-243-n-de-dependencias-en-hubs-de-signalr.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208498" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/signalr/default.aspx">signalr</category></item><item><title>Knockout (I): pongamos orden en el lado cliente</title><link>http://geeks.ms/blogs/jmaguilar/archive/2012/05/07/knockout-i-pongamos-orden-en-el-lado-cliente.aspx</link><pubDate>Mon, 07 May 2012 07:15:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204890</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=204890</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2012/05/07/knockout-i-pongamos-orden-en-el-lado-cliente.aspx#comments</comments><description>La programaci&amp;oacute;n web tradicional, basada en el modelo de petici&amp;oacute;n-respuesta de p&amp;aacute;gina completa, no requer&amp;iacute;a demasiado c&amp;oacute;digo en cliente m&amp;aacute;s all&amp;aacute; que el necesario para realizar validaciones y l&amp;oacute;gica de presentaci&amp;oacute;n simple: &amp;iquest;para qu&amp;eacute; complicarnos en cliente si pod&amp;iacute;amos hacerlo todo en servidor? De hecho, durante la era Webforms, la c&amp;eacute;lebre pareja formada por viewstate y postback llevaban a servidor pr&amp;aacute;cticamente...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2012/05/07/knockout-i-pongamos-orden-en-el-lado-cliente.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204890" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/javascript/default.aspx">javascript</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/knockout/default.aspx">knockout</category></item><item><title>Indicios de que tu interfaz de usuario fue creado por un programador</title><link>http://geeks.ms/blogs/jmaguilar/archive/2009/12/02/indicios-de-que-tu-interfaz-de-usuario-fue-creado-por-un-programador.aspx</link><pubDate>Wed, 02 Dec 2009 22:59:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:161751</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=161751</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2009/12/02/indicios-de-que-tu-interfaz-de-usuario-fue-creado-por-un-programador.aspx#comments</comments><description>Ya sabemos lo que suele ocurrir cuando los programadores dise&amp;ntilde;amos interfaces de usuario ;-). Para seguir profundizando en este curioso e inevitable fen&amp;oacute;meno, Ian Voyce ha publicado hace unas semanas el divertido post The 7 signs your UI was created by a programmer , en el que recoge pistas que nos ayudar&amp;aacute;n a determinar si el interfaz de la aplicaci&amp;oacute;n que usamos a diario est&amp;aacute; creado por un dise&amp;ntilde;ador experto en usabilidad, o ha sido el propio desarrollador...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2009/12/02/indicios-de-que-tu-interfaz-de-usuario-fue-creado-por-un-programador.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161751" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/buenas+pr_26002300_225_3B00_cticas/default.aspx">buenas pr&amp;#225;cticas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/humor/default.aspx">humor</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/antipatrones/default.aspx">antipatrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/interfaces/default.aspx">interfaces</category></item><item><title>El patrón Post-Redirect-Get</title><link>http://geeks.ms/blogs/jmaguilar/archive/2009/11/23/el-patr-243-n-post-redirect-get.aspx</link><pubDate>Mon, 23 Nov 2009 00:03:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:160707</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=160707</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2009/11/23/el-patr-243-n-post-redirect-get.aspx#comments</comments><description>Hoy vamos a dedicar un rato a comentar una t&amp;eacute;cnica que es considerada una buena pr&amp;aacute;ctica en el desarrollo de aplicaciones web: el patr&amp;oacute;n PRG o Post-Redirect-Get. Seguramente alguna vez lo haya citado por aqu&amp;iacute;, pero nunca lo hab&amp;iacute;a explicado en profundidad. Por &amp;uacute;ltimo, antes de entrar en materia, es conveniente indicar que lo que vamos a ver es v&amp;aacute;lido para ASP.NET Webforms, ASP.NET MVC y, en general, para cualquier tecnolog&amp;iacute;a de construcci&amp;oacute;n...(&lt;a href="http://geeks.ms/blogs/jmaguilar/archive/2009/11/23/el-patr-243-n-post-redirect-get.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160707" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/buenas+pr_26002300_225_3B00_cticas/default.aspx">buenas pr&amp;#225;cticas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/aspnetmvc/default.aspx">aspnetmvc</category></item><item><title>yUML, generación de diagramas UML al vuelo</title><link>http://geeks.ms/blogs/jmaguilar/archive/2009/05/20/yuml-generaci-243-n-de-diagramas-uml-al-vuelo.aspx</link><pubDate>Wed, 20 May 2009 18:58:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:148906</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=148906</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2009/05/20/yuml-generaci-243-n-de-diagramas-uml-al-vuelo.aspx#comments</comments><description>&lt;div class="post-header-line-1"&gt;&lt;/div&gt;
&lt;div class="post-body entry-content"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height="168" width="192" src="http://lh3.ggpht.com/_O9D62hXq-ng/SfspLMjjCVI/AAAAAAAABCU/ehO_lHMYfbg/image%5B22%5D.png?imgmax=800" align="right" alt="yUML" border="0" title="yUML" style="margin:0px 0px 5px 5px;display:inline;border-width:0px;" /&gt; &lt;a hreflang="en" href="http://www.tobinharris.com/past/2009/4/30/yuml-for-not-sketching-uml-diagrams-online-/" title="tobin harris"&gt;Tobin Harris&lt;/a&gt;&lt;a href="http://www.tobinharris.com/past/2009/4/30/yuml-for-not-sketching-uml-diagrams-online-/" title="tobin harris"&gt;&lt;/a&gt; ha puesto en marcha un curioso e interesante servicio, al que ha denominado &lt;a href="http://yuml.me/" title="yUML"&gt;&lt;span style="color:#35537a;"&gt;yUML&lt;/span&gt;&lt;/a&gt;, cuyo prop&amp;oacute;sito es facilitar la generaci&amp;oacute;n al vuelo de diagramas UML a partir de una concisa descripci&amp;oacute;n expresada en un sencillo lenguaje espec&amp;iacute;fico.&lt;/p&gt;
&lt;p&gt;Pero adem&amp;aacute;s de la generaci&amp;oacute;n autom&amp;aacute;tica del diagrama UML, que ya tiene m&amp;eacute;rito de por s&amp;iacute;, llama la atenci&amp;oacute;n que esto puede realizarse desde una etiqueta (X)HTML &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; a la que se le env&amp;iacute;a la especificaci&amp;oacute;n como par&amp;aacute;metro, gener&amp;aacute;ndose en tiempo real una imagen con el diagrama correspondiente. Por ello, est&amp;aacute; especialmente indicado para autores de blogs, wikis o contenidos web que deseen introducir muy f&amp;aacute;cilmente estos diagramas en sus creaciones.&lt;/p&gt;
&lt;p&gt;En los siguientes ejemplos se muestran la especificaci&amp;oacute;n y la imagen generada de un diagrama de clases y uno de casos de uso, respectivamente. Como podr&amp;eacute;is comprobar, la especificaci&amp;oacute;n es bastante legible directamente.&lt;/p&gt;
&lt;h4&gt;Diagrama de clases&lt;/h4&gt;
&lt;p&gt;Especificaci&amp;oacute;n: &lt;code&gt;&lt;strong&gt;[Company]&amp;lt;&amp;gt;-1&amp;gt;[Location], [Location]+-&amp;gt;[Point]&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img height="58" width="465" src="http://lh5.ggpht.com/_O9D62hXq-ng/SfspLhVzp_I/AAAAAAAABCY/SP7V9LRczCE/image%5B8%5D.png?imgmax=800" alt="image" border="0" title="image" style="margin:0px auto 5px;display:block;float:none;border-width:0px;" /&gt;&lt;/p&gt;
&lt;p&gt;C&amp;oacute;digo fuente para su inserci&amp;oacute;n en una p&amp;aacute;gina:&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:3d54bd07-fb3f-49e7-8a4d-b9f5e3dbda4d" style="margin:0px;display:inline;float:none;padding:0px;"&gt;
&lt;pre style="background-color:#ffffff;word-wrap:break-word;white-space:pre-wrap;overflow:auto;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;img &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://yuml.me/diagram/class/[Company]&amp;lt;&amp;gt;-1&amp;gt;[Location], [Location]+-&amp;gt;[Point]&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;img height="101" width="221" src="http://lh3.ggpht.com/_O9D62hXq-ng/SgdBm_Q4XmI/AAAAAAAABDQ/dUufERXRNs8/image%5B5%5D.png?imgmax=800" align="right" alt="Estilo informal" border="0" title="Estilo informal" style="margin:0px 0px 5px 5px;display:inline;border-width:0px;" /&gt;Una curiosidad es que si en la direcci&amp;oacute;n insertamos la palabra &amp;ldquo;scruffy&amp;rdquo;, el sistema generar&amp;aacute; un diagrama como si hubiese sido dibujado a mano, en un estilo mucho m&amp;aacute;s informal: &lt;br /&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:46e2acd0-b52b-42da-883b-4c522347668a" style="margin:0px;display:inline;float:none;padding:0px;"&gt;
&lt;pre style="background-color:#ffffff;word-wrap:break-word;white-space:pre-wrap;overflow:auto;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;img &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://yuml.me/diagram/scruffy/class/[Company]&amp;lt;&amp;gt;-1&amp;gt;[Location], [Location]+-&amp;gt;[Point]&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h4&gt;Diagrama de casos de uso&lt;/h4&gt;
&lt;p&gt;Especificaci&amp;oacute;n: &lt;strong&gt;[User]-(Login), [User]-(Logout), (Login)&amp;lt;(Reminder), (Login)&amp;gt;(Captcha)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img height="167" width="450" src="http://lh3.ggpht.com/_O9D62hXq-ng/SfspMTtCR1I/AAAAAAAABCc/DxG062f8lgw/image%5B16%5D.png?imgmax=800" alt="image" border="0" title="image" style="margin:0px auto 5px;display:block;float:none;border-width:0px;" /&gt; &lt;/p&gt;
&lt;p&gt;C&amp;oacute;digo fuente para su inserci&amp;oacute;n en una p&amp;aacute;gina:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:358bb2c4-24f5-4e9a-956f-f5d08aa0358a" style="margin:0px;display:inline;float:none;padding:0px;"&gt;
&lt;pre style="background-color:#ffffff;word-wrap:break-word;white-space:pre-wrap;overflow:auto;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;img &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://yuml.me/diagram/usecase/[User]-(Login), [User]-(Logout), (Login)&amp;lt;(Reminder), (Login)&amp;gt;(Captcha)&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Si prefieres simplemente descargar el diagrama para subirlo a tu web, &lt;em&gt;opci&amp;oacute;n bastante prudente hasta que se pueda confiar en la fiabilidad y disponibilidad del servicio&lt;/em&gt;, desde el mismo sitio web del producto podemos &lt;a href="http://yuml.me/diagram/class/draw" title="Generar un diagrama de clases"&gt;&lt;span style="color:#35537a;"&gt;generar la imagen introduciendo la especificaci&amp;oacute;n textual&lt;/span&gt;&lt;/a&gt;; a partir de ah&amp;iacute; podremos copiarla y pegarla sobre nuestra herramienta de edici&amp;oacute;n, o salvarla en nuestro equipo para enviarla a su ubicaci&amp;oacute;n definitiva.&lt;/p&gt;
&lt;p&gt;Si bien todav&amp;iacute;a &lt;a href="http://yuml.me" title="yUML"&gt;&lt;span style="color:#35537a;"&gt;yUML&lt;/span&gt;&lt;/a&gt; est&amp;aacute; en pruebas y es algo limitado (s&amp;oacute;lo soporta diagramas de clases y de casos de uso), me ha parecido muy interesante tanto la idea como la implementaci&amp;oacute;n del servicio.&lt;/p&gt;
&lt;p&gt;Crossposteando desde: &lt;a href="http://www.variablenotfound.com/2009/05/yuml-generacion-de-diagramas-uml-al.html" title="Variable not found"&gt;Variable not found&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=148906" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/dise_26002300_241_3B00_o/default.aspx">dise&amp;#241;o</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/dsl/default.aspx">dsl</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/servicios+on-line/default.aspx">servicios on-line</category></item><item><title>NDepend, analiza a fondo tu código</title><link>http://geeks.ms/blogs/jmaguilar/archive/2009/05/12/ndepend-analiza-a-fondo-tu-c-243-digo.aspx</link><pubDate>Tue, 12 May 2009 21:05:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:148433</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=148433</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2009/05/12/ndepend-analiza-a-fondo-tu-c-243-digo.aspx#comments</comments><description>&lt;div class="post-header-line-1"&gt;&lt;/div&gt;
&lt;div class="post-body entry-content"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Existen numerosas aplicaciones que permiten analizar nuestros desarrollos con el objetivo final de incrementar la calidad de los mismos. &lt;a href="http://www.variablenotfound.com/2008/01/mejora-la-calidad-de-tus-aplicaciones-y.html" title="Mejora la calidad de tus aplicaciones y librer&amp;iacute;as .Net con FxCop"&gt;&lt;span style="color:#35537a;"&gt;FxCop&lt;/span&gt;&lt;/a&gt;, por ejemplo, es capaz de analizar los ensamblados y avisarnos cuando se encuentra con incumplimientos de las pautas de dise&amp;ntilde;o para desarrolladores de librer&amp;iacute;as para .Net Framework (&lt;a hreflang="en" href="http://msdn2.microsoft.com/en-us/library/czefa0ke(vs.71).aspx"&gt;Design Guidelines for Class Library Developers&lt;/a&gt;). Tambi&amp;eacute;n hace tiempo coment&amp;eacute; por aqu&amp;iacute; la disponibilidad de&amp;nbsp; &lt;a href="http://www.variablenotfound.com/2008/05/disponible-el-microsoft-source-analysis.html" title="Disponible Microsoft Source Analysis for C#"&gt;&lt;span style="color:#35537a;"&gt;Microsoft Source Analysis for C#&lt;/span&gt;&lt;/a&gt;, una herramienta que se centra en el c&amp;oacute;digo fuente y el cumplimiento de reglas de codificaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Ahora, gracias al ofrecimiento de &lt;a hreflang="en" href="http://codebetter.com/blogs/patricksmacchia/" title="Blog de Patrick Smacchia"&gt;Patrick Smacchia&lt;/a&gt;, lead developer del producto, he podido probar &lt;a href="http://www.ndepend.com/Default.aspx" title="NDepend"&gt;&lt;span style="color:#35537a;"&gt;NDepend&lt;/span&gt;&lt;/a&gt;, una herramienta de an&amp;aacute;lisis de c&amp;oacute;digo de la que hab&amp;iacute;a o&amp;iacute;do hablar y que va mucho m&amp;aacute;s all&amp;aacute; que las citadas anteriormente.&lt;/p&gt;
&lt;p&gt;La principal misi&amp;oacute;n de &lt;a href="http://www.ndepend.com/Default.aspx" title="NDepend"&gt;&lt;span style="color:#35537a;"&gt;NDepend&lt;/span&gt;&lt;/a&gt; es ayudarnos a incrementar la calidad de nuestros sistemas desarrollados con .NET mediante el an&amp;aacute;lisis de sus ensamblados y c&amp;oacute;digo fuente desde distintas perspectivas, como la complejidad de sus m&amp;oacute;dulos, el tama&amp;ntilde;o de los mismos, las interdependencias entre ellos, etc. Es decir, a diferencia de otros analizadores, su objetivo no es avisarnos de aspectos como la utilizaci&amp;oacute;n de convenciones de codificaci&amp;oacute;n (aunque tambi&amp;eacute;n puede hacerlo), o el uso de buenas pr&amp;aacute;cticas de dise&amp;ntilde;o, sino ayudarnos a determinar, por ejemplo, cu&amp;aacute;ndo ponemos en peligro la mantenibilidad y evoluci&amp;oacute;n de un sistema debido a la complejidad&amp;nbsp; o al fuerte acoplamiento de algunos de sus componentes, por citar s&amp;oacute;lo algunos criterios.&lt;/p&gt;
&lt;h3&gt;El entorno gr&amp;aacute;fico&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;VisualNDepend&lt;/strong&gt; es el entorno gr&amp;aacute;fico de la herramienta, y nos ofrece un entorno de trabajo muy potente e intuitivo, aunque durante los primeros minutos pueda resultar algo complejo debido a la cantidad de informaci&amp;oacute;n mostrada.&lt;/p&gt;
&lt;p&gt;Iniciar el an&amp;aacute;lisis de un sistema es muy sencillo; una vez seleccionado el ensamblado, conjunto de ensamblados o proyecto a estudiar, el sistema realiza el an&amp;aacute;lisis, del cual se obtiene un informe bastante completo, basado en web, sobre el mismo (pod&amp;eacute;is ver un &lt;a href="http://www.ndepend.com/SampleReports/OnNUnit/NDependReport.html" title="Ejemplo de informe en la web de NDepend"&gt;&lt;span style="color:#35537a;"&gt;ejemplo de informe&lt;/span&gt;&lt;/a&gt; en la p&amp;aacute;gina del producto). En &amp;eacute;l se recogen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;m&amp;eacute;tricas de la aplicaci&amp;oacute;n&lt;/em&gt;, entre las que encontramos el n&amp;uacute;mero de l&amp;iacute;neas de c&amp;oacute;digo, comentarios, n&amp;uacute;mero de clases, m&amp;eacute;todos, etc., as&amp;iacute; como datos estad&amp;iacute;sticos relativos a la complejidad, extensi&amp;oacute;n y estructura del c&amp;oacute;digo. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;m&amp;eacute;tricas por ensamblado&lt;/em&gt;, donde se refleja, por cada uno de los ensamblados que componen la soluci&amp;oacute;n, datos sobre su tama&amp;ntilde;o, grados de cohesi&amp;oacute;n, acoplamiento, y otros aspectos relativos a su complejidad e interdependencia. &lt;/li&gt;
&lt;li&gt;&lt;img height="178" width="178" src="http://lh3.ggpht.com/_O9D62hXq-ng/SfiARJtOUaI/AAAAAAAABB0/0HEqHplAfA8/image%5B4%5D.png?imgmax=800" align="right" alt="Vista de estructura" border="0" title="Vista de estructura" style="margin:0px 0px 5px 5px;display:inline;border:0px;" /&gt; &lt;em&gt;vista de estructura&lt;/em&gt; (captura de la derecha) que muestra la distribuci&amp;oacute;n de componentes, la granularidad y su complejidad relativa seg&amp;uacute;n el tama&amp;ntilde;o de los bloques visualizados. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;diagrama de abstracci&amp;oacute;n e inestabilidad&lt;/em&gt;, que posiciona cada ensamblado en funci&amp;oacute;n del n&amp;uacute;mero de clases abstractas e interfaces que presenta y su dependencia del resto de elementos. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;relaci&amp;oacute;n entre ensamblados&lt;/em&gt;, que detalla las interdependencias entre ensamblados del proyecto, los posibles ciclos, as&amp;iacute; como un posible orden de generaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;consultas y restricciones CQL&lt;/em&gt;, que realiza una serie de consultas predefinidas sobre los ensamblados y el c&amp;oacute;digo que nos ayuda a detectar una infinidad de problemas en nuestros desarrollos, desde aspectos relativamente simples como el exceso de m&amp;eacute;todos en clases o el incumplimiento de ciertas convenciones de nombrado, hasta problemas en la cobertura de los tests generados con &lt;a href="http://www.ncover.com/" title="NCover"&gt;&lt;span style="color:#35537a;"&gt;NCover&lt;/span&gt;&lt;/a&gt; o Visual Studio Team System. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero lo mejor del entorno gr&amp;aacute;fico no es poder generar un an&amp;aacute;lisis en formato web para poder consultarlo m&amp;aacute;s adelante, de hecho esto puede conseguir tambi&amp;eacute;n con la aplicaci&amp;oacute;n de consola que incluye NDepend. Lo mejor son las fant&amp;aacute;sticas herramientas interactivas que nos permiten navegar a trav&amp;eacute;s de nuestras aplicaciones, cambiar de vista, ampliar informaci&amp;oacute;n sobre cualquier elemento, y realizar consultas en tiempo real, siempre ofreciendo unos resultados muy claros y visuales, como:&lt;/p&gt;
&lt;p&gt;&lt;img height="122" width="347" src="http://lh4.ggpht.com/_O9D62hXq-ng/SfiARrE5UbI/AAAAAAAABB4/kQsADiVukjU/image6.png?imgmax=800" align="right" alt="Diagrama de dependencias" border="0" title="Diagrama de dependencias" style="margin:5px;display:inline;border-width:0px;" /&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;diagrama de dependencias&lt;/em&gt; entre todo tipo de elementos, como clases, espacios de nombres, o ensamblados. Resulta muy &amp;uacute;til, adem&amp;aacute;s, configurar el tama&amp;ntilde;o de los bloques, el grosor del borde y el de las flechas de uni&amp;oacute;n para que sean proporcionales a la complejidad, tama&amp;ntilde;o y una larga lista de criterios.&lt;/li&gt;
&lt;li&gt;&lt;img height="239" width="245" src="http://lh5.ggpht.com/_O9D62hXq-ng/SfiAS3A9wCI/AAAAAAAABB8/U6SVo_Krd7o/image18.png?imgmax=800" align="right" alt="Tabla de dependencias" border="0" title="Tabla de dependencias" style="margin:5px;display:inline;border-width:0px;" /&gt; &lt;em&gt;matriz de dependencias&lt;/em&gt;, que muestra de forma visual las relaciones de utilizaci&amp;oacute;n entre espacios de nombres, tipos, m&amp;eacute;todos o propiedades, con posibilidad de ir ampliando informaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;&lt;em&gt;comparaci&amp;oacute;n entre ensamblados&lt;/em&gt;, mostr&amp;aacute;ndonos los cambios producidos entre, por ejemplo, dos versiones de una misma librer&amp;iacute;a o aplicaci&amp;oacute;n.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;navegaci&amp;oacute;n avanzada por el c&amp;oacute;digo &lt;/em&gt;a trav&amp;eacute;s del uso del men&amp;uacute; contextual que facilita la r&amp;aacute;pida localizaci&amp;oacute;n de referencias, directas e indirectas, hacia y desde un m&amp;eacute;todo, propiedad o tipo existente.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;enlace con &lt;/em&gt;&lt;a href="http://www.red-gate.com/products/reflector/" title=".NET Reflector"&gt;&lt;em&gt;&lt;span style="color:#35537a;"&gt;Reflector&lt;/span&gt;&lt;/em&gt;&lt;/a&gt;, una herramienta indispensable, con la que se integra perfectamente gracias a su plugin.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;CQL (Code Query Language)&lt;/h3&gt;
&lt;p&gt;Sin duda, una de las caracter&amp;iacute;sticas m&amp;aacute;s interesante que tiene NDepend es el soporte del lenguaje de consulta &lt;a href="http://www.ndepend.com/CQL.htm" title="CQL Language Specification"&gt;&lt;span style="color:#35537a;"&gt;CQL (Code Query Language)&lt;/span&gt;&lt;/a&gt;, que nos ofrece la posibilidad de tratar nuestro c&amp;oacute;digo y ensamblados como si fuesen una gigantesca base de datos sobre la que podemos realizar consultas de forma muy natural.&amp;nbsp; Las posibilidades que esto ofrece son tan amplias que pr&amp;aacute;cticamente todas las funcionalidades de la aplicaci&amp;oacute;n est&amp;aacute;n basadas en &amp;oacute;rdenes CQL predise&amp;ntilde;adas que acompa&amp;ntilde;an al producto, aunque podemos crear todas las consultas personalizadas que necesitemos, como por ejemplo:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:e488ea34-dcfe-41eb-87f7-17a63719d982" style="margin:0px;display:inline;float:none;padding:0px;"&gt;
&lt;pre style="background-color:#ffffff;word-wrap:break-word;white-space:pre-wrap;overflow:auto;"&gt;&lt;span style="color:#008080;"&gt;/*&lt;/span&gt;&lt;span style="color:#008080;"&gt; Obtiene los m&amp;eacute;todos que escriben una propiedad &lt;/span&gt;&lt;span style="color:#008080;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color:#000000;"&gt; METHODS &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsDirectlyWritingField &amp;quot;Model.Cliente.Nombre&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;/*&lt;/span&gt;&lt;span style="color:#008080;"&gt; Obtiene m&amp;eacute;todos que acceden incorrectamente a los&lt;br /&gt;   datos desde la capa de interfaz&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color:#000000;"&gt; METHODS &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color:#000000;"&gt; NAMESPACES &amp;quot;Interfaz&amp;quot; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsDirectlyUsing &amp;quot;MySql.Data&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;/*&lt;/span&gt;&lt;span style="color:#008080;"&gt; Obtiene los 10 m&amp;eacute;todos con m&amp;aacute;s l&amp;iacute;neas de c&amp;oacute;digo &lt;/span&gt;&lt;span style="color:#008080;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;TOP&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;font-weight:bold;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt; METHODS &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;ORDER&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;BY&lt;/span&gt;&lt;span style="color:#000000;"&gt; NbLinesOfCode &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;DESC&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008080;"&gt;/*&lt;/span&gt;&lt;span style="color:#008080;"&gt; Obtiene los m&amp;eacute;todos considerados &amp;quot;peligrosos&amp;quot; seg&amp;uacute;n su complejidad ciclom&amp;aacute;tica &lt;/span&gt;&lt;span style="color:#008080;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color:#000000;"&gt; METHODS &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color:#000000;"&gt; CyclomaticComplexity &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;font-weight:bold;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height="122" width="204" src="http://lh4.ggpht.com/_O9D62hXq-ng/SfiATQ-yZeI/AAAAAAAABCA/D4xeGfvl3AI/image%5B3%5D.png?imgmax=800" align="right" alt="Editor de CQL con intellisense" border="0" title="Editor de CQL con intellisense" style="margin:0px 0px 5px 5px;display:inline;border:0px;" /&gt;Adem&amp;aacute;s de consultas CQL cuyo resultado podremos observar de forma directa tanto visualmente como en forma de listado, es posible incluir restricciones (WARN) que har&amp;aacute; que el sistema nos alerte durante el an&amp;aacute;lisis de un proyecto que cumpla las condiciones especificadas. Por ejemplo, la siguiente restricci&amp;oacute;n nos avisar&amp;aacute; cuando exista un &lt;a href="http://www.variablenotfound.com/2008/05/qu-huele-tu-cdigo.html" title="A qu&amp;eacute; huele tu c&amp;oacute;digo"&gt;&lt;span style="color:#35537a;"&gt;cierto tufillo&lt;/span&gt;&lt;/a&gt; a complejidad excesiva en un m&amp;eacute;todo (que haya sido definido con m&amp;aacute;s de 10 par&amp;aacute;metros):&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:ec482473-2dec-43d6-8bbc-280e5117c328" style="margin:0px;display:inline;float:none;padding:0px;"&gt;
&lt;pre style="background-color:#ffffff;word-wrap:break-word;white-space:pre-wrap;overflow:auto;"&gt;&lt;span style="color:#000000;"&gt;WARN &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;IF&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;Count&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;font-weight:bold;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;IN&lt;/span&gt;&lt;span style="color:#000000;"&gt;  &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;&lt;span style="color:#000000;"&gt; METHODS &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt;&lt;span style="color:#000000;"&gt; NbParameters &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;font-weight:bold;"&gt;10&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Estas consultas pueden ser a&amp;ntilde;adidas (en la versi&amp;oacute;n Pro) e integradas en los an&amp;aacute;lisis, as&amp;iacute; como modificar las existentes, de forma que el producto puede ser personalizado a nuestras convenciones o necesidades espec&amp;iacute;ficas. &lt;/p&gt;
&lt;p&gt;Otra posibilidad es incluir dentro del c&amp;oacute;digo de un ensamblado las restricciones que deseamos que se cumplan, expres&amp;aacute;ndolas en lenguaje CQL embebido en un atributo de tipo &lt;code&gt;CQLConstraint&lt;/code&gt; aplicado a sus elementos:&lt;/p&gt;
&lt;p&gt;&lt;img height="225" width="561" src="http://www.ndepend.com/Res/ConstraintInCodeSource4.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Afortunadamente existe mucha informaci&amp;oacute;n disponible en la web sobre el lenguaje CQL, y consultas que nos muestran c&amp;oacute;mo sacarle el m&amp;aacute;ximo partido.&lt;/p&gt;
&lt;h3&gt;Instalaci&amp;oacute;n e integraciones&lt;/h3&gt;
&lt;p&gt;NDepend se distribuye en formato .zip, y que puede ejecutarse directamente una vez descomprimido el contenido sobre una carpeta. La licencia, una vez obtenida, es un archivo XML firmado digitalmente que debemos colocar en el directorio de la aplicaci&amp;oacute;n, y listo.&lt;/p&gt;
&lt;p&gt;&lt;img height="167" width="277" src="http://lh5.ggpht.com/_O9D62hXq-ng/SfiAUPrw8zI/AAAAAAAABCE/QkbQF_iim5E/image10.png?imgmax=800" align="right" alt="Integraci&amp;oacute;n con VS y Reflector" border="0" title="Integraci&amp;oacute;n con VS y Reflector" style="margin:0px 0px 5px 5px;display:inline;border-width:0px;" /&gt; &lt;/p&gt;
&lt;p&gt;Ya en ejecuci&amp;oacute;n, desde el men&amp;uacute; &amp;ldquo;options&amp;rdquo; es posible configurarlo para que se integre con Visual Studio 2005, 2008 y como he comentado anteriormente, con el magn&amp;iacute;fico &lt;a href="http://www.red-gate.com/products/reflector/" title=".NET Reflector"&gt;&lt;span style="color:#35537a;"&gt;Reflector&lt;/span&gt;&lt;/a&gt;, con el que hace una excelente pareja.&lt;/p&gt;
&lt;p&gt;Asimismo, es posible utilizarlo en sistemas como MSBuild y NAnt, facilitando as&amp;iacute; su uso en entornos de integraci&amp;oacute;n continua y montaje automatizado, para los que ofrece librer&amp;iacute;as &lt;/p&gt;
&lt;p&gt;Finalmente, he de aclarar que NDepend es una aplicaci&amp;oacute;n comercial, aunque dispone de una versi&amp;oacute;n limitada gratuita utilizable por universidades, desarrolladores open source e incluso, durante un tiempo determinado, de prueba en proyectos comerciales. &lt;/p&gt;
&lt;p&gt;En cualquier caso, no dud&amp;eacute;is en probarlo: os dar&amp;aacute; un control sobre vuestro c&amp;oacute;digo dif&amp;iacute;cil de conseguir con otras herramientas.&lt;/p&gt;
&lt;p&gt;Publicado en: &lt;a href="http://www.variablenotfound.com"&gt;&lt;span style="color:#35537a;"&gt;www.variablenotfound.com&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=148433" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/.net/default.aspx">.net</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/buenas+pr_26002300_225_3B00_cticas/default.aspx">buenas pr&amp;#225;cticas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/calidad/default.aspx">calidad</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/herramientas/default.aspx">herramientas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/antipatrones/default.aspx">antipatrones</category></item><item><title>Ojo a los antipatrones</title><link>http://geeks.ms/blogs/jmaguilar/archive/2008/02/27/ojo-a-los-antipatrones.aspx</link><pubDate>Wed, 27 Feb 2008 19:01:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:75006</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=75006</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2008/02/27/ojo-a-los-antipatrones.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://bp0.blogger.com/_O9D62hXq-ng/R6XCiW0Ql6I/AAAAAAAAAQY/MAnhzDE3u7o/s1600-h/180px-Spaghetti.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5162746443346253730" style="FLOAT:right;MARGIN:0px 0px 10px 10px;CURSOR:hand;" alt="Bonito plato de spaghetti" src="http://bp0.blogger.com/_O9D62hXq-ng/R6XCiW0Ql6I/AAAAAAAAAQY/MAnhzDE3u7o/s320/180px-Spaghetti.jpg" border="0" /&gt;&lt;/a&gt;Sabemos que los patrones son plantillas reutilizables que podemos usar para solucionar problemas habituales en el proceso de desarrollo de software. Así, permiten utilizar soluciones fiables y bien conocidas a problemas concretos, aprovechando experiencias previas como base para la consecución de mejores resultados en los nuevos desarrollos.&lt;br /&gt;&lt;br /&gt;Pues bien, justo en el lado opuesto se encuentran los antipatrones, que definen situaciones y comportamientos que, según experiencias anteriores, nos conducen al fracaso en proyectos de desarrollo de software, es decir, son &lt;em&gt;soluciones o planteamientos que se han demostrado incorrectos&lt;/em&gt;. &lt;br /&gt;&lt;br /&gt;Y es ahí donde radica su interés: la observación y conocimiento de los mismos puede evitarnos resultados desastrosos, o actuar como alertas tempranas ante decisiones o dinámicas incorrectas, permitiéndonos prevenir, evitar o recuperarnos de estos problemas.&lt;br /&gt;&lt;br /&gt;Al igual que en los patrones, su descripción está relativamente formalizada y suele recoger los siguientes aspectos:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;nombre del antipatrón, así como su &amp;quot;alias&amp;quot; 
&lt;li&gt;su tipología: organizacional, de análisis, desarrollo... (veremos esto más tarde) 
&lt;li&gt;contexto y entorno en el que se aplica 
&lt;li&gt;descripción del problema concreto 
&lt;li&gt;síntomas, y consecuencias de la aplicación del antipatrón 
&lt;li&gt;causas típicas y raíces del problema 
&lt;li&gt;refactorización a aplicar, es decir, una descripción de cómo podríamos replantear el problema y conseguir una solución positiva. 
&lt;li&gt;ejemplos y escenarios para su comprensión. 
&lt;li&gt;soluciones relacionadas con la propuesta.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;Por ejemplo, un resumen del clásico antipatrón que reconoceréis muy rápidamente, el llamado &lt;em&gt;spaghetti code&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;
&lt;table class="" cellspacing="0"&gt;

&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;Nombre:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;Spaghetti Code&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;Tipología:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;Desarrollo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;Problema:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;Existencia de una pieza de código compleja y sin apenas estructura que dificulta enormemente su mantenimiento posterior&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;Síntomas y consecuencias:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;ul&gt;
&lt;li&gt;Tiempo de mantenimiento excesivo debido a la necesidad de estudio del código 
&lt;li&gt;Código no reutilizable 
&lt;li&gt;Aparición del temido &amp;quot;es mejor reescribirlo&amp;quot; 
&lt;li&gt;Métodos y funciones muy extensas 
&lt;li&gt;Abuso de variables globales&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;Causas:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;ul&gt;
&lt;li&gt;Inexperiencia de desarrolladores 
&lt;li&gt;Reutilización de código de prototipos rápidos 
&lt;li&gt;Ausencia de diseño previo a la implementación 
&lt;li&gt;Desarrolladores trabajando en solitario 
&lt;li&gt;Falta de revisiones de código&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=""&gt;&lt;strong&gt;Solución positiva:&lt;/strong&gt;&lt;/td&gt;
&lt;td class=""&gt;
&lt;ul&gt;
&lt;li&gt;Aplicar refactorización mientras se programa 
&lt;li&gt;Usar disciplinas de desarrollo específicas, métricas y buenas prácticas 
&lt;li&gt;Realizar y desarrollar el diseño del sistema antes de implementar&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Según &lt;a href="http://en.wikipedia.org/wiki/Anti-pattern"&gt;&lt;font color="#35537a"&gt;según la Wikipedia&lt;/font&gt;&lt;/a&gt;, los antipatrones se clasifican en los siguientes grupos, atendiendo a las áreas a las que afectan:&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones Organizacionales&lt;/strong&gt;, que incluyen prácticas nocivas a este nivel, como pueden ser, entre otros:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Gestión de champiñones (Mushroom management)&lt;/em&gt;, o mantener al equipo en la oscuridad, desinformado, y cubierto de porquería. 
&lt;li&gt;&lt;em&gt;Parálisis en análisis (Analysis paralysis), &lt;/em&gt;o quedar inmovilizado debido a un análisis o precaución excesiva, en contraposición a la siguiente: 
&lt;li&gt;&lt;em&gt;Extinción por intuición (Extint by instinct), &lt;/em&gt;llegar a la muerte por adelantarse demasiado y usar la intuición para la toma de decisiones.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones de Gestión de proyectos&lt;/strong&gt;, describiendo problemas en la gestión de proyectos, como los célebres: 
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Marcha de la muerte (Death march)&lt;/em&gt;, que describe el avance de determinados proyectos hacia el fracaso aunque todo el personal, excepto los gerentes, saben que al final se darán el castañazo. 
&lt;li&gt;&lt;em&gt;Humo y espejos (Smoke and mirrors)&lt;/em&gt;, o la demostración de funcionalidades o características no implementadas como si fueran reales, lo que siempre he llamado &amp;quot;enseñar cartón piedra&amp;quot;.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones de Gestión de equipos&lt;/strong&gt;, que recoge problemas relacionados con la relación con y de equipos de trabajo, como: 
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Doble diabólico&lt;/em&gt; (&lt;em&gt;traducción libre del término &lt;/em&gt;&lt;a href="http://en.wikipedia.org/wiki/Doppelganger"&gt;&lt;em&gt;&lt;font color="#35537a"&gt;Doppelganger&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;), personas que dependiendo del día pueden ser magníficos colaboradores o auténticos demonios. 
&lt;li&gt;&lt;em&gt;Gestor ausente (Absentee manager)&lt;/em&gt;, describiendo situaciones en las que el director está invisible periodos prolongados&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones de Análisis&lt;/strong&gt;, categoría que engloba antipatrones relacionados con la fase analítica de los proyectos software, entre otros: 
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Retroespecificación (Retro-specification)&lt;/em&gt;, o lo que viene a ser la realización del análisis una vez implementada la solución. 
&lt;li&gt;&lt;em&gt;Especificación de servilleta (Napkin specification)&lt;/em&gt;, también muy socorrida, que consiste en pasar al equipo de desarrollo las especificaciones del producto a crear descritas con muy poco detalle o informalmente.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones de Diseño&lt;/strong&gt;, que incluye malas prácticas de diseño de software que dan lugar a aplicaciones y componentes estructuralmente incorrectos: 
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Gran bola de lodo (Big ball of mud)&lt;/em&gt;, realización de aplicaciones sin estructura reconocible. 
&lt;li&gt;&lt;em&gt;Factoría de gas (Gas factory)&lt;/em&gt;, diseños innecesariamente complejos. 
&lt;li&gt;&lt;em&gt;Botón mágico (Magic Pushbutton)&lt;/em&gt;, o implementación de funcionalidades directamente en los manejadores de evento (p.e., click) del interfaz.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones en Orientación a objetos&lt;/strong&gt;, como una especialización del anterior, describe problemas frecuentes en los diseños creados bajo este paradigma, como: 
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Llamar al super (Call super)&lt;/em&gt;, obligar a las subclases a llamar a la clase de la que heredan. 
&lt;li&gt;&lt;em&gt;Singletonitis&lt;/em&gt;, abuso del &lt;a href="http://es.wikipedia.org/wiki/Singleton"&gt;&lt;font color="#35537a"&gt;patrón singleton&lt;/font&gt;&lt;/a&gt;. 
&lt;li&gt;&lt;em&gt;Orgía de objetos (Object orgy)&lt;/em&gt;, o encapsulación incorrecta en clases que permite el acceso incontrolado a sus métodos y propiedades internas. 
&lt;li&gt;&lt;em&gt;Otra jodida capa más (YAFL, Yet another fucking layer)&lt;/em&gt;, o la inclusión excesiva de capas en un sistema.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones de Programación&lt;/strong&gt;, con un gran número de errores frecuentes a evitar, como: 
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Spaghetti code&lt;/em&gt;, comentando anteriormente. 
&lt;li&gt;&lt;em&gt;Ravioli code&lt;/em&gt;, que consiste en la existencia de un gran número de objetos desconectados o débilmente acoplados entre sí. 
&lt;li&gt;&lt;em&gt;Ocultación de errores (Error hiding)&lt;/em&gt;, o capturar errores antes de que lleguen usuario, mostrando mensajes incomprensibles o simplemente no mostrar nada. 
&lt;li&gt;&lt;em&gt;Números mágicos (Magic numbers)&lt;/em&gt;, incluir números inexplicables en el código.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones Metodológicos&lt;/strong&gt;, o formas de desarrollar que se han demostrado incorrectas a lo largo del tiempo, como pueden ser: 
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Programación copy &amp;amp; paste&lt;/em&gt;, también llamada &lt;em&gt;herencia de editor&lt;/em&gt;, consiste en copiar, pegar y modificar, en contraposición a la estritura de software reutilizable. 
&lt;li&gt;&lt;em&gt;Factor de improbabilidad (Improbability factor)&lt;/em&gt;, asumir que un error conocido es improbable que ocurra. 
&lt;li&gt;&lt;em&gt;Optimización prematura (Premature optimization)&lt;/em&gt;, según algunos la raíz de todos los males, consiste en sacrificar el buen diseño y mantebilidad de un software en benecificio de la eficiencia. 
&lt;li&gt;&lt;em&gt;Programación por permutación (Programming by permutation)&lt;/em&gt;, o intentar dar con una solución modificando sucesivamente el código para ver si funciona.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;&lt;strong&gt;Antipatrones de Gestión de configuración&lt;/strong&gt;, hace referencia a antipatrones relacionados con la gestión de los entornos de desarrollo y explotación del software, como las variantes del &lt;em&gt;infierno de las dependencias (Dependency hell)&lt;/em&gt;, o problemas de versionado de librerías y componentes: 
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;DLL&amp;#39;s Hell&lt;/em&gt;, el conocido y traumático mundo de las librerías dinámicas en Windows. 
&lt;li&gt;&lt;em&gt;JAR&amp;#39;s Hell&lt;/em&gt;, idem, pero relativo a las librerías Java.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;Por no hacer el post eterno sólo he recogido unos cuantos, aunque existen cientos de ellos, y con una gran variedad temática: antipatrones para el desarrollo guiado por pruebas (TDD), antipatrones de manejo de excepciones, para el uso de arquitecturas orientadas al servicio (SOA), de rendimiento, de seguridad, centrados en tecnologías (p.e., J2EE antipatterns) o según el tipo de software (sistemas de gestión, tiempo real, videojuegos, etc.).&lt;br /&gt;&lt;br /&gt;Y como conclusión personal, decir que me he visto reconocido en multitud de ellos, lo cual significa que muy descaminados no andan. Es más, si hiciera una lista con patrones y otra con los antipatrones que utilizo o he utilizado, la segunda tendría más elementos que la primera... ¿quizás es momento de reflexionar un poco?&lt;br /&gt;&lt;br /&gt;Publicado en: &lt;a href="http://www.variablenotfound.com/"&gt;&lt;font color="#35537a"&gt;http://www.variablenotfound.com/&lt;/font&gt;&lt;/a&gt;. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=75006" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/buenas+pr_26002300_225_3B00_cticas/default.aspx">buenas pr&amp;#225;cticas</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/proyectos/default.aspx">proyectos</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/antipatrones/default.aspx">antipatrones</category></item><item><title>Interfaces fluidos (fluent interfaces) </title><link>http://geeks.ms/blogs/jmaguilar/archive/2007/11/14/interfaces-fluidos-fluent-interfaces.aspx</link><pubDate>Wed, 14 Nov 2007 19:51:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:50185</guid><dc:creator>José M. Aguilar</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jmaguilar/rsscomments.aspx?PostID=50185</wfw:commentRss><comments>http://geeks.ms/blogs/jmaguilar/archive/2007/11/14/interfaces-fluidos-fluent-interfaces.aspx#comments</comments><description>&lt;p&gt;Pues no, esta entrada no trata de los diseños líquidos habituales en el mundo de la maquetación web, aunque podría parecer lo contrario. El término &lt;em&gt;interfaz&lt;/em&gt; se utiliza en su acepción relativa a la orientación a objetos, y la &lt;em&gt;fluidez&lt;/em&gt; se refiere a la continuidad en el movimiento de instancias entre distintas llamadas a métodos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_O9D62hXq-ng/RzdYjbDxLXI/AAAAAAAAAMI/Yii3GiXy7LI/s1600-h/calculator-class.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5131667665994198386" style="FLOAT:left;MARGIN:0px 10px 10px 0px;CURSOR:hand;" alt="" src="http://bp3.blogger.com/_O9D62hXq-ng/RzdYjbDxLXI/AAAAAAAAAMI/Yii3GiXy7LI/s320/calculator-class.gif" border="0" /&gt;&lt;/a&gt;En pocas palabras, el uso de interfaces fluidos es un estilo cada vez más frecuente de programación, también llamado a veces &amp;quot;encadenamiento de métodos&amp;quot; (method chaining), que promueve la eliminación de código innecesario y engorroso para la realización de tareas frecuentes, sustituyéndolo por una secuencia natural, intuitiva y fluida de instrucciones que se encadenan de forma casi mágica.&lt;br /&gt;&lt;br /&gt;Pero veámoslo con un ejemplo. Y ojo, que aunque lo codificaremos en C#, el concepto es perfectamente válido para otros lenguajes orientados a objetos, salvo por los aspectos sintácticos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_O9D62hXq-ng/RzdYObDxLWI/AAAAAAAAAMA/0n42mABHjdA/s1600-h/calculator-class.png"&gt;&lt;/a&gt;Imaginemos la clase &lt;code&gt;Calculator&lt;/code&gt;, con un diseño como el mostrado a la izquierda, que es capaz de mantener un único valor (entero) y que soporta cinco operaciones: &lt;code&gt;Get&lt;/code&gt; (para obtener el valor actual de la calculadora), &lt;code&gt;Set&lt;/code&gt; (para establecerlo), y &lt;code&gt;Add&lt;/code&gt;, &lt;code&gt;Substract&lt;/code&gt; y &lt;code&gt;Multiply&lt;/code&gt; (para sumarle, restarle y multiplicarle un valor respectivamente).&lt;br /&gt;&lt;br /&gt;La forma habitual de operar con esta clase para obtener el resultado de un cálculo sería algo parecido a:&lt;pre&gt;&lt;code&gt;  Calculator calc = new Calculator();&lt;br /&gt;  calc.Set(0);&lt;br /&gt;  calc.Add(10);&lt;br /&gt;  calc.Multiply(2);&lt;br /&gt;  calc.Subtract(4);&lt;br /&gt;  Console.WriteLine(&amp;quot;Resultado : &amp;quot; + calc.Get());&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Como podemos observar, para realizar unas operaciones muy simples hemos necesitado demasiadas líneas de código, y además bastante repetitivas.&lt;br /&gt;&lt;br /&gt;Veamos ahora cómo utilizando la técnica de interfaces fluidos podemos dejar este código en:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  Console.WriteLine(&amp;quot;Resultado: &amp;quot; +&lt;br /&gt;    new Calculator().Set(0).Add(10).Multiply(2).Substract(4).Get()&lt;br /&gt;  );&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;El truco consiste en hacer que métodos que normalmente no devolverían ningún valor (métodos void, como los de la clase Calculator anterior) retornen referencias hacia el propio objeto, es decir, acaben con un &lt;code&gt;return this;&lt;/code&gt;. De esta forma, la llamada a la función podrá ir seguida de otra llamada sobre el mismo objeto, que a su vez lo devolverá para el siguiente y así sucesivamente. Y de ahí el término &amp;quot;fluido&amp;quot;: fijaos en el ejemplo anterior como la instancia de Calculator que es retornada por el constructor se utiliza directamente en la llamada &lt;code&gt;Set(0)&lt;/code&gt;, que a su vez la devuelve y es utilizada por &lt;code&gt;Add(10)&lt;/code&gt;... ¿no es eso fluir, aunque el término suene algo poético?&lt;br /&gt;&lt;br /&gt;Otro ejemplo, donde se utiliza la misma técnica, pero esta vez combinando instancias de distintas clases (fijaos que nada impide en la mayoría de lenguajes dividir las líneas de código como se muestra, facilitando así la lectura):&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;  new Surface()&lt;br /&gt;    .Clear()&lt;br /&gt;    .Fill(&amp;quot;white&amp;quot;)&lt;br /&gt;    .CreateText()     &lt;br /&gt;       .SetMessage(&amp;quot;Hi, all!&amp;quot;)&lt;br /&gt;       .SetColor(&amp;quot;blue&amp;quot;)&lt;br /&gt;       .Draw()&lt;br /&gt;    .CreateCircle(100, 100, 10)&lt;br /&gt;       .Fill(&amp;quot;green&amp;quot;)&lt;br /&gt;       .Draw()  &lt;br /&gt;    .Border(&amp;quot;red&amp;quot;)&lt;br /&gt;    .Draw() &lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/code&gt;&lt;font face="Trebuchet MS"&gt;&lt;br /&gt;Este código muestra tres aspectos importantes. Primero, que es posible crear un pseudo-lenguaje de programación utilizando esta técnica, de hecho los &lt;em&gt;fluent interfaces&lt;/em&gt; son muy utilizados en los DSL (Lenguajes Específicos de Dominio). En el ejemplo se puede intuir un lenguaje para el dibujo de figuras sobre una superficie.&lt;br /&gt;&lt;br /&gt;Segundo, que la devolución de los métodos no tiene por qué limitarse a una única clase. En el código anterior, los métodos &lt;/font&gt;&lt;code&gt;CreateText()&lt;/code&gt;&lt;font face="Trebuchet MS"&gt; y &lt;/font&gt;&lt;code&gt;CreateCircle()&lt;/code&gt;&lt;font face="Trebuchet MS"&gt; retornan referencias a nuevas instancias de clases que representan estas figuras, que también hacen uso de interfaces fluidos. Los métodos &lt;/font&gt;&lt;code&gt;Draw()&lt;/code&gt;&lt;font face="Trebuchet MS"&gt; de ambas retornan de nuevo una referencia a la instancia de la superficie (&lt;/font&gt;&lt;code&gt;Surface&lt;/code&gt;&lt;font face="Trebuchet MS"&gt;) sobre la que están dibujando.&lt;br /&gt;&lt;br /&gt;Tercero, se deja entrever la dificultad de desarrollar clases que permitan utilizar esta técnica, pues cada método debe devolver una referencia al objeto oportuno para facilitar el encadenamiento con el método posterior. Una elección incorrecta de la clase de devolución hará que la fluidez se rompa.&lt;br /&gt;&lt;br /&gt;Finalmente, decir que los &lt;em&gt;interfaces fluidos&lt;/em&gt; no son algo nuevo. Hay quien habla de su uso en SmallTalk antes de la década de los noventa (!), aunque el concepto se extendió a partir de la inclusión de una entrada en la &lt;/font&gt;&lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;&lt;font face="Trebuchet MS" color="#223344"&gt;Bliki de Martin Fowler&lt;/font&gt;&lt;/a&gt;&lt;font face="Trebuchet MS"&gt; comentándolo hace un par de años. &lt;br /&gt;&lt;br /&gt;Hay también quien opina que los interfaces fluidos son algo más que el encadenamiento de métodos, que también existe en un código como &lt;/font&gt;&lt;code&gt;name.Trim().ToUpper()&lt;/code&gt;&lt;font face="Trebuchet MS"&gt;, pues aporta una interfaz comprensible e intuitiva.&lt;br /&gt;&lt;br /&gt;En cualquier caso, hace algún tiempo que esta técnica me llamó la atención y cada vez lo veo utilizado en más ocasiones, especialmente en contextos de frameworks y para implementar DSLs (como &lt;/font&gt;&lt;a href="http://www.variablenotfound.com/2007/09/quaere-linq-para-java.html"&gt;&lt;font face="Trebuchet MS" color="#445566"&gt;Quaere&lt;/font&gt;&lt;/a&gt;&lt;font face="Trebuchet MS"&gt;).&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Trebuchet MS"&gt;&lt;strong&gt;Publicado en: &lt;/strong&gt;&lt;a class="" href="http://www.variablenotfound.com/"&gt;&lt;strong&gt;Variable not found&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=50185" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/desarrollo/default.aspx">desarrollo</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/programaci_26002300_243_3B00_n/default.aspx">programaci&amp;#243;n</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/patrones/default.aspx">patrones</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/fluent+interfaces/default.aspx">fluent interfaces</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/dsl/default.aspx">dsl</category><category domain="http://geeks.ms/blogs/jmaguilar/archive/tags/interfaces+fluidos/default.aspx">interfaces fluidos</category></item></channel></rss>