<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>CodeSegment - Carlos Segura Sanz (blog)</title>
    <link>http://www.ideseg.com/</link>
    <description>CodeSegment - Carlos Segura Sanz (blog)</description>
    <image>
      <url>http://www.ideseg.com/images/cseg_logo.gif</url>
      <title>CodeSegment - Carlos Segura Sanz (blog)</title>
      <link>http://www.ideseg.com/</link>
    </image>
    <language>es-es</language>
    <copyright>Carlos Segura</copyright>
    <lastBuildDate>Wed, 10 Jun 2009 15:12:24 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.7174.0</generator>
    <managingEditor>csegura@ideseg.com</managingEditor>
    <webMaster>csegura@ideseg.com</webMaster>
    <item>
      <trackback:ping>http://www.ideseg.com/Trackback.aspx?guid=f6672579-4e7a-47bf-b3a2-231c03ef93ee</trackback:ping>
      <pingback:server>http://www.ideseg.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.ideseg.com/PermaLink,guid,f6672579-4e7a-47bf-b3a2-231c03ef93ee.aspx</pingback:target>
      <dc:creator>csegura</dc:creator>
      <wfw:comment>http://www.ideseg.com/CommentView,guid,f6672579-4e7a-47bf-b3a2-231c03ef93ee.aspx</wfw:comment>
      <wfw:commentRss>http://www.ideseg.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f6672579-4e7a-47bf-b3a2-231c03ef93ee</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p align="center">
          <img src="http://www.ideseg.com/content/binary/cartelElfuturo.jpg" border="0" />
        </p>
        <p>
Después de un largo parón debido principalmente a motivos de salud volvemos a ponernos
en marcha colaborando en la organización de un evento muy atractivo. Se titula <strong>EL
FUTURO</strong>, tachan! y tiene ponentes de lujo: <a href="http://blogs.msdn.com/davidsalgado/">David
Salgado (Microsoft)</a> , el <a href="http://www.cesnavarra.net/cesdigital/default.aspx">equipo
del CES (CES Microsoft)</a> y un servidor [<a href="http://www.ideseg.com">Carlos
Segura (navarradotnet)</a>]. 
</p>
        <p>
          <strong>Será el 23 de junio, de 10 a 15 en el salón de actos de los <a href="http://www.cesnavarra.net/Lists/Eventos%20CES/DispForm1.aspx?List=05834153%2Deec1%2D4089%2Da40e%2D5355dbd305f4&amp;ID=141&amp;Source=http%3A%2F%2Fwww%2Ecesnavarra%2Enet%2Fdefault%2Easpx">Centros
Excelencia Software</a>.</strong>
        </p>
        <p>
          <u>La agenda:</u>
        </p>
        <p>
          <strong>10:00-11:10 Windows 7 para desarrolladores. Equipo CES, CES Microsof</strong>t  
<br /><br />
Veremos las oportunidades que ofrece Windows 7 para aplicaciones de escritorio, cómo
integrarse en la nueva experiencia propuesta por la versión más reciente del sistema
operativo Windows y cómo sacar el máximo partido a las nuevas APIs 
</p>
        <p>
          <strong>11:10 – 12:30 Azure Services Platform – Plataforma de Cloud computing. David
Salgado,  Microsoft </strong>
        </p>
        <p>
Podemos considerar Cloud Computing como un nuevo canal para construir y alojar aplicaciones.
En ésta sesión repasaremos la plataforma de Cloud Computing de Microsoft, haciendo
hincapié en cómo utilizar nuestros conocimientos en .NET para crear aplicaciones para
la nube y utilizar servicios de la plataforma Azure 
</p>
        <p>
          <strong>12:30 – 12:50 Descanso y pincho Cortesía de NavarraDotnet   </strong>
        </p>
        <p>
          <strong>12:50 – 14:00 Silverlight 3 – Experiencia de usuario. David Salgado, Microsoft </strong>
        </p>
        <p>
WPF y posteriormente Silverlight y expression Blend marcaron un antes y un después
a la hora de crear experiencias de usuario en aplicaciones. Actualmente nos encontramos
a las puertas de la versión 3 de silverlight, que incorpora características como la
funcionalidad offline, la detección de la red, los servicios para aplicaciones de
línea de negocio, etcétera. En esta sesión repasaremos las bases que sitúan a Silverlight
como una opción excelente para aplicaciones RIA y sus nuevas funcionalidades en esta
versión 3. 
</p>
        <p>
          <strong>
            <font color="#ff0000">14:00 – 15:00 Concurrent Buggy Framework . Carlos Segura,
navarradotnet</font>
          </strong>
        </p>
        <p>
Presentación para la concurrencia del Buggy Framework. 
<br />
Conduce a la velocidad que siempre has soñado en tus aplicaciones...  
</p>
        <p>
Entrada gratuita previo registro en 
<br /><br /><a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032416823&amp;Culture=es-ES">http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032416823&amp;Culture=es-ES</a></p>
        <p>
Es de no perdérselo!!! Nos vemos allí :) 
</p>
        <p>
El cartel, como ¿no? diseñado por nuestros amigos de Sistema Formación
</p>
        <p align="center">
          <br />
        </p>
        <img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=f6672579-4e7a-47bf-b3a2-231c03ef93ee" />
      </body>
      <title>NavarraDotNet - ¡Volvemos a la carga! - El Futuro</title>
      <guid isPermaLink="false">http://www.ideseg.com/PermaLink,guid,f6672579-4e7a-47bf-b3a2-231c03ef93ee.aspx</guid>
      <link>http://www.ideseg.com/NavarraDotNetVolvemosALaCargaElFuturo.aspx</link>
      <pubDate>Wed, 10 Jun 2009 15:12:24 GMT</pubDate>
      <description>&lt;p align="center"&gt;
&lt;img src="http://www.ideseg.com/content/binary/cartelElfuturo.jpg" border="0"&gt;
&lt;/p&gt;
&lt;p&gt;
Después de un largo parón debido principalmente a motivos de salud volvemos a ponernos
en marcha colaborando en la organización de un evento muy atractivo. Se titula &lt;strong&gt;EL
FUTURO&lt;/strong&gt;, tachan! y tiene ponentes de lujo: &lt;a href="http://blogs.msdn.com/davidsalgado/"&gt;David
Salgado (Microsoft)&lt;/a&gt; , el &lt;a href="http://www.cesnavarra.net/cesdigital/default.aspx"&gt;equipo
del CES (CES Microsoft)&lt;/a&gt; y un servidor [&lt;a href="http://www.ideseg.com"&gt;Carlos
Segura (navarradotnet)&lt;/a&gt;]. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Será el 23 de junio, de 10 a 15 en el salón de actos de los &lt;a href="http://www.cesnavarra.net/Lists/Eventos%20CES/DispForm1.aspx?List=05834153%2Deec1%2D4089%2Da40e%2D5355dbd305f4&amp;amp;ID=141&amp;amp;Source=http%3A%2F%2Fwww%2Ecesnavarra%2Enet%2Fdefault%2Easpx"&gt;Centros
Excelencia Software&lt;/a&gt;.&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;La agenda:&lt;/u&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;10:00-11:10 Windows 7 para desarrolladores. Equipo CES, CES Microsof&lt;/strong&gt;t&amp;nbsp; 
&lt;br&gt;
&lt;br&gt;
Veremos las oportunidades que ofrece Windows 7 para aplicaciones de escritorio, cómo
integrarse en la nueva experiencia propuesta por la versión más reciente del sistema
operativo Windows y cómo sacar el máximo partido a las nuevas APIs 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;11:10 – 12:30 Azure Services Platform – Plataforma de Cloud computing. David
Salgado,&amp;nbsp; Microsoft &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Podemos considerar Cloud Computing como un nuevo canal para construir y alojar aplicaciones.
En ésta sesión repasaremos la plataforma de Cloud Computing de Microsoft, haciendo
hincapié en cómo utilizar nuestros conocimientos en .NET para crear aplicaciones para
la nube y utilizar servicios de la plataforma Azure 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;12:30 – 12:50 Descanso y pincho Cortesía de NavarraDotnet&amp;nbsp;&amp;nbsp; &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;12:50 – 14:00 Silverlight 3 – Experiencia de usuario. David Salgado, Microsoft &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
WPF y posteriormente Silverlight y expression Blend marcaron un antes y un después
a la hora de crear experiencias de usuario en aplicaciones. Actualmente nos encontramos
a las puertas de la versión 3 de silverlight, que incorpora características como la
funcionalidad offline, la detección de la red, los servicios para aplicaciones de
línea de negocio, etcétera. En esta sesión repasaremos las bases que sitúan a Silverlight
como una opción excelente para aplicaciones RIA y sus nuevas funcionalidades en esta
versión 3. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;font color="#ff0000"&gt;14:00 – 15:00 Concurrent Buggy Framework . Carlos Segura,
navarradotnet&lt;/font&gt;&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
Presentación para la concurrencia del Buggy Framework. 
&lt;br&gt;
Conduce a la velocidad que siempre has soñado en tus aplicaciones...&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Entrada gratuita previo registro en 
&lt;br&gt;
&lt;br&gt;
&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032416823&amp;amp;Culture=es-ES"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032416823&amp;amp;Culture=es-ES&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Es de no perdérselo!!! Nos vemos allí :) 
&lt;/p&gt;
&lt;p&gt;
El cartel, como ¿no? diseñado por nuestros amigos de Sistema Formación
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=f6672579-4e7a-47bf-b3a2-231c03ef93ee" /&gt;</description>
      <comments>http://www.ideseg.com/CommentView,guid,f6672579-4e7a-47bf-b3a2-231c03ef93ee.aspx</comments>
      <category>NavarraDotNet</category>
    </item>
    <item>
      <trackback:ping>http://www.ideseg.com/Trackback.aspx?guid=6e18c875-c990-4b54-b549-faea2972de75</trackback:ping>
      <pingback:server>http://www.ideseg.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.ideseg.com/PermaLink,guid,6e18c875-c990-4b54-b549-faea2972de75.aspx</pingback:target>
      <dc:creator>csegura</dc:creator>
      <wfw:comment>http://www.ideseg.com/CommentView,guid,6e18c875-c990-4b54-b549-faea2972de75.aspx</wfw:comment>
      <wfw:commentRss>http://www.ideseg.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6e18c875-c990-4b54-b549-faea2972de75</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Bueno, esta es la última entrega a partir
de hoy el proyecto se encuentra en CodePlex (<font color="#ff0000"><b><a href="http://yacamlqt.codeplex.com/">yacamlqt.codeplex.com</a></b></font>).<br /><br />
En esta última parte solo unas pequeñas notas para el usuario final.<br /><br />
Bien, para usar YACAMLQT, dentro de tus proyectos, solo hay que referenciar la dll
(<b>IdeSeg.SharePoint.Caml.QueryParser.dll</b>)  y el uso sería el siguiente:<br /><br /><br /><p></p><!-- code formatted by http://manoli.net/csharpformat/ --><div class="csharpcode"><pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">try</span></pre><pre><span class="lnum"> 2: </span> {</pre><pre class="alt"><span class="lnum"> 3: </span> var parser = <span class="kwrd">new</span> NParser(textTSql, <span class="kwrd">new</span> ASTNodeCAMLFactory());</pre><pre><span class="lnum"> 4: </span> var generator = <span class="kwrd">new</span> CodeGenerator(parser.Parse());</pre><pre class="alt"><span class="lnum"> 5: </span> generator.Generate();</pre><pre><span class="lnum"> 6: </span><span class="kwrd">return</span> _formatTools.FormatXml(generator.Code);</pre><pre class="alt"><span class="lnum"> 7: </span> }</pre><pre><span class="lnum"> 8: </span><span class="kwrd">catch</span> (ParserException
ex)</pre><pre class="alt"><span class="lnum"> 9: </span> {</pre><pre><span class="lnum"> 10: </span> _view.Status = ex.Message;</pre><pre class="alt"><span class="lnum"> 11: </span> }</pre><pre><span class="lnum"> 12: </span><span class="kwrd">catch</span> (ScannerException
ex)</pre><pre class="alt"><span class="lnum"> 13: </span> {</pre><pre><span class="lnum"> 14: </span> _view.Status = ex.Message;</pre><pre class="alt"><span class="lnum"> 15: </span> }</pre></div><p>
Instanciamos el Parser (<b>NParser</b>), le pasamos la consulta en TSQL (<b>textSql</b>)
y la factoría correspondiente a lo que queremos generar, por el momento solo está
disponible la de <b>CAML</b>, en breve completaré la de <b>CAML.Net</b>; Por último
inyectamos el Parser en el Generador de código, llamamos al método <b>Generate</b> y
recogemos la consulta en CAML en <b>generator.Code</b>.
</p><p><br />
Las posibles excepciones tanto del Parser como del generador de código se pueden atrapar
con <b>ParserException</b> y <b>ScannerException</b>.
</p><p><br />
En el proyecto se incluye un pequeño subproyecto con una interfaz WinForms (no es
que se me de especialmente bien)<br /><br /></p><div align="center"><img src="http://www.ideseg.com/content/binary/YACAMLQT_Sample_Gui.PNG" border="0" /><br /><br /><b><a href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux2.aspx">Parte
2 http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux2.aspx</a></b><br /><b><a href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx">Parte
1 http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx</a></b><br /></div><img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=6e18c875-c990-4b54-b549-faea2972de75" /></body>
      <title>YACAMLQT (Yet another CAML query tool) Redux (3) in CodePlex</title>
      <guid isPermaLink="false">http://www.ideseg.com/PermaLink,guid,6e18c875-c990-4b54-b549-faea2972de75.aspx</guid>
      <link>http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux3InCodePlex.aspx</link>
      <pubDate>Tue, 26 May 2009 23:47:39 GMT</pubDate>
      <description>Bueno, esta es la última entrega a partir de hoy el proyecto se encuentra en CodePlex (&lt;font color=#ff0000&gt;&lt;b&gt;&lt;a href="http://yacamlqt.codeplex.com/"&gt;yacamlqt.codeplex.com&lt;/a&gt;&lt;/b&gt;&lt;/font&gt;).&lt;br&gt;
&lt;br&gt;
En esta última parte solo unas pequeñas notas para el usuario final.&lt;br&gt;
&lt;br&gt;
Bien, para usar YACAMLQT, dentro de tus proyectos, solo hay que referenciar la dll
(&lt;b&gt;IdeSeg.SharePoint.Caml.QueryParser.dll&lt;/b&gt;)&amp;nbsp; y el uso sería el siguiente:&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=lnum&gt; 1: &lt;/span&gt; &lt;span class=kwrd&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 2: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class=alt&gt;&lt;span class=lnum&gt; 3: &lt;/span&gt; var parser = &lt;span class=kwrd&gt;new&lt;/span&gt; NParser(textTSql, &lt;span class=kwrd&gt;new&lt;/span&gt; ASTNodeCAMLFactory());&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 4: &lt;/span&gt; var generator = &lt;span class=kwrd&gt;new&lt;/span&gt; CodeGenerator(parser.Parse());&lt;/pre&gt;
&lt;pre class=alt&gt;&lt;span class=lnum&gt; 5: &lt;/span&gt; generator.Generate();&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 6: &lt;/span&gt; &lt;span class=kwrd&gt;return&lt;/span&gt; _formatTools.FormatXml(generator.Code);&lt;/pre&gt;
&lt;pre class=alt&gt;&lt;span class=lnum&gt; 7: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 8: &lt;/span&gt; &lt;span class=kwrd&gt;catch&lt;/span&gt; (ParserException ex)&lt;/pre&gt;
&lt;pre class=alt&gt;&lt;span class=lnum&gt; 9: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 10: &lt;/span&gt; _view.Status = ex.Message;&lt;/pre&gt;
&lt;pre class=alt&gt;&lt;span class=lnum&gt; 11: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 12: &lt;/span&gt; &lt;span class=kwrd&gt;catch&lt;/span&gt; (ScannerException
ex)&lt;/pre&gt;
&lt;pre class=alt&gt;&lt;span class=lnum&gt; 13: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 14: &lt;/span&gt; _view.Status = ex.Message;&lt;/pre&gt;
&lt;pre class=alt&gt;&lt;span class=lnum&gt; 15: &lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Instanciamos el Parser (&lt;b&gt;NParser&lt;/b&gt;), le pasamos la consulta en TSQL (&lt;b&gt;textSql&lt;/b&gt;)
y la factoría correspondiente a lo que queremos generar, por el momento solo está
disponible la de &lt;b&gt;CAML&lt;/b&gt;, en breve completaré la de &lt;b&gt;CAML.Net&lt;/b&gt;; Por último
inyectamos el Parser en el Generador de código, llamamos al método &lt;b&gt;Generate&lt;/b&gt; y
recogemos la consulta en CAML en &lt;b&gt;generator.Code&lt;/b&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Las posibles excepciones tanto del Parser como del generador de código se pueden atrapar
con &lt;b&gt;ParserException&lt;/b&gt; y &lt;b&gt;ScannerException&lt;/b&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
En el proyecto se incluye un pequeño subproyecto con una interfaz WinForms (no es
que se me de especialmente bien)&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;div align=center&gt;&lt;img src="http://www.ideseg.com/content/binary/YACAMLQT_Sample_Gui.PNG" border=0&gt;
&lt;br&gt;
&lt;br&gt;
&lt;b&gt;&lt;a href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux2.aspx"&gt;Parte
2 http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux2.aspx&lt;/a&gt;&lt;/b&gt;
&lt;br&gt;
&lt;b&gt;&lt;a href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx"&gt;Parte
1 http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx&lt;/a&gt;&lt;/b&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=6e18c875-c990-4b54-b549-faea2972de75" /&gt;</description>
      <comments>http://www.ideseg.com/CommentView,guid,6e18c875-c990-4b54-b549-faea2972de75.aspx</comments>
      <category>CAMLEditor</category>
      <category>NET Development</category>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://www.ideseg.com/Trackback.aspx?guid=f3781a2e-6f53-4a18-bbfd-ae14acff0025</trackback:ping>
      <pingback:server>http://www.ideseg.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.ideseg.com/PermaLink,guid,f3781a2e-6f53-4a18-bbfd-ae14acff0025.aspx</pingback:target>
      <dc:creator>csegura</dc:creator>
      <wfw:comment>http://www.ideseg.com/CommentView,guid,f3781a2e-6f53-4a18-bbfd-ae14acff0025.aspx</wfw:comment>
      <wfw:commentRss>http://www.ideseg.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f3781a2e-6f53-4a18-bbfd-ae14acff0025</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A estas alturas… todavía me encuentro con aplicaciones donde es imposible comprender
el diseño e interpretar las intenciones del desarrollador. 
<br /><br />
Básicamente, pienso que hablan por sí solos, es decir, revelan la intención del diseño,
son un lenguaje común; cuando en un equipo de desarrollo se habla en términos de patrones
de código, se está hablando de las características, cualidades y restricciones que
el patrón representa. Hablamos simplificando los problemas y partes del diseño de
nuestras aplicaciones.<br /></p>
        <p>
Prácticamente no hay API ó Framework (<a href="http://www.ideseg.com/CenandoBuenasPracticasHistoriaDeTerror.aspx"><u><b>la
de SharePoint es una excepción</b></u></a>) donde no se haga uso de patrones, esto
hace que el uso y comprensión así como las extensiones que realicemos sea mucho más
sencillo.<br /></p>
        <p>
“Cada patrón describe un problema que ocurre una y otra vez en nuestro ambiente y
describe el corazón de la solución del problema, de esta manera podemos usar esta
solución una y otra vez sin hacerlo de la misma manera dos veces” Christopher Alexander
[AIS+77, page x] 
<br /></p>
        <p>
Los patrones nos dicen como estructurar clases y objetos para resolver problemas,
y es nuestro trabajo adaptarlos a nuestros diseños.<br /></p>
        <p>
Y esto es lo más grande, porque esa adaptación a un problema particular no oculta
las intenciones del programador, viendo que patrón se ha adaptado nos permite vislumbrar
en que ha pensado a la hora de tomar decisiones.<br /></p>
        <p>
En fin, para todos aquellos que comienzan, y para algunos que todavía… os dejo una
lista de libros que son (no todos) de obligada lectura.
</p>
        <p align="center">
          <img src="http://www.ideseg.com/content/binary/patterns_books.gif" border="0" />
        </p>
        <p>
De arriba abajo:
</p>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0201633612&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0201895420&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0131857258&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0321127420&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0321213351&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0321413091&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=059652773X&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0201844532&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0131495054&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0321490452&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=FFFFFF&amp;bg1=FFFFFF&amp;f=ifr&amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0">
        </iframe>
        <br />
        <br />
* Patrones de diseño, edición en castellano de <a href="http://www.amazon.com/dp/0201633612?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0201633612&amp;adid=11B3BTMQPJRR9ZJR01FA&amp;"> Design
Patterns</a> - <span style="color: rgb(255, 0, 0);"><strong>Lectura obligatoria</strong></span><br />
* <a href="http://www.amazon.com/dp/0201633612?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0201633612&amp;adid=11B3BTMQPJRR9ZJR01FA&amp;"> Design
Patters</a> (GOF Book) - <span style="color: rgb(255, 0, 0);"><strong>Lectura obligatoria</strong></span><br />
* <a href="http://www.amazon.com/dp/0201895420?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0201895420&amp;adid=10K4QWCT5K84XRV3YHNF&amp;"> Analysis
Patterns</a> - Es un libro más profundo, sobre todo orientado al análisis y diseño
de aplicaciones, con ejemplos (sin código) del diseño de aplicaciones de negocio y
de aplicación de patrones en el diseño - <span style="color: rgb(255, 0, 0);"><strong>Lectura
Recomendada</strong></span><br />
* <a href="http://www.amazon.com/dp/0131857258?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0131857258&amp;adid=1AT1S5GRY9R1QVGDBMDM&amp;"> AAgile
Principles, Patterns and Practices in C#</a> - Para mi uno de los mejores libros que
he leído, no solo hace hincapié en los principios de diseño más básicos, sino que
también añade una completa referencia de los patrones más usados. - <span style="color: rgb(255, 0, 0);"><strong>Lectura
Muy Recomendada.</strong></span><br />
* <a href="http://www.amazon.com/dp/0321127420?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0321127420&amp;adid=114DFAY63EWB8EB37GNS&amp;"> Patterns
of Enterprise Application Architecture</a> - Fantástico, aquí se incluyen muchos de
los patrones más usados que no se encuentran en el GOF Book, desde Active Record,
Lazy Load, Unit Of Work ... aproximadamente 50 patrones menos conocidos, pero ampliamente
usados. - <span style="color: rgb(255, 0, 0);"><strong>Lectura Obligatoria.</strong></span><br />
* <a href="http://www.amazon.com/dp/0321213351?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0321213351&amp;adid=1RW62VM2FNMBTP4179WV&amp;"> Refactoring
to Patterns</a>,, un pedazo de libro, que es como el eslabón que une refactorizaciones
y patrones, perfectamente explicado, realmente impresionante como une el libro de
Design Patterns, con el de<a href="https://www.amazon.com/dp/0201485672?tag=codesegm-20&amp;camp=0&amp;creative=0&amp;linkCode=as1&amp;creativeASIN=0201485672&amp;adid=12V0NKY1F1DRMDDSJZFV&amp;"> Refactoring</a> 
(Fowler) - <span style="color: rgb(255, 0, 0);"><strong>Lectura Muy Recomendada.</strong></span><br />
* <a href="http://www.amazon.com/dp/0321413091?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0321413091&amp;adid=1FEHGRXBWSCBEKW5ZFPT&amp;"> Implementation
Patterns</a> - Un libro que realmente habla más del estilo de código que de patrones,
un poco flojo, recomiendo leer <a href="https://www.amazon.com/dp/0132350882?tag=codesegm-20&amp;camp=0&amp;creative=0&amp;linkCode=as1&amp;creativeASIN=0132350882&amp;adid=14YYGQV3FEZZDNJW29P7&amp;"> Clean
Code</a> de Robert C. Martin. - <span style="color: rgb(255, 0, 0);"><strong>Lectura
Medio Recomendada.</strong></span><br />
* <a href="http://www.amazon.com/dp/059652773X?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=059652773X&amp;adid=1YMRHP3J2ZJ6FN462QYT&amp;">C#
3.0 Design Patterns</a> - Un libro con ejemplos de patrones (GOF) en C# 3.0 sin más.
- <span style="color: rgb(255, 0, 0);"><strong>Lectura Medio Recomendada.</strong></span><br />
* <a href="http://www.amazon.com/dp/0201844532?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0201844532&amp;adid=07TKRSQX91ZS59KV38Z2&amp;">C#
Design Patterns</a>, los GOF con ejemplos en C#, <span style="color: rgb(255, 0, 0);"><strong>Libro
recomendado para los que comienzan con C#.</strong></span><br />
* <a href="http://www.amazon.com/dp/0131495054?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0131495054&amp;adid=18AXVS8JFNPDWJF24J4K&amp;">xUnit
Test Patterns</a> - Si haces pruebas ó TDD es imprescindible. <span style="color: rgb(255, 0, 0);"><strong>Lectura
Muy Recomendada</strong></span>.<br />
* <a href="http://www.amazon.com/dp/0321490452?tag=codesegm-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0321490452&amp;adid=0DF0H7MDQNF64Y363EY1&amp;"> Design
Patterns in Ruby</a> - Si eres un salsas, como yo, no esta de más ver como se implementan
los GOF en Ruby, muy entretenido.<span style="color: rgb(255, 0, 0);"><strong> Lectura
Pasatiempo.</strong></span><br /><br />
Por último tengo un librito que aunque parece que esta en chino, no es así, esta en
ingles, pero es una edición Design Patterns para China, a mi me gusta para llevarlo
en la maleta cuando doy charlas o cursos.<br /><br /><br /><img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=f3781a2e-6f53-4a18-bbfd-ae14acff0025" /></body>
      <title>¿Por qué son importantes los patrones? - Libros de Referencia</title>
      <guid isPermaLink="false">http://www.ideseg.com/PermaLink,guid,f3781a2e-6f53-4a18-bbfd-ae14acff0025.aspx</guid>
      <link>http://www.ideseg.com/PorQu%c3%a9SonImportantesLosPatronesLibrosDeReferencia.aspx</link>
      <pubDate>Fri, 22 May 2009 13:49:40 GMT</pubDate>
      <description>&lt;p&gt;
A estas alturas… todavía me encuentro con aplicaciones donde es imposible comprender
el diseño e interpretar las intenciones del desarrollador. 
&lt;br&gt;
&lt;br&gt;
Básicamente, pienso que hablan por sí solos, es decir, revelan la intención del diseño,
son un lenguaje común; cuando en un equipo de desarrollo se habla en términos de patrones
de código, se está hablando de las características, cualidades y restricciones que
el patrón representa. Hablamos simplificando los problemas y partes del diseño de
nuestras aplicaciones.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Prácticamente no hay API ó Framework (&lt;a href="http://www.ideseg.com/CenandoBuenasPracticasHistoriaDeTerror.aspx"&gt;&lt;u&gt;&lt;b&gt;la
de SharePoint es una excepción&lt;/b&gt;&lt;/u&gt;&lt;/a&gt;) donde no se haga uso de patrones, esto
hace que el uso y comprensión así como las extensiones que realicemos sea mucho más
sencillo.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
“Cada patrón describe un problema que ocurre una y otra vez en nuestro ambiente y
describe el corazón de la solución del problema, de esta manera podemos usar esta
solución una y otra vez sin hacerlo de la misma manera dos veces” Christopher Alexander
[AIS+77, page x] 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Los patrones nos dicen como estructurar clases y objetos para resolver problemas,
y es nuestro trabajo adaptarlos a nuestros diseños.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
Y esto es lo más grande, porque esa adaptación a un problema particular no oculta
las intenciones del programador, viendo que patrón se ha adaptado nos permite vislumbrar
en que ha pensado a la hora de tomar decisiones.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
En fin, para todos aquellos que comienzan, y para algunos que todavía… os dejo una
lista de libros que son (no todos) de obligada lectura.
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="http://www.ideseg.com/content/binary/patterns_books.gif" border="0"&gt; 
&lt;/p&gt;
&lt;p&gt;
De arriba abajo:
&lt;/p&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0201633612&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0201895420&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0131857258&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0321127420&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0321213351&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0321413091&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=059652773X&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0201844532&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0131495054&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=codesegm-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0321490452&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=FFFFFF&amp;amp;bg1=FFFFFF&amp;amp;f=ifr&amp;amp;npa=1" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"&gt;
&lt;/iframe&gt;
&lt;br&gt;
&lt;br&gt;
* Patrones de diseño, edición en castellano de &lt;a href="http://www.amazon.com/dp/0201633612?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0201633612&amp;amp;adid=11B3BTMQPJRR9ZJR01FA&amp;amp;"&gt; Design
Patterns&lt;/a&gt; - &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura obligatoria&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0201633612?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0201633612&amp;amp;adid=11B3BTMQPJRR9ZJR01FA&amp;amp;"&gt; Design
Patters&lt;/a&gt; (GOF Book) - &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura obligatoria&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0201895420?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0201895420&amp;amp;adid=10K4QWCT5K84XRV3YHNF&amp;amp;"&gt; Analysis
Patterns&lt;/a&gt; - Es un libro más profundo, sobre todo orientado al análisis y diseño
de aplicaciones, con ejemplos (sin código) del diseño de aplicaciones de negocio y
de aplicación de patrones en el diseño - &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura
Recomendada&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0131857258?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0131857258&amp;amp;adid=1AT1S5GRY9R1QVGDBMDM&amp;amp;"&gt; AAgile
Principles, Patterns and Practices in C#&lt;/a&gt; - Para mi uno de los mejores libros que
he leído, no solo hace hincapié en los principios de diseño más básicos, sino que
también añade una completa referencia de los patrones más usados. - &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura
Muy Recomendada.&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0321127420?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0321127420&amp;amp;adid=114DFAY63EWB8EB37GNS&amp;amp;"&gt; Patterns
of Enterprise Application Architecture&lt;/a&gt; - Fantástico, aquí se incluyen muchos de
los patrones más usados que no se encuentran en el GOF Book, desde Active Record,
Lazy Load, Unit Of Work ... aproximadamente 50 patrones menos conocidos, pero ampliamente
usados. - &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura Obligatoria.&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0321213351?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0321213351&amp;amp;adid=1RW62VM2FNMBTP4179WV&amp;amp;"&gt; Refactoring
to Patterns&lt;/a&gt;,, un pedazo de libro, que es como el eslabón que une refactorizaciones
y patrones, perfectamente explicado, realmente impresionante como une el libro de
Design Patterns, con el de&lt;a href="https://www.amazon.com/dp/0201485672?tag=codesegm-20&amp;amp;camp=0&amp;amp;creative=0&amp;amp;linkCode=as1&amp;amp;creativeASIN=0201485672&amp;amp;adid=12V0NKY1F1DRMDDSJZFV&amp;amp;"&gt; Refactoring&lt;/a&gt;&amp;nbsp;
(Fowler) - &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura Muy Recomendada.&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0321413091?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0321413091&amp;amp;adid=1FEHGRXBWSCBEKW5ZFPT&amp;amp;"&gt; Implementation
Patterns&lt;/a&gt; - Un libro que realmente habla más del estilo de código que de patrones,
un poco flojo, recomiendo leer &lt;a href="https://www.amazon.com/dp/0132350882?tag=codesegm-20&amp;amp;camp=0&amp;amp;creative=0&amp;amp;linkCode=as1&amp;amp;creativeASIN=0132350882&amp;amp;adid=14YYGQV3FEZZDNJW29P7&amp;amp;"&gt; Clean
Code&lt;/a&gt; de Robert C. Martin. - &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura
Medio Recomendada.&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/059652773X?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=059652773X&amp;amp;adid=1YMRHP3J2ZJ6FN462QYT&amp;amp;"&gt;C#
3.0 Design Patterns&lt;/a&gt; - Un libro con ejemplos de patrones (GOF) en C# 3.0 sin más.
- &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura Medio Recomendada.&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0201844532?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0201844532&amp;amp;adid=07TKRSQX91ZS59KV38Z2&amp;amp;"&gt;C#
Design Patterns&lt;/a&gt;, los GOF con ejemplos en C#, &lt;span style="color: rgb(255, 0, 0);"&gt; &lt;strong&gt;Libro
recomendado para los que comienzan con C#.&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0131495054?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0131495054&amp;amp;adid=18AXVS8JFNPDWJF24J4K&amp;amp;"&gt;xUnit
Test Patterns&lt;/a&gt; - Si haces pruebas ó TDD es imprescindible. &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Lectura
Muy Recomendada&lt;/strong&gt;&lt;/span&gt;.&lt;br&gt;
* &lt;a href="http://www.amazon.com/dp/0321490452?tag=codesegm-20&amp;amp;camp=14573&amp;amp;creative=327641&amp;amp;linkCode=as1&amp;amp;creativeASIN=0321490452&amp;amp;adid=0DF0H7MDQNF64Y363EY1&amp;amp;"&gt; Design
Patterns in Ruby&lt;/a&gt; - Si eres un salsas, como yo, no esta de más ver como se implementan
los GOF en Ruby, muy entretenido.&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt; Lectura
Pasatiempo.&lt;/strong&gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
Por último tengo un librito que aunque parece que esta en chino, no es así, esta en
ingles, pero es una edición Design Patterns para China, a mi me gusta para llevarlo
en la maleta cuando doy charlas o cursos.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=f3781a2e-6f53-4a18-bbfd-ae14acff0025" /&gt;</description>
      <comments>http://www.ideseg.com/CommentView,guid,f3781a2e-6f53-4a18-bbfd-ae14acff0025.aspx</comments>
      <category>Misc</category>
      <category>NET Development</category>
    </item>
    <item>
      <trackback:ping>http://www.ideseg.com/Trackback.aspx?guid=383b8df3-136d-4735-82b0-a2a2725c42eb</trackback:ping>
      <pingback:server>http://www.ideseg.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.ideseg.com/PermaLink,guid,383b8df3-136d-4735-82b0-a2a2725c42eb.aspx</pingback:target>
      <dc:creator>csegura</dc:creator>
      <wfw:comment>http://www.ideseg.com/CommentView,guid,383b8df3-136d-4735-82b0-a2a2725c42eb.aspx</wfw:comment>
      <wfw:commentRss>http://www.ideseg.com/SyndicationService.asmx/GetEntryCommentsRss?guid=383b8df3-136d-4735-82b0-a2a2725c42eb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Continuando con la <a href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx">explicación
del código de YACAMLQT</a>.<br /><br />
Habíamos visto la parte relacionada con el Lexer el analizador morfológico. Como es
obvio detrás debe haber un analizador sintáctico y semántico el <a href="http://en.wikipedia.org/wiki/Parsing">Parser</a>.<br /><br />
El analizador sintáctico y semántico (<b>NParser</b>) se ha implementado siguiendo
el patrón interpeter, (<i>seguramente sea uno de los que menos se ven</i>), el objetivo
es obtener los distintos Tokens desde el Scanner y montar un árbol sintáctico (<a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree">AST</a>)
este árbol contiene Nodos (<b>ASTNodeBase</b>) y estos nodos representan de manera
abstracta y simplificada la estructura sintáctica de la consulta en SQL.<br /><br />
(diagrama NParser)<br /><div align="center"><img src="http://www.ideseg.com/content/binary/yacamlqt_nparser.gif" border="0" width="467" height="445" /><br /></div>
A la clase <b>NParser </b>se le puede inyectar una factoria (<b>ASTNodeFactoryBase</b>)
en función del código que queramos generar, por el momento solo esta implementado
el CAML, pero se puede extender sencillamente para generar <a href="http://www.codeplex.com/camldotnet">CAML.Net</a>.<br /><br />
Partiendo de un nodo abstracto (<b>ASTNodeBase</b>) podemos definir las distintas
unidades sintácticas, por medio de la herencia. Estos nodos abstractos (heredados
de <b>ASTNodeBase </b>) conforman las distintas expresiones que se usan en el analizador
sintáctico y semántico (<b>NParser</b>), para ello se ha definido una clase para cada
uno de los Tokens a modo de plantilla (template),  y estas clases son a su vez
son las distintas expresiones abstractas, que se usan en  el patrón interpreter
implementado en el parser. (<b>NParser</b>).<br /><br />
Todos estos nodos que forman las expresiones abstractas al fin al cabo son plantillas
(templates), y podrían a su vez ser clases abstractas, yo opte por una implementarlas
como clases normales. Ya que algunos de los nodos son terminales y otros intermedios
y no tienen por qué ser heredados, de este modo la factoria base (<b>ASTNodeFactoryBase</b>)
usa miembros virtuales parar crear dichos nodos.<br /><br />
(diagrama parcial de ASTNodeBase)<br /><div align="center"><img src="http://www.ideseg.com/content/binary/yacamlqt_ast.gif" border="0" /><br /></div>
Para crear todos estas expresiones abstractas existe una factoría abstracta (<b>ASTNodeFactoryBase </b>)
a través de la cual creamos los distintos nodos. Como puede verse, para añadir una
variante como <a href="http://www.codeplex.com/camldotnet">CAML.Net</a>, solamente
hay que añadir las expresiones abstractas heredando de las ya existentes e implementando <b>PreCode()</b> y <b>PostCode()</b>. 
<br /><br />
Todos estos nodos que forman las expresiones abstractas al fin al cabo son plantillas
(templates), y podrían a su vez ser clases abstractas, yo opte por una implementarlas
como clases normales, debido a que algunos de los nodos son terminales y otros intermedios
y no tienen por qué ser heredados, de este modo la factoria base (<b>ASTNodeFactoryBase</b>)
usa miembros virtuales parar crear dichos nodos terminales e intermedios.<br /><br />
Después para poder inyectar en el parser dichas expresiones debemos crear una nueva
factoría heredada de la factoría base (ASTNodeFactoryBase).<br /><br />
(diagrama ASTNodeFactoryBase)<br /><div align="center"><img src="http://www.ideseg.com/content/binary/yacamlqt_nodefactory.gif" border="0" /><br /></div>
Para generar CAML lo que he hecho es heredar de cada plantilla ó expresión abstracta
definida, una nueva clase que redefine los métodos virtuales <b>PreCode()</b> y <b>PostCode()</b> que
son los encargados de sustituir cada nodo del árbol sintáctico en CAML.<br /><br />
Y crear una factoría (<b>ASTNodeCAMLFactory</b>) que se encarga de crear las expresiones.<br /><br /><img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=383b8df3-136d-4735-82b0-a2a2725c42eb" /></body>
      <title>YACAMLQT (Yet another CAML query tool) Redux (2)</title>
      <guid isPermaLink="false">http://www.ideseg.com/PermaLink,guid,383b8df3-136d-4735-82b0-a2a2725c42eb.aspx</guid>
      <link>http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux2.aspx</link>
      <pubDate>Fri, 22 May 2009 09:50:52 GMT</pubDate>
      <description>Continuando con la &lt;a href="http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx"&gt;explicación
del código de YACAMLQT&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Habíamos visto la parte relacionada con el Lexer el analizador morfológico. Como es
obvio detrás debe haber un analizador sintáctico y semántico el &lt;a href="http://en.wikipedia.org/wiki/Parsing"&gt;Parser&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
El analizador sintáctico y semántico (&lt;b&gt;NParser&lt;/b&gt;) se ha implementado siguiendo
el patrón interpeter, (&lt;i&gt;seguramente sea uno de los que menos se ven&lt;/i&gt;), el objetivo
es obtener los distintos Tokens desde el Scanner y montar un árbol sintáctico (&lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;AST&lt;/a&gt;)
este árbol contiene Nodos (&lt;b&gt;ASTNodeBase&lt;/b&gt;) y estos nodos representan de manera
abstracta y simplificada la estructura sintáctica de la consulta en SQL.&lt;br&gt;
&lt;br&gt;
(diagrama NParser)&lt;br&gt;
&lt;div align="center"&gt;&lt;img src="http://www.ideseg.com/content/binary/yacamlqt_nparser.gif" border="0" width="467" height="445"&gt;
&lt;br&gt;
&lt;/div&gt;
A la clase &lt;b&gt;NParser &lt;/b&gt;se le puede inyectar una factoria (&lt;b&gt;ASTNodeFactoryBase&lt;/b&gt;)
en función del código que queramos generar, por el momento solo esta implementado
el CAML, pero se puede extender sencillamente para generar &lt;a href="http://www.codeplex.com/camldotnet"&gt;CAML.Net&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
Partiendo de un nodo abstracto (&lt;b&gt;ASTNodeBase&lt;/b&gt;) podemos definir las distintas
unidades sintácticas, por medio de la herencia. Estos nodos abstractos (heredados
de &lt;b&gt;ASTNodeBase &lt;/b&gt;) conforman las distintas expresiones que se usan en el analizador
sintáctico y semántico (&lt;b&gt;NParser&lt;/b&gt;), para ello se ha definido una clase para cada
uno de los Tokens a modo de plantilla (template),&amp;nbsp; y estas clases son a su vez
son las distintas expresiones abstractas, que se usan en&amp;nbsp; el patrón interpreter
implementado en el parser. (&lt;b&gt;NParser&lt;/b&gt;).&lt;br&gt;
&lt;br&gt;
Todos estos nodos que forman las expresiones abstractas al fin al cabo son plantillas
(templates), y podrían a su vez ser clases abstractas, yo opte por una implementarlas
como clases normales. Ya que algunos de los nodos son terminales y otros intermedios
y no tienen por qué ser heredados, de este modo la factoria base (&lt;b&gt;ASTNodeFactoryBase&lt;/b&gt;)
usa miembros virtuales parar crear dichos nodos.&lt;br&gt;
&lt;br&gt;
(diagrama parcial de ASTNodeBase)&lt;br&gt;
&lt;div align="center"&gt;&lt;img src="http://www.ideseg.com/content/binary/yacamlqt_ast.gif" border="0"&gt;
&lt;br&gt;
&lt;/div&gt;
Para crear todos estas expresiones abstractas existe una factoría abstracta (&lt;b&gt;ASTNodeFactoryBase &lt;/b&gt;)
a través de la cual creamos los distintos nodos. Como puede verse, para añadir una
variante como &lt;a href="http://www.codeplex.com/camldotnet"&gt;CAML.Net&lt;/a&gt;, solamente
hay que añadir las expresiones abstractas heredando de las ya existentes e implementando &lt;b&gt;PreCode()&lt;/b&gt; y &lt;b&gt;PostCode()&lt;/b&gt;. 
&lt;br&gt;
&lt;br&gt;
Todos estos nodos que forman las expresiones abstractas al fin al cabo son plantillas
(templates), y podrían a su vez ser clases abstractas, yo opte por una implementarlas
como clases normales, debido a que algunos de los nodos son terminales y otros intermedios
y no tienen por qué ser heredados, de este modo la factoria base (&lt;b&gt;ASTNodeFactoryBase&lt;/b&gt;)
usa miembros virtuales parar crear dichos nodos terminales e intermedios.&lt;br&gt;
&lt;br&gt;
Después para poder inyectar en el parser dichas expresiones debemos crear una nueva
factoría heredada de la factoría base (ASTNodeFactoryBase).&lt;br&gt;
&lt;br&gt;
(diagrama ASTNodeFactoryBase)&lt;br&gt;
&lt;div align="center"&gt;&lt;img src="http://www.ideseg.com/content/binary/yacamlqt_nodefactory.gif" border="0"&gt;
&lt;br&gt;
&lt;/div&gt;
Para generar CAML lo que he hecho es heredar de cada plantilla ó expresión abstracta
definida, una nueva clase que redefine los métodos virtuales &lt;b&gt;PreCode()&lt;/b&gt; y &lt;b&gt;PostCode()&lt;/b&gt; que
son los encargados de sustituir cada nodo del árbol sintáctico en CAML.&lt;br&gt;
&lt;br&gt;
Y crear una factoría (&lt;b&gt;ASTNodeCAMLFactory&lt;/b&gt;) que se encarga de crear las expresiones.&lt;br&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=383b8df3-136d-4735-82b0-a2a2725c42eb" /&gt;</description>
      <comments>http://www.ideseg.com/CommentView,guid,383b8df3-136d-4735-82b0-a2a2725c42eb.aspx</comments>
      <category>CAMLEditor</category>
      <category>NET Development</category>
      <category>SharePoint</category>
    </item>
    <item>
      <trackback:ping>http://www.ideseg.com/Trackback.aspx?guid=f0f7242a-36b2-43bf-ab97-99633ccf0060</trackback:ping>
      <pingback:server>http://www.ideseg.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.ideseg.com/PermaLink,guid,f0f7242a-36b2-43bf-ab97-99633ccf0060.aspx</pingback:target>
      <dc:creator>csegura</dc:creator>
      <wfw:comment>http://www.ideseg.com/CommentView,guid,f0f7242a-36b2-43bf-ab97-99633ccf0060.aspx</wfw:comment>
      <wfw:commentRss>http://www.ideseg.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f0f7242a-36b2-43bf-ab97-99633ccf0060</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Hace un mes, <a href="http://www.johnholliday.net/">John
Holliday</a>, me pidió a ver si podíamos integrar su <a href="http://www.codeplex.com/camldotnet">CAML.net</a> con
mi <b><a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryTool2.aspx">YACAMLQT</a></b>,
a la vez que ampliar mi herramienta para soportar otro tipo de consultas como adds
y updates.<br /><br />
YACAMLQT, es una utilidad que convierte una sentencia SQL en CAML, el lenguaje de
consulta de Sharepoint. (Véase <a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryToolAlaSQL.aspx">YACAMLQT</a>, <a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryTool2.aspx">YACAMLQT</a>2
y <a href="http://www.ideseg.com/SharePointCAMLNetGenial.aspx">YACAMLQT-CAML.Net</a>)<br /><br />
Estos días entre rato bueno y rato malo, he reescrito totalmente el código de YACAMLQT,
para hacerlo más sencillo (por supuesto usando TDD), en principio el objetivo ha sido
emular el antiguo YACAMLQT, pero dotándolo de un diseño más sencillo y ampliable.<br /><br />
YACAMLQT, es un programa que convierte una sintaxis tipo SQL en CAML (el lenguaje
de consulta de SharePoint).<br /><br />
Es decir esto: 
<br /><p class="style1"><font face="Courier New"><font size="2"><font color="#000080"><strong><span class="style2">WHERE</span></strong>((Column1
= "Value1") <span class="style2"><strong>AND</strong></span> (Column2 = "Value2")) <span class="style2"><strong>OR</strong></span> ((Column3
= 10) 
<br /></font></font></font><font face="Courier New"><font size="2"><font color="#000080"><span class="style2"><strong>AND</strong></span> (Column3
&lt;&gt; NULL)) <span class="style2"><strong>GROUPBY</strong></span> Column1 <span class="style2"><strong>ORDERBY</strong></span> Column1,
Column2 <span class="style2"><strong>ASC</strong></span>, Column3 <span class="style2"><strong>DESC</strong></span></font></font></font></p>
En esto:<br /><br /><div class="csharpcode"><pre class="alt"><span class="kwrd">&lt;</span><span class="html">Query</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">Where</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">Or</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">And</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">FieldRef</span><span class="attr">Name</span><span class="kwrd">="Column1"</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">Value</span><span class="attr">Type</span><span class="kwrd">="Text"</span><span class="kwrd">&gt;</span>Value1<span class="kwrd">&lt;/</span><span class="html">Value</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;/</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">FieldRef</span><span class="attr">Name</span><span class="kwrd">="Column2"</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">Value</span><span class="attr">Type</span><span class="kwrd">="Text"</span><span class="kwrd">&gt;</span>Value2<span class="kwrd">&lt;/</span><span class="html">Value</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;/</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;/</span><span class="html">And</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">And</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">FieldRef</span><span class="attr">Name</span><span class="kwrd">="Column3"</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">Value</span><span class="attr">Type</span><span class="kwrd">="Integer"</span><span class="kwrd">&gt;</span>10<span class="kwrd">&lt;/</span><span class="html">Value</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;/</span><span class="html">Eq</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">IsNotNull</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">FieldRef</span><span class="attr">Name</span><span class="kwrd">="Column3"</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;/</span><span class="html">IsNotNull</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;/</span><span class="html">And</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;/</span><span class="html">Or</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;/</span><span class="html">Where</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">GroupBy</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">FieldRef</span><span class="attr">Name</span><span class="kwrd">="Column1"</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;/</span><span class="html">GroupBy</span><span class="kwrd">&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">OrderBy</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">FieldRef</span><span class="attr">Name</span><span class="kwrd">="Column1"</span><span class="kwrd">/&gt;</span></pre><pre><span class="kwrd">&lt;</span><span class="html">FieldRef</span><span class="attr">Name</span><span class="kwrd">="Column2"</span><span class="attr">Ascending</span><span class="kwrd">="True"</span><span class="kwrd">/&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;</span><span class="html">FieldRef</span><span class="attr">Name</span><span class="kwrd">="Column3"</span><span class="attr">Ascending</span><span class="kwrd">="False"</span><span class="kwrd">/&gt;</span></pre><pre><span class="kwrd">&lt;/</span><span class="html">OrderBy</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="kwrd">&lt;/</span><span class="html">Query</span><span class="kwrd">&gt;</span></pre></div><br /><br /><br />
El proyecto completo lo subiré a <b>CodePlex</b> en unos días, con su código fuente
que poco a poco y con ayuda espero ir ampliando.<br /><br />
Por si alguien quiere echar una mano en el proyecto, voy a contar alguno de los entresijos
del diseño de la aplicación.<br /><br />
Lo primero que he diseñado es el analizador morfológico (<i>lexer</i>) que se encarga
de identificar dentro de un string, las distintas unidades sintácticas (<i>tokens</i>)
con las que construiremos un analizador sintáctico y semántico (<i>parser</i>) con
el cual construiremos un árbol sintáctico (<i>AST</i>) que por último recorreremos
para transformar el SQL en CAML u otra variante como CAML.Net.<br /><br />
El lexer, está compuesto por una clase base, <b>ScannerBase </b>que contiene las partes
más básicas del lexer, he extraído esta clase base una vez que tenía el analizador
morfológico completo ya que de esta manera podemos realizar otro tipo de analizadores. 
<br /><br /><img src="http://www.ideseg.com/content/binary/yacamlqt_lexer.gif" border="0" /><br /><br />
Las funciones básicas como comerse los espacios (<b>EatSpaces</b>()), detectar si
es el final de línea (<b>EndOfLine</b>()) , saltar caracteres (<b>SkipChar</b>())
son parte de ScannerBase. Lo más importante de esta clase es la propiedad <b>CurrentChar </b>que
devuelve el último carácter leído y el método <b>GetCharMoveNext</b>(), que obtiene
un carácter y se mueve a la siguiente posición.<br /><br />
Para los que habéis usado el unix <a href="http://es.wikipedia.org/wiki/Herramienta_de_programaci%C3%B3n_lex">flex</a>, <b>GetCharMoveNext</b>()
es similar a <b>input</b>().<br /><br />
Esta clase <b>ScannerBase </b>utiliza internamente una clase <b>ScannerState </b>que
mantiene el estado para poder releer un token ó unidad sintáctica. 
<br /><br />
Los tokens en el caso de YACAMLQT, consisten en las palabras reservadas propias de
SQL, así como los distintos operadores, los campos y los valores (<i>cadena, fecha,
lógico y numérico</i>). 
<br /><br />
A diferencia del unix <a href="http://es.wikipedia.org/wiki/Herramienta_de_programaci%C3%B3n_lex">flex</a>,
esto no se trata de un <b>unput</b>(), ya que mediante este volveríamos al carácter
anterior. En este caso, como lo importante del analizador es obtener una unidad sintáctica,
o token, lo que he hecho es implementar un método llamado <b>BackToken</b>() que lo
que hace es posicionar el lexer justo al comienzo del último token obtenido, de modo
que <b>GetToken</b>() volverá a devolvernos el mismo token.<br /><br />
La clase <b>Scanner</b>, hereda como es de suponer de <b>ScannerBase</b>, e implementa <b>GetToken</b>(),
el responsable de de devolver un token, y <b>CheckCorrectBracketsAndQuotes</b>() que
es el responsable de comprobar que los paréntesis y las comillas están correctamente.<br /><br />
Dentro de la clase <b>Scanner</b>, el método <b>GetToken</b>() es el responsable de
identificar cada uno de los tokens, para lo cual he realizado un método para identificar
cada uno de los distintos tokens. <b>GetToken</b>() usa los métodos <b>ScanDate</b>(), <b>ScanString</b>(), <b>ScanOperator</b>(), <b>ScanNumber</b>()
y <b>ScanReservedWordOrSymbol</b>().<br /><br /><b>ScanOperator</b>() y <b>ScanReservedWordOrSymbol</b>() usan un diccionario para
identificar los distintos operadores y palabras reservadas. En el caso de <b>ScanReservedWordOrSymbol</b>(),
si el token leído no se encuentra en el diccionario de palabras reservadas estaremos
identificando un símbolo ó identificador.<br /><br />
Para terminar con esta primera parte, y siguiendo el principio de responsabilidad
única, se ha implementado la clase <b>Token </b>como un contenedor y <b>TokenFactory </b>como
una factória encargada de crear los distintos tipos de tokens ó unidades sintácticas.
La clase<b> Scanner</b> es la que usa la factória para crear los distintos Tokens.<br /><br /><img src="http://www.ideseg.com/content/binary/yacamlqt_token.gif" border="0" /><br /><br />
La clase <b>Token</b>, puede contener los distintos tipos de tokens, en principio
todos aunque pueden ser de diferentes tipos, mantendrán su valor como un string. El
resto de propiedades para identificar el tipo de token (<b>TType</b>) ó el tipo de
valor (<b>ValueType</b>) son una enumeración.<br /><br /><img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=f0f7242a-36b2-43bf-ab97-99633ccf0060" /></body>
      <title>YACAMLQT (Yet another CAML query tool) Redux (1)</title>
      <guid isPermaLink="false">http://www.ideseg.com/PermaLink,guid,f0f7242a-36b2-43bf-ab97-99633ccf0060.aspx</guid>
      <link>http://www.ideseg.com/YACAMLQTYetAnotherCAMLQueryToolRedux1.aspx</link>
      <pubDate>Mon, 27 Apr 2009 13:26:05 GMT</pubDate>
      <description>Hace un mes, &lt;a href="http://www.johnholliday.net/"&gt;John Holliday&lt;/a&gt;, me pidió a
ver si podíamos integrar su &lt;a href="http://www.codeplex.com/camldotnet"&gt;CAML.net&lt;/a&gt; con
mi &lt;b&gt;&lt;a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryTool2.aspx"&gt;YACAMLQT&lt;/a&gt;&lt;/b&gt;,
a la vez que ampliar mi herramienta para soportar otro tipo de consultas como adds
y updates.&lt;br&gt;
&lt;br&gt;
YACAMLQT, es una utilidad que convierte una sentencia SQL en CAML, el lenguaje de
consulta de Sharepoint. (Véase &lt;a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryToolAlaSQL.aspx"&gt;YACAMLQT&lt;/a&gt;, &lt;a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryTool2.aspx"&gt;YACAMLQT&lt;/a&gt;2
y &lt;a href="http://www.ideseg.com/SharePointCAMLNetGenial.aspx"&gt;YACAMLQT-CAML.Net&lt;/a&gt;)&lt;br&gt;
&lt;br&gt;
Estos días entre rato bueno y rato malo, he reescrito totalmente el código de YACAMLQT,
para hacerlo más sencillo (por supuesto usando TDD), en principio el objetivo ha sido
emular el antiguo YACAMLQT, pero dotándolo de un diseño más sencillo y ampliable.&lt;br&gt;
&lt;br&gt;
YACAMLQT, es un programa que convierte una sintaxis tipo SQL en CAML (el lenguaje
de consulta de SharePoint).&lt;br&gt;
&lt;br&gt;
Es decir esto: 
&lt;br&gt;
&lt;p class="style1"&gt;
&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#000080"&gt;&lt;strong&gt;&lt;span class="style2"&gt;WHERE&lt;/span&gt; &lt;/strong&gt;((Column1
= "Value1") &lt;span class="style2"&gt;&lt;strong&gt;AND&lt;/strong&gt;&lt;/span&gt; (Column2 = "Value2")) &lt;span class="style2"&gt;&lt;strong&gt;OR&lt;/strong&gt;&lt;/span&gt; ((Column3
= 10) 
&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#000080"&gt;&lt;span class="style2"&gt;&lt;strong&gt;AND&lt;/strong&gt;&lt;/span&gt; (Column3
&amp;lt;&amp;gt; NULL)) &lt;span class="style2"&gt;&lt;strong&gt;GROUPBY&lt;/strong&gt;&lt;/span&gt; Column1 &lt;span class="style2"&gt;&lt;strong&gt;ORDERBY&lt;/strong&gt;&lt;/span&gt; Column1,
Column2 &lt;span class="style2"&gt;&lt;strong&gt;ASC&lt;/strong&gt;&lt;/span&gt;, Column3 &lt;span class="style2"&gt;&lt;strong&gt;DESC&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
En esto:&lt;br&gt;
&lt;br&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Query&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Where&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Or&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;And&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Eq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="Column1"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt; &lt;span class="attr"&gt;Type&lt;/span&gt;&lt;span class="kwrd"&gt;="Text"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Value1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Eq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Eq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="Column2"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt; &lt;span class="attr"&gt;Type&lt;/span&gt;&lt;span class="kwrd"&gt;="Text"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Value2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Eq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;And&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;And&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Eq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="Column3"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt; &lt;span class="attr"&gt;Type&lt;/span&gt;&lt;span class="kwrd"&gt;="Integer"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;10&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Eq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;IsNotNull&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="Column3"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;IsNotNull&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;And&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Or&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Where&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;GroupBy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="Column1"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;GroupBy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;OrderBy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="Column1"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="Column2"&lt;/span&gt; &lt;span class="attr"&gt;Ascending&lt;/span&gt;&lt;span class="kwrd"&gt;="True"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="Column3"&lt;/span&gt; &lt;span class="attr"&gt;Ascending&lt;/span&gt;&lt;span class="kwrd"&gt;="False"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;OrderBy&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Query&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
El proyecto completo lo subiré a &lt;b&gt;CodePlex&lt;/b&gt; en unos días, con su código fuente
que poco a poco y con ayuda espero ir ampliando.&lt;br&gt;
&lt;br&gt;
Por si alguien quiere echar una mano en el proyecto, voy a contar alguno de los entresijos
del diseño de la aplicación.&lt;br&gt;
&lt;br&gt;
Lo primero que he diseñado es el analizador morfológico (&lt;i&gt;lexer&lt;/i&gt;) que se encarga
de identificar dentro de un string, las distintas unidades sintácticas (&lt;i&gt;tokens&lt;/i&gt;)
con las que construiremos un analizador sintáctico y semántico (&lt;i&gt;parser&lt;/i&gt;) con
el cual construiremos un árbol sintáctico (&lt;i&gt;AST&lt;/i&gt;) que por último recorreremos
para transformar el SQL en CAML u otra variante como CAML.Net.&lt;br&gt;
&lt;br&gt;
El lexer, está compuesto por una clase base, &lt;b&gt;ScannerBase &lt;/b&gt;que contiene las partes
más básicas del lexer, he extraído esta clase base una vez que tenía el analizador
morfológico completo ya que de esta manera podemos realizar otro tipo de analizadores. 
&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.ideseg.com/content/binary/yacamlqt_lexer.gif" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
Las funciones básicas como comerse los espacios (&lt;b&gt;EatSpaces&lt;/b&gt;()), detectar si
es el final de línea (&lt;b&gt;EndOfLine&lt;/b&gt;()) , saltar caracteres (&lt;b&gt;SkipChar&lt;/b&gt;())
son parte de ScannerBase. Lo más importante de esta clase es la propiedad &lt;b&gt;CurrentChar &lt;/b&gt;que
devuelve el último carácter leído y el método &lt;b&gt;GetCharMoveNext&lt;/b&gt;(), que obtiene
un carácter y se mueve a la siguiente posición.&lt;br&gt;
&lt;br&gt;
Para los que habéis usado el unix &lt;a href="http://es.wikipedia.org/wiki/Herramienta_de_programaci%C3%B3n_lex"&gt;flex&lt;/a&gt;, &lt;b&gt;GetCharMoveNext&lt;/b&gt;()
es similar a &lt;b&gt;input&lt;/b&gt;().&lt;br&gt;
&lt;br&gt;
Esta clase &lt;b&gt;ScannerBase &lt;/b&gt;utiliza internamente una clase &lt;b&gt;ScannerState &lt;/b&gt;que
mantiene el estado para poder releer un token ó unidad sintáctica. 
&lt;br&gt;
&lt;br&gt;
Los tokens en el caso de YACAMLQT, consisten en las palabras reservadas propias de
SQL, así como los distintos operadores, los campos y los valores (&lt;i&gt;cadena, fecha,
lógico y numérico&lt;/i&gt;). 
&lt;br&gt;
&lt;br&gt;
A diferencia del unix &lt;a href="http://es.wikipedia.org/wiki/Herramienta_de_programaci%C3%B3n_lex"&gt;flex&lt;/a&gt;,
esto no se trata de un &lt;b&gt;unput&lt;/b&gt;(), ya que mediante este volveríamos al carácter
anterior. En este caso, como lo importante del analizador es obtener una unidad sintáctica,
o token, lo que he hecho es implementar un método llamado &lt;b&gt;BackToken&lt;/b&gt;() que lo
que hace es posicionar el lexer justo al comienzo del último token obtenido, de modo
que &lt;b&gt;GetToken&lt;/b&gt;() volverá a devolvernos el mismo token.&lt;br&gt;
&lt;br&gt;
La clase &lt;b&gt;Scanner&lt;/b&gt;, hereda como es de suponer de &lt;b&gt;ScannerBase&lt;/b&gt;, e implementa &lt;b&gt;GetToken&lt;/b&gt;(),
el responsable de de devolver un token, y &lt;b&gt;CheckCorrectBracketsAndQuotes&lt;/b&gt;() que
es el responsable de comprobar que los paréntesis y las comillas están correctamente.&lt;br&gt;
&lt;br&gt;
Dentro de la clase &lt;b&gt;Scanner&lt;/b&gt;, el método &lt;b&gt;GetToken&lt;/b&gt;() es el responsable de
identificar cada uno de los tokens, para lo cual he realizado un método para identificar
cada uno de los distintos tokens. &lt;b&gt;GetToken&lt;/b&gt;() usa los métodos &lt;b&gt;ScanDate&lt;/b&gt;(), &lt;b&gt;ScanString&lt;/b&gt;(), &lt;b&gt;ScanOperator&lt;/b&gt;(), &lt;b&gt;ScanNumber&lt;/b&gt;()
y &lt;b&gt;ScanReservedWordOrSymbol&lt;/b&gt;().&lt;br&gt;
&lt;br&gt;
&lt;b&gt;ScanOperator&lt;/b&gt;() y &lt;b&gt;ScanReservedWordOrSymbol&lt;/b&gt;() usan un diccionario para
identificar los distintos operadores y palabras reservadas. En el caso de &lt;b&gt;ScanReservedWordOrSymbol&lt;/b&gt;(),
si el token leído no se encuentra en el diccionario de palabras reservadas estaremos
identificando un símbolo ó identificador.&lt;br&gt;
&lt;br&gt;
Para terminar con esta primera parte, y siguiendo el principio de responsabilidad
única, se ha implementado la clase &lt;b&gt;Token &lt;/b&gt;como un contenedor y &lt;b&gt;TokenFactory &lt;/b&gt;como
una factória encargada de crear los distintos tipos de tokens ó unidades sintácticas.
La clase&lt;b&gt; Scanner&lt;/b&gt; es la que usa la factória para crear los distintos Tokens.&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.ideseg.com/content/binary/yacamlqt_token.gif" border="0"&gt;
&lt;br&gt;
&lt;br&gt;
La clase &lt;b&gt;Token&lt;/b&gt;, puede contener los distintos tipos de tokens, en principio
todos aunque pueden ser de diferentes tipos, mantendrán su valor como un string. El
resto de propiedades para identificar el tipo de token (&lt;b&gt;TType&lt;/b&gt;) ó el tipo de
valor (&lt;b&gt;ValueType&lt;/b&gt;) son una enumeración.&lt;br&gt;
&lt;br&gt;
&lt;img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=f0f7242a-36b2-43bf-ab97-99633ccf0060" /&gt;</description>
      <comments>http://www.ideseg.com/CommentView,guid,f0f7242a-36b2-43bf-ab97-99633ccf0060.aspx</comments>
      <category>CAMLEditor</category>
      <category>NET Development</category>
      <category>SharePoint-es</category>
    </item>
    <item>
      <trackback:ping>http://www.ideseg.com/Trackback.aspx?guid=6c7a84d7-358e-4698-b273-7be8951bfc9a</trackback:ping>
      <pingback:server>http://www.ideseg.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.ideseg.com/PermaLink,guid,6c7a84d7-358e-4698-b273-7be8951bfc9a.aspx</pingback:target>
      <dc:creator>csegura</dc:creator>
      <wfw:comment>http://www.ideseg.com/CommentView,guid,6c7a84d7-358e-4698-b273-7be8951bfc9a.aspx</wfw:comment>
      <wfw:commentRss>http://www.ideseg.com/SyndicationService.asmx/GetEntryCommentsRss?guid=6c7a84d7-358e-4698-b273-7be8951bfc9a</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">Cuando nos enfrentamos al diseño de un
programa sea el que sea, partimos de un estado que podemos llamar “A” problema, y
como es obvio un estado “B” en el que tenemos resuelto el problema, por medio de un
programa.<br /><br />
Si la programación fuera como las matemáticas, cosa que “no es” aunque  se fundamente
en ello; la solución ideal sería la <b>línea recta</b>. Una línea recta que nos lleva
del punto “A” al punto “B”, directamente, sin rodeos. 
<br /><br />
Es la solución más ELEGANTE, por qué es la solución más CLARA y BREVE que se puede
dar. 
<br /><br />
Hay partes de la programación en donde existen uno o varios algoritmos que podemos
usar y que son como la línea recta es decir ya están optimizados y no hay manera de
mejorar (algoritmos de ordenación, búsqueda, etc..) pero cuando hablamos de un sistema
de mayor tamaño, donde se ven involucrados más componentes la cosa cambia.<br /><br />
Existen miles de maneras de llegar de “A” a “B”, podemos hacer tirabuzones, hipérbolas,
curvas mágicas y un sinfín de figuras geométricas que nos llevarán también de “A”
a “B”. <b>Los programadores somos capaces de crear miles y miles de esas formas mágicas.
(Es nuestra naturaleza, como le dijo el escorpión a la rana)</b><br /><br />
De modo que nos enfrentamos a un problema doble, llegar del punto “A”, problema, al
punto “B”, programa  sin morir en el intento. Y hacerlo de la manera más ELEGANTE.<br /><br />
No hace mucho, hablaba Rodrigo, del “<a href="http://geeks.ms/blogs/rcorral/archive/2009/03/23/ya-ya-keep-it-simple-stupid-191-pero-c-243-mo.aspx">Principio
KISS</a>” y del “Divide y Vencerás”, este último es sin duda la práctica que seguimos
todos los programadores desde que tenemos conocimiento de nosotros mismos, es decir
de que somos eso “<a href="http://www.ideseg.com/VenenoEnLosDedos.aspx">Programadores</a>”. 
<br />
 <br />
Debemos resolver un problema, es decir crear un programa “B”, que resuelva “A”, y
hay miles de soluciones ó caminos posibles que nos llevarán de “A” a “B”. 
<br /><br />
Nosotros no disponemos de un algoritmo determinado, de una solución magistral como
la ecuación de la recta que pasa por dos puntos, <b>cada programador es un mundo</b> y
su percepción tanto del problema como del modo de llegar a la solución (diseño) podemos
decir que es casi única, cuya aproximación es inversamente proporcional a la complejidad
del problema.<br /><br />
A un problema más sencillo, hay más posibilidades de que dos programadores sigan el
mismo camino, a un problema más complejo la desviación entre las soluciones tiende
a distar más.<br /><br />
No existe la certeza de que nuestra solución sea la más optima, clara y concisa y
lo que es peor tampoco podemos medir desviación alguna, puesto que cuanto más complejo
es el programa más variantes tiene y por ende para poder medir dicha desviación, deberíamos
conocer la línea recta, cosa que a priori es imposible.<br /><br />
Partiendo como base de que la línea recta sería la solución “perfecta” del problema,
tenemos una complicada tarea.<br /><br />
Pero por otro lado una línea no es más que una sucesión de puntos, de modo, que podemos
interpretar cada punto como una parte de la solución, y aquí volvemos al “Divide y
Vencerás”.<br /><br />
Gracias a que tenemos técnicas como el TDD o ATDD, podemos ir punto por punto trazando
nuestra línea. 
<br /><br /><b>“Solo escribimos el código necesario para pasar la prueba”, esta frase que resume
en esencia que es “Test Driven Development”, también es la mejor manera que conozco
de ir<u> punto por punto</u> trazando la solución de “A” a “B”, siguiendo esa imaginaría
línea recta que sería la solución más ELEGANTE, CLARA y BREVE que se puede dar.<br /></b><br /><br /><br /><p></p><img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=6c7a84d7-358e-4698-b273-7be8951bfc9a" /></body>
      <title>Mi particular visión del Test Driven Development (TDD)</title>
      <guid isPermaLink="false">http://www.ideseg.com/PermaLink,guid,6c7a84d7-358e-4698-b273-7be8951bfc9a.aspx</guid>
      <link>http://www.ideseg.com/MiParticularVisi%c3%b3nDelTestDrivenDevelopmentTDD.aspx</link>
      <pubDate>Sun, 19 Apr 2009 19:06:23 GMT</pubDate>
      <description>Cuando nos enfrentamos al diseño de un programa sea el que sea, partimos de un estado que podemos llamar “A” problema, y como es obvio un estado “B” en el que tenemos resuelto el problema, por medio de un programa.&lt;br&gt;
&lt;br&gt;
Si la programación fuera como las matemáticas, cosa que “no es” aunque&amp;nbsp; se fundamente
en ello; la solución ideal sería la &lt;b&gt;línea recta&lt;/b&gt;. Una línea recta que nos lleva
del punto “A” al punto “B”, directamente, sin rodeos. 
&lt;br&gt;
&lt;br&gt;
Es la solución más ELEGANTE, por qué es la solución más CLARA y BREVE que se puede
dar. 
&lt;br&gt;
&lt;br&gt;
Hay partes de la programación en donde existen uno o varios algoritmos que podemos
usar y que son como la línea recta es decir ya están optimizados y no hay manera de
mejorar (algoritmos de ordenación, búsqueda, etc..) pero cuando hablamos de un sistema
de mayor tamaño, donde se ven involucrados más componentes la cosa cambia.&lt;br&gt;
&lt;br&gt;
Existen miles de maneras de llegar de “A” a “B”, podemos hacer tirabuzones, hipérbolas,
curvas mágicas y un sinfín de figuras geométricas que nos llevarán también de “A”
a “B”. &lt;b&gt;Los programadores somos capaces de crear miles y miles de esas formas mágicas.
(Es nuestra naturaleza, como le dijo el escorpión a la rana)&lt;/b&gt;
&lt;br&gt;
&lt;br&gt;
De modo que nos enfrentamos a un problema doble, llegar del punto “A”, problema, al
punto “B”, programa&amp;nbsp; sin morir en el intento. Y hacerlo de la manera más ELEGANTE.&lt;br&gt;
&lt;br&gt;
No hace mucho, hablaba Rodrigo, del “&lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/03/23/ya-ya-keep-it-simple-stupid-191-pero-c-243-mo.aspx"&gt;Principio
KISS&lt;/a&gt;” y del “Divide y Vencerás”, este último es sin duda la práctica que seguimos
todos los programadores desde que tenemos conocimiento de nosotros mismos, es decir
de que somos eso “&lt;a href="http://www.ideseg.com/VenenoEnLosDedos.aspx"&gt;Programadores&lt;/a&gt;”. 
&lt;br&gt;
&amp;nbsp;&lt;br&gt;
Debemos resolver un problema, es decir crear un programa “B”, que resuelva “A”, y
hay miles de soluciones ó caminos posibles que nos llevarán de “A” a “B”. 
&lt;br&gt;
&lt;br&gt;
Nosotros no disponemos de un algoritmo determinado, de una solución magistral como
la ecuación de la recta que pasa por dos puntos, &lt;b&gt;cada programador es un mundo&lt;/b&gt; y
su percepción tanto del problema como del modo de llegar a la solución (diseño) podemos
decir que es casi única, cuya aproximación es inversamente proporcional a la complejidad
del problema.&lt;br&gt;
&lt;br&gt;
A un problema más sencillo, hay más posibilidades de que dos programadores sigan el
mismo camino, a un problema más complejo la desviación entre las soluciones tiende
a distar más.&lt;br&gt;
&lt;br&gt;
No existe la certeza de que nuestra solución sea la más optima, clara y concisa y
lo que es peor tampoco podemos medir desviación alguna, puesto que cuanto más complejo
es el programa más variantes tiene y por ende para poder medir dicha desviación, deberíamos
conocer la línea recta, cosa que a priori es imposible.&lt;br&gt;
&lt;br&gt;
Partiendo como base de que la línea recta sería la solución “perfecta” del problema,
tenemos una complicada tarea.&lt;br&gt;
&lt;br&gt;
Pero por otro lado una línea no es más que una sucesión de puntos, de modo, que podemos
interpretar cada punto como una parte de la solución, y aquí volvemos al “Divide y
Vencerás”.&lt;br&gt;
&lt;br&gt;
Gracias a que tenemos técnicas como el TDD o ATDD, podemos ir punto por punto trazando
nuestra línea. 
&lt;br&gt;
&lt;br&gt;
&lt;b&gt;“Solo escribimos el código necesario para pasar la prueba”, esta frase que resume
en esencia que es “Test Driven Development”, también es la mejor manera que conozco
de ir&lt;u&gt; punto por punto&lt;/u&gt; trazando la solución de “A” a “B”, siguiendo esa imaginaría
línea recta que sería la solución más ELEGANTE, CLARA y BREVE que se puede dar.&lt;br&gt;
&lt;/b&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.ideseg.com/aggbug.ashx?id=6c7a84d7-358e-4698-b273-7be8951bfc9a" /&gt;</description>
      <comments>http://www.ideseg.com/CommentView,guid,6c7a84d7-358e-4698-b273-7be8951bfc9a.aspx</comments>
      <category>NET Development</category>
    </item>
  </channel>
</rss>