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

<channel>
	<title>Juanma Santoyo &#187; programación</title>
	<atom:link href="http://www.juanmasantoyo.es/index.php/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.juanmasantoyo.es</link>
	<description>En ocasiones me llaman friki</description>
	<lastBuildDate>Thu, 19 Jan 2012 06:33:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Detección y gestión de contactos en una Surface</title>
		<link>http://www.juanmasantoyo.es/index.php/2010/09/22/deteccion-y-gestion-de-contactos-en-una-surface/</link>
		<comments>http://www.juanmasantoyo.es/index.php/2010/09/22/deteccion-y-gestion-de-contactos-en-una-surface/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 17:55:16 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[surface]]></category>

		<guid isPermaLink="false">http://www.juanmasantoyo.es/?p=508</guid>
		<description><![CDATA[A estas alturas de la película, uno ya debería tener claro que la base de las entradas de usuario en una Surface son los contactos. Da igual si tocamos la pantalla con un dedo o con toda la mano, con &#8230; <a href="http://www.juanmasantoyo.es/index.php/2010/09/22/deteccion-y-gestion-de-contactos-en-una-surface/">Seguir leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A estas alturas de la película, uno ya debería tener claro que la base de las entradas de usuario en una Surface son los contactos.</p>
<p>Da igual si tocamos la pantalla con un dedo o con toda la mano, con un trozo de madera; o si hemos colocado un elemento etiquetado: Todo se reduce a detectar un contacto y gestionarlo.</p>
<p>Por lo tanto, se podría decir que hay varios tipos de contactos. En este artículo vamos a ver qué tipos de contactos hay, cómo podemos detectarlos, y cómo podemos obtener información relevante sobre los mismos. No es un asunto complicado, pero sí es bastante amplio. A modo de resumen, en el artículo vamos a tratar los siguientes puntos:</p>
<ol>
<li>Tipos de contactos.</li>
<li>Reconocimiento de contactos.</li>
<li>Diferenciación de contactos.</li>
<li>Reconocer el mismo contacto en diferentes eventos.</li>
<li>Conocer los diferentes contactos que existen sobre un elemento.</li>
</ol>
<p><span id="more-508"></span></p>
<h3>Tipos de contactos.</h3>
<p>Básicamente, podemos considerar tres tipos diferentes de contactos:</p>
<h4>Dedos.</h4>
<p>La mayoría de contactos son dedos, ya que para el usuario, lo más natural y intuitivo casi siempre será hacer algo con el dedo sobre la pantalla.</p>
<h4>Etiquetas.</h4>
<p>Una de las características más interesantes de una Surface es la detección de etiquetas. Las etiquetas son unos gráficos que al entrar en contacto con la pantalla son reconocidos como tales y tienen un valor numérico determinado.</p>
<p>Existen dos tipos de etiquetas: Las <em>Byte Tags</em> y las <em>Identity Tags</em>. La principal diferencia entre ambas es que las <em>Byte Tags</em> pueden tomar 2<sup>8</sup> valores distintos, y los <em>Identity Tags</em> pueden tomar 2<sup>128</sup> valores diferentes (separados en dos campos de 2<sup>64</sup> y 2<sup>64</sup>).</p>
<div id="attachment_510" class="wp-caption aligncenter" style="width: 81px"><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/09/ByteTagC6.jpg"><img class="size-full wp-image-510" title="Byte Tag" src="http://www.juanmasantoyo.es/wp-content/uploads/2010/09/ByteTagC6.jpg" alt="Byte Tag" width="71" height="71" /></a><p class="wp-caption-text">Un Byte Tag</p></div>
<div id="attachment_511" class="wp-caption aligncenter" style="width: 118px"><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/09/IdentityTag.png"><img class="size-full wp-image-511" title="Identity Tag" src="http://www.juanmasantoyo.es/wp-content/uploads/2010/09/IdentityTag.png" alt="Identity Tag" width="108" height="109" /></a><p class="wp-caption-text">Un Identity Tag</p></div>
<h4>Objetos.</h4>
<p>En realidad, la Surface reacciona ante cualquier contacto sobre la pantalla, sea lo que sea. Puede ser el dorso de la mano, un trozo de madera, etc. Por lo tanto, catalogaremos como un &#8220;objeto&#8221; cualquier contacto que no sea ni un dedo ni una etiqueta.</p>
<h3>Reconocer contactos sobre un elemento.</h3>
<p>Reconocer los contactos sobre un elemento es relativamente sencillo. El propio SDK nos aporta eventos como &#8220;<em>ContactDown</em>&#8220;, &#8220;<em>ContactUp</em>&#8221; o &#8220;<em>ContactTapGesture</em>&#8221; que nos realizaran dicha tarea. De hecho, &#8220;<em>ContactDown</em>&#8221; nos servirá en la mayoría de las ocasiones.</p>
<p>Lo que sí requiere más conocimiento del tema es cómo diferenciar los diferentes tipos de contactos, y cómo obtener información relevante sobre cada uno.</p>
<p>Veamos un ejemplo sencillo de &#8220;<em>ContactDown</em>&#8220;. Por ejemplo, sobre un control de usuario que tengamos en pantalla.</p>
<p>Añadiremos la gestión del evento en el <em>XAML</em> del Control de usuario:</p>
<pre class="brush:xml">&lt;s:SurfaceUserControl x:Class="DeteccionDeContactos.MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:s="http://schemas.microsoft.com/surface/2008"

    ContactDown="SurfaceUserControl_ContactDown"
    Width="100" Height="100"
&gt;
    &lt;Grid Background="Red"&gt;

    &lt;/Grid&gt;
&lt;/s:SurfaceUserControl&gt;</pre>
<p>Y esto nos generará en el código <em>C#</em> un método como este:</p>
<pre class="brush:csharp">private void SurfaceUserControl_ContactDown(object sender, ContactEventArgs e)
{
}</pre>
<p>Podéis ver que por parámetro nos llegan dos objetos. Uno es el objeto <em>sender</em>, que no es más que el control de usuario que ha recogido el evento &#8220;<em>ContactDown</em>&#8220;. Por otra parte, nos llega el objeto <em>e</em>. Es un objeto del tipo &#8220;<em>ContactEventArgs</em>&#8220;, y contiene mucha información que nos puede interesar.</p>
<h3>Obtener información útil sobre los contactos.</h3>
<p>Antes de nada, vamos a ver cómo podemos saber qué tipo de contacto es. En realidad es sencillo, ya que las propiedades <em>e.Contact.IsContactRecognized</em> y <em>e.Contact.IsTagRecognized </em>nos lo revelarán:</p>
<pre class="brush:csharp">private void SurfaceUserControl_ContactDown(object sender, ContactEventArgs e)
{
    if (e.Contact.IsFingerRecognized)
    {
        Debug.WriteLine("Es un dedo.");
    }
    else if (e.Contact.IsTagRecognized)
    {
        Debug.WriteLine("Es un elemento etiquetado.");
    }
    else
    {
        Debug.WriteLine("Es un objeto.");
    }
}</pre>
<p>Ahora bien: ¿Más cosas que nos puedan interesar? Pues dependerá del tipo de contacto, obviamente. En general, algo que tienen en común todos los contactos es una posición en pantalla y una orientación (recordemos que una de las más geniales características de una Surface es poder detectar la orientación de un contacto). Nos lo dirán los métodos <em>e.Contact.GetPosition</em> y <em>e.Contact.GetOrientation</em>. Ambos métodos reciben por parámetro un elemento respecto al que orientarse. Lo más común es orientarse respecto al objeto que capturó el método, así que el parámetro <em>sender</em> que mencioné antes nos viene de perlas. El objeto <em>sender</em> en principio viene tipado como un objeto genérico, así que habrá que hacerle un casting. No debería ser un problema si tenemos claro quien lanzó el evento.</p>
<pre class="brush:csharp">private void SurfaceUserControl_ContactDown(object sender, ContactEventArgs e)
{
    MyUserControl uc = (MyUserControl) sender;

    Point position = e.GetPosition(uc);
    Double orientation = e.Contact.GetOrientation(uc);

    Debug.WriteLine("El contacto se ha producido en la posición: {0}, {1}.", position.X, position.Y);
    Debug.WriteLine("La orientación del contacto es de {0} grados.", orientation);

    if (e.Contact.IsFingerRecognized)
    {
        Debug.WriteLine("Es un dedo.");
    }
    else if (e.Contact.IsTagRecognized)
    {
        Debug.WriteLine("Es un elemento etiquetado.");
    }
    else
    {
        Debug.WriteLine("Es un objeto.");
    }
}</pre>
<p>Bueno, ya sabemos dónde se produjo el contacto, y sabemos también su orientación. Si el contacto fuese un dedo, no necesitamos saber más. Pero ¿Y si es un objeto etiquetado? Hay dos parámetros importantísimos que nos interesará conocer: el tipo de etiqueta y su valor. Conviene anticipar que si el contacto es de tipo <em>Identity</em>, el valor se separa en dos campos: la serie y el valor. La serie son los primeros 2<sup>64</sup> bits, el valor son los últimos 2<sup>64</sup> bits. Debemos considerar el objeto <em>e.Contacts.Tag</em> y sus propiedades.</p>
<pre class="brush:csharp">private void SurfaceUserControl_ContactDown(object sender, ContactEventArgs e)
{
    MyUserControl uc = (MyUserControl) sender;

    Point position = e.GetPosition(uc);
    Double orientation = e.Contact.GetOrientation(uc);

    Debug.WriteLine("El contacto se ha producido en la posición: {0}, {1}.", position.X, position.Y);
    Debug.WriteLine("La orientación del contacto es de {0} grados.", orientation);

    if (e.Contact.IsFingerRecognized)
    {
        Debug.WriteLine("Es un dedo.");
    }
    else if (e.Contact.IsTagRecognized)
    {
        Debug.WriteLine("Es un elemento etiquetado.");

        switch (e.Contact.Tag.Type)
        {
            case TagType.Byte:

                Byte byteTagValue = e.Contact.Tag.Byte.Value;

                Debug.WriteLine("Es un Byte Tag. Su valor es {0}.", byteTagValue);
                break;

            case TagType.Identity:

                long serie = e.Contact.Tag.Identity.Series;
                long identityTagValue = e.Contact.Tag.Identity.Value;

                Debug.WriteLine("Es un Identity Tag. Su serie es: {0}. Su valor es {1}.", serie, identityTagValue);
                break;
        }
    }
    else
    {
        Debug.WriteLine("Es un objeto.");
    }
}</pre>
<p>Por último, si el contacto es un objeto cualquiera, nos interesará saber su forma y el área que ocupa. El propio SDK nos ayuda creando un objeto <em>Ellipse</em> que tiene la forma aproximada del contacto. Nosotros podemos saber dónde está el centro del elipse, cuál es su tamaño y incluso el área exacta del objeto que toca la pantalla. Debemos observar los métodos <em>e.Contact.GetEllipse</em>,  <em>e.Contact.GetCenterPosition</em>, y la propiedad <em>e.Contact.PhysicalArea</em>. Los métodos para obtener los valores de la elipse también reciben por parámetro el objeto respecto al que deben calcularse. Igual que antes, lo normal sería usar el parámetro <em>sender</em>.</p>
<pre class="brush:csharp">private void SurfaceUserControl_ContactDown(object sender, ContactEventArgs e)
{
    MyUserControl uc = (MyUserControl) sender;

    Point position = e.GetPosition(uc);
    Double orientation = e.Contact.GetOrientation(uc);

    Debug.WriteLine("El contacto se ha producido en la posición: {0}, {1}.", position.X, position.Y);
    Debug.WriteLine("La orientación del contacto es de {0} grados.", orientation);

    if (e.Contact.IsFingerRecognized)
    {
        Debug.WriteLine("Es un dedo.");
    }
    else if (e.Contact.IsTagRecognized)
    {
        Debug.WriteLine("Es un elemento etiquetado.");

        switch (e.Contact.Tag.Type)
        {
            case TagType.Byte:

                Byte byteTagValue = e.Contact.Tag.Byte.Value;

                Debug.WriteLine("Es un Byte Tag. Su valor es {0}.", byteTagValue);
                break;

            case TagType.Identity:

                long serie = e.Contact.Tag.Identity.Series;
                long identityTagValue = e.Contact.Tag.Identity.Value;

                Debug.WriteLine("Es un Identity Tag. Su serie es: {0}. Su valor es {1}.", serie, identityTagValue);
                break;
        }
    }
    else
    {
        Double area = e.Contact.PhysicalArea;
        Ellipse ellipse = e.Contact.GetEllipse(uc);
        Point ellipseCenter = e.Contact.GetCenterPosition(uc);

        Debug.WriteLine("Es un objeto.");
        Debug.WriteLine("La elipse aproximada que contiene el contacto es ancho: {0}, alto: {1}", ellipse.Width, ellipse.Height);
        Debug.WriteLine("El punto central de la elipse es: {0}, {1}", ellipseCenter.X, ellipseCenter.Y);
    }
}</pre>
<h3>Reconocer el mismo contacto en diferentes eventos.</h3>
<p>Los contactos en realidad disparan más de un evento. Por ejemplo, un mismo contacto primero genera un &#8220;<em>ContactDown</em>&#8221; y por último generará un &#8220;<em>ContactUp</em>&#8220;. Entonces, ¿Cómo saber que son el mismo?. Para ello usaremos la propiedad<em> e.Contact.Id</em>. El mismo contacto, en diferentes eventos; conservará el mismo Id.</p>
<h3>Conocer los diferentes contactos sobre un elemento.</h3>
<p>Y para acabar, algo que también nos puede ser de utilidad es conocer los diferentes contactos que hay sobre un elemento. Para ello, podemos usar la propiedad <em>ContactsOver</em> que nos proporcionan los controles de usuario. Esto es una lista de objetos <em>Contact</em>, por lo que a cada elemento se le podrían aplicar todas las propiedades y métodos vistos en este artículo.</p>
<h3>Hemos acabado.</h3>
<p>Bueno, acabamos de pegar un buen repaso a los contactos de Surface. Dejo la descarga a un ejemplo que desarrollé para escribir este artículo.</p>
<p><a href="http://www.juanmasantoyo.es/wp-content/uploads/2010/09/DeteccionDeContactos.zip">Deteccion de contactos (VS 2010)</a></p>
<p>El contenido de este artículo debería ser suficiente para que cualquier hombre de bien desarrolle aplicaciones bastante decentes para Microsoft Surface, pero el que tenga dudas o necesite más información sobre algún aspecto que no dude en comentarlo por aquí. Yo mismo sigo aprendiendo sobre el tema, así que cualquier ayuda que os pueda prestar también me ayuda a mí.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanmasantoyo.es/index.php/2010/09/22/deteccion-y-gestion-de-contactos-en-una-surface/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Olor de código</title>
		<link>http://www.juanmasantoyo.es/index.php/2008/12/05/olor-de-codigo/</link>
		<comments>http://www.juanmasantoyo.es/index.php/2008/12/05/olor-de-codigo/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 00:02:30 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[olor de codigo]]></category>

		<guid isPermaLink="false">http://www.juanmasantoyo.es/index.php/2008/12/05/olor-de-codigo/</guid>
		<description><![CDATA[Los programadores solemos cometer dos errores:

El primero, pensar que con echar un simple vistazo a un código podemos determinar si es o no es un buen código.

El segundo, pensar que lo anterior es un error.

En realidad, la primera impresión de un código es bastante válida. Cuando un código no nos convence a primera vista, es por que despide un "olor" poco convincente. Lo que vengo a decir, es que esto del olor de código existe y <a href="http://en.wikipedia.org/wiki/Code_smell">está mas o menos documentado</a>. Sin embargo, no he encontrado nada en español sobre el tema, así que vamos allá. <a href="http://www.juanmasantoyo.es/index.php/2008/12/05/olor-de-codigo/">Seguir leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Los programadores solemos cometer dos errores:</p>
<p>El primero, pensar que con echar un simple vistazo a un código podemos determinar si es o no es un buen código.</p>
<p>El segundo, pensar que lo anterior es un error.</p>
<p>En realidad, la primera impresión de un código es bastante válida. Cuando un código no nos convence a primera vista, es por que despide un &#8220;olor&#8221; poco convincente. Lo que vengo a decir, es que esto del olor de código existe y <a href="http://en.wikipedia.org/wiki/Code_smell">está mas o menos documentado</a>. Sin embargo, no he encontrado nada en español sobre el tema, así que vamos allá:<br />
<span id="more-81"></span><br />
¿Qué cosas provocan mal olor en nuestro código y como solucionarlas?</p>
<ul>
<li><strong>Código duplicado.</strong> A primera vista ya podemos ver trozos de código demasiado parecidos. Probablemente deberíamos encontrar una forma de compartir ese código para no repetirlo por todo nuestro programa.</li>
<li><strong>Métodos demasiado largos.</strong> Cuando un método es demasiado largo, lo más seguro es que debamos dividirlo en más métodos más básicos. Eso hará nuestro código más comprensible y más sencillo de arreglar cuando falle (porque creeme, fallará).</li>
<li><strong>Clases demasiado largas.</strong> Un poco en la misma linea que lo anterior, es posible que necesites abstraer un poco más tu código, y dividir una clase en varias clases pequeñas.</li>
<li><strong>Envidia de características.</strong> Lo mismo te digo una cosa que te digo otra. Si notamos que una de nuestras clases usa excesívamente los métodos de otra, merece la pena cosiderar si realmente esas dos clases deberían estar separadas.</li>
<li><strong>Intimidad inapropiada.</strong> Una clase no debería depender de otras clases en según que aspectos de implementación críticos. Las clases deberían ser reutilizables y independientes. En estas situaciones tambien deberíamos plantearnos la fusión de las dos clases.</li>
<li><strong>Rechazo del legado.</strong> Una clase que sobreescribe un método heredado debería respetar el propósito inicial del método. Con esto quiero decir que no es lógico ni aceptable que un método que calcule raízes cuadradas se sobreescriba con un método que elimine acentos en una cadena de texto. No tienen nada que ver el uno con el otro. La pregunta que deberíamos hacernos ahora es: ¿realmente esta clase debería tener este padre y no otro?. Recordemos que la composición siempre es una solución válida.</li>
<li><strong>Clases perezosas.</strong> Hemos hablado de clases demasiado largas, pero ¿y las clases demasiado cortas?. Puede que debamos integrar su funcionalidad en otra clase.</li>
<li><strong>Métodos duplicados.</strong> ¿Realmente necesitamos ese método para elevar al cubo teniendo este que eleva al cuadrado?. Mucho mejor si hacemos un método capaz de elevar a n. Debemos evitar tener varios métodos con funcionalidades parecidas y buscar más métodos configurables con parámetros.</li>
<li><strong>Complejidad artificial.</strong> ¿Estamos ante un problema complicado o nosotros lo hemos vuelto complicado?. No tiene sentido forzar, por ejemplo, el uso de complejos <a href="http://es.wikipedia.org/wiki/Patrones_de_dise%C3%B1o">patrones de diseño</a> en problemas que realmente son tan sencillos que no los requieren.</li>
</ul>
<p>Estas son algunas fuentes potenciales de problemas que podemos llegar a tener y que son fáciles de ver con un vistazo simple al código. El código puede, y debe; ser bonito.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanmasantoyo.es/index.php/2008/12/05/olor-de-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programar orientado a objetos</title>
		<link>http://www.juanmasantoyo.es/index.php/2007/07/04/programar-orientado-a-objetos/</link>
		<comments>http://www.juanmasantoyo.es/index.php/2007/07/04/programar-orientado-a-objetos/#comments</comments>
		<pubDate>Tue, 03 Jul 2007 22:07:24 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.juanmasantoyo.es/?p=38</guid>
		<description><![CDATA[Cuando programamos una clase, o un conjunto de ellas; es habitual considerar que esa clase no tiene porqué ser específica de un proyecto. En ocasiones debe ser así, pero en otras no es necesario.

Concretamente, puedes dotar una clase de la habilidad de obtener o transformar (o obtener y transformar) datos, o puedes dotarla de la habilidad de aplicar esos datos en el nivel más superior del proyecto. Ejemplificando: Puedes hacer una clase que se encargue de obtener datos de una base de datos, pero se debería programar otra clase con la intención de mostrar esos datos en pantalla. He visto códigos donde las clases tienen métodos para obtener y tratar información, y métodos distintos para aplicarla. Tampoco es una mala opción. Quizás un poco incómoda, pero también funcional. <a href="http://www.juanmasantoyo.es/index.php/2007/07/04/programar-orientado-a-objetos/">Seguir leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Cuando programamos una clase, o un conjunto de ellas; es habitual considerar que esa clase no tiene porqué ser específica de un proyecto. En ocasiones debe ser así, pero en otras no es necesario.</p>
<p>Concretamente, puedes dotar una clase de la habilidad de obtener o transformar (o obtener y transformar) datos, o puedes dotarla de la habilidad de aplicar esos datos en el nivel más superior del proyecto. Ejemplificando: Puedes hacer una clase que se encargue de obtener datos de una base de datos, pero se debería programar otra clase con la intención de mostrar esos datos en pantalla. He visto códigos donde las clases tienen métodos para obtener y tratar información, y métodos distintos para aplicarla. Tampoco es una mala opción. Quizás un poco incómoda, pero también funcional.<br />
<span id="more-38"></span><br />
Pero lo que no debe suceder nunca, es que un único método se encargue de obtener la información y de aplicarla. Podría pensarse que es más cómodo, y ciertamente lo es, siempre que nunca en la vida, jamás de los jamases, vayas a usar esa clase en otro proyecto, o tengamos la seguridad de que ese proyecto no va a sufrir ninguna modificación. Por supuesto, esa situación no existe. El cliente nunca se va a conformar con la primera versión acabada del proyecto (nunca), y tu jefe siempre te sugerirá (quizás con una mirada amenazadora) que reutilices el código de un proyecto anterior.</p>
<p>Resumiendo: una clase bien hecha debe cumplir ciertos puntos:</p>
<ul>
<li>Debe ser fácil de ampliar.</li>
<li>Debe ser traspasable a otras aplicaciones de forma íntegra.</li>
<li>Debe poder ser pasada a un colega, publicada a la comunidad, etc.</li>
</ul>
<p>Salgo hoy con estas historias, porque después de una semana en modo hardcore developer he conseguido acabar (bueno, prácticamente acabar) el nuevo y espectacular diseño del blog (espero que os guste, seáis quienes seáis los que pasáis por aquí xD). Y entre las funciones de wordpress hay cada cosa… Las funciones devuelven código HTML listo para publicar en el mejor de los casos, de hecho, lo más normal es que directamente impriman la información en la página. Un desastre.</p>
<p>Por ejemplo, si llamas a la función que te permite obtener el listado de categorías, en vez de devolver los datos íntegros, o en su defecto el html ya montado; simplemente imprime el código en pantalla sin dar opción al programador de tratar los datos antes de publicarlos. Vamos, no tiene pies ni cabeza.</p>
<p>La intención no es mala, porque simplifica mucho el trabajo para diseñadores con pocos conocimientos de programación, pero el problema real es que no existe la posibilidad de obtener los datos íntegros antes de mostrarlos en pantalla.</p>
<p>Después de algunos meses con este blog, estoy viendo que wordpress es una maravilla, pero en este aspecto hay que suspenderlos y darles una colleja, para que se espabilen en nuevas versiones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanmasantoyo.es/index.php/2007/07/04/programar-orientado-a-objetos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

