<?xml version="1.0"?>
     <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
     <channel>
      <link>http://www.bitacora.gesbit.com/</link>
      <title>Bitácora de Gesbit - Entrada "Preparando la respuesta al usuario" de la bitácora</title>
      <generator>Gesbit</generator>
      <description>Bitácora del gestor de bitácoras Gesbit</description>
      <atom:link href="http://www.bitacora.gesbit.com/rss/" rel="self"
       type="application/rss+xml" />
    
      <item>
       <link>http://www.bitacora.gesbit.com/preparando-la-respuesta-al-usuario/</link>
       <guid>http://www.bitacora.gesbit.com/preparando-la-respuesta-al-usuario/</guid>
       <pubDate>Tue, 12 Feb 2008 10:11:07 +0100</pubDate>
       <title><![CDATA[ Preparando la respuesta al usuario ]]></title>
       <description><![CDATA[<p>
He hecho algunos cambios en el método "PrepareResponse()" de la clase "FrontEnd" un poco a vuela pluma, utilizando cierta intuición más o menos acertada, ¡o tal vez porque simplemente me aburría y no tenía otra cosa que hacer! Lo que sería grave.
</p>
<p>Veamos el método "PrepareResponse()" antes de los cambios y comentemos luego qué me ha hecho llevar a cabo dichos cambios.</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> PrepareResponse<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
  <a href="http://www.php.net/global"><span style="color: #000066;">global</span></a> <span style="color: #0000ff;">$query</span>, <span style="color: #0000ff;">$themes</span>;
  <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">InitializeQuery</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">SendHttpHeaders</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsTrackBack</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$trackBack</span> = <span style="color: #000000; font-weight: bold;">new</span> TrackBack<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsRssFeed</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$rssFeed</span> = <span style="color: #000000; font-weight: bold;">new</span> GbRssFeed<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsIndex</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$themes</span>-&gt;<span style="color: #006600;">RequireIndexScript</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsPage</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$themes</span>-&gt;<span style="color: #006600;">RequirePageScript</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsSingle</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$themes</span>-&gt;<span style="color: #006600;">RequireSingleScript</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsArchive</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$themes</span>-&gt;<span style="color: #006600;">RequireArchiveScript</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">Is404Error</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$themes</span>-&gt;<span style="color: #006600;">Require404ErrorScript</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>
<p>Lo primero que puede verse es el uso de las variables "$trackBack" y "$rssFeed", o, por mejor decir, su "no uso". De de modo que podríamos ahorrárnoslas y retornar directamente los objectos correspondientes. Ahora bien, veamos ahora el método "PrepareResponse()" tal y como ha quedado de momento.</p><div class="gbhighlighcode"><div class="sourcecode"><pre class="php"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> PrepareResponse<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
  <a href="http://www.php.net/global"><span style="color: #000066;">global</span></a> <span style="color: #0000ff;">$query</span>, <span style="color: #0000ff;">$themes</span>;
  <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">InitializeQuery</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">SendHttpHeaders</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsNeedTheme</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$themes</span>-&gt;<span style="color: #006600;">MainRequire</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsRssFeed</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> GbRssFeed<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">elseif</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$query</span>-&gt;<span style="color: #006600;">IsTrackBack</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> TrackBack<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// FIXME: Really need this? Why?</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> GbError<span style="color: #66cc66;">&#40;</span>_r<span style="color: #66cc66;">&#40;</span>
      <span style="color: #ff0000;">'Fatal error: unknown request type'</span>
    <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;    	
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>
<p>Como puede verse, se han quitado del medio las variables que realmente no se utilizaban, pero, además, observarás cosas nuevas. He pensado (¡oh prodigio!) en que podría usar un método (nuevo) de la clase "Themes" para requerir los distintos "scripts" en función de la petición del usuario.</p>

<p>Pero, no quería dejarlo todo a la clase "Themes", entre otras cosas, porque en los "Trackbacks" y "Feeds" la clase "Themes" no tiene nada que hacer. Así que he añadido un método a la clase "Query", que puede determinar si la petición del usuario necesita temas o no.</p>
<p>Efectivamente, con "IsNeedTheme()" puedo determinar si la clase "Theme" tiene que entrar en acción, y, si es así, dejo ya a esta clase que se encargue de requerir el "script" correspondiente, mediante otro nuevo método "MainRequire()". De hecho tiene lógica, porque, efectivamente, los temas tienen lo que podría llamarse "scripts" "principales" y otros "secundarios".</p>
<p>Pero el método "PrepareResponse()" continuará adelante en caso de que la petición de usuario no requira de tema alguno, puesto que puede tratarse de una petición de "TrackBack" o de la petición de un "Feed RSS". Si esto es así el método "PrepareResponse()" se limita a retornar un objeto de la clase correspondiente. El propio constructor de las clases ponen en marcha el proceso que es menester en su caso.</p>
<p>Y hay una cosa nueva más en esta nueva implementación del método "PrepareResponse()" de la clase "FrontEnd": la posibilidad de llegar a un error "fatal", en caso de que no pueda determinarse si la petición del usuario necesita temas, es un "Trackback" o un "Feed RSS". Nótese el "FIXME", sin embargo, y es que no estoy nada seguro de que nunca vaya a llegarse ahí.</p>
<p>Sin embargo, creo que no está del todo mal tener en cuenta que "algo" puede ir mal, cosa que no podía conocerse en la anterior implementación del método "PrepareResponse()". Por otro lado, tengo mis dudas de que no sea la propia clase "Query" (tal vez su hija "GbQuery") la que debiera dar la oportuna respuesta al usuario.</p>
<p>Pero, con esta última idea, estoy echando por tierra a la clase "FrontEnd", es decir, ¿debería ser esta sustituida por la propia clase "Query" o "GbQuery" implementando esta los métodos oportunos? Ya veremos.</p>
<p>Lo cierto es que ahora creo que no, que debe ser así, que la clase "FrontEnd" tiene su razón de ser y que el trabajo que esta toma (que no está sólo en su método "PrepareResponse()") no debe recaer en otra clase, ni siquiera en la clase "GbQuery", como me pueda parecer.</p>
<p>
<strong>Actualización:</strong> He escrito <a href="http://www.bitacora.gesbit.com/error-al-procesar-la-peticion-http/" title="Entrada en esta bitácora">otra entrada</a> que se relaciona con esta.
</p>]]></description>
      </item>
      
     </channel>
    </rss>