<?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>4 bits blog &#187; Conceptos</title>
	<atom:link href="http://blog.4bits.es/category/conceptos/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.4bits.es</link>
	<description>Ahora en 16 colores</description>
	<lastBuildDate>Thu, 05 Aug 2010 13:52:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Encapsulamiento</title>
		<link>http://blog.4bits.es/encapsulamiento/</link>
		<comments>http://blog.4bits.es/encapsulamiento/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 17:14:31 +0000</pubDate>
		<dc:creator>Lek</dc:creator>
				<category><![CDATA[Conceptos]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/?p=420</guid>
		<description><![CDATA[Hoy toca otro post de teoría de la programación para hablar de uno de esos conceptos que muchas veces es difícil llevar a la práctica. En algunos paradigmas de programación (como la programación orientada a objetos) se nos dice que desde fuera de una clase sólo necesitamos saber qué se hace, no el cómo. Si [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy toca otro post de teoría de la programación para hablar de uno de esos conceptos que muchas veces es difícil llevar a la práctica.</p>
<p>En algunos paradigmas de programación (como la programación orientada a objetos) se nos dice que <strong>desde fuera de una clase sólo necesitamos saber qué se hace, no el cómo</strong>. Si la clase se encarga de interaccionar con una base de datos no necesita saber cuál es la base de datos ya que de eso se encargaría el driver (lo cual sería cierto si el estándar SQL fuera más&#8230; estándar&#8230; pero eso es otro tema). Y al resto de clases del proyecto no les importa tampoco cómo realiza esa interacción, sino que sólo deben preocuparse de que <em>tal</em> método devuelve los datos de la tabla <em>cual</em>.</p>
<p>¿Cómo se hace esto? Definiendo muy bien la <strong>visibilidad de la clase</strong>. Esto es, qué métodos se van a llamar desde el resto de clases (métodos públicos), cuáles están restringidos a clases “amigas” (del mismo paquete o que hereden de la nuestra, son los métodos protegidos) y cuáles no son accesibles en absoluto fuera de nuestra clase (métodos privados).</p>
<p>Por definición, es recomendable que todas las <strong>variables</strong> sean definidas como <strong>privadas</strong>, de forma que la única manera de manipularlas sea a través de los métodos públicos definidos por la clase y que sean éstos los que se encarguen de hacer todas las comprobaciones que sean necesarias.</p>
<p>Imaginemos la siguiente clase muy básica:</p>
<pre class="brush:java">public class Persona {

  private String nombre;
  private int edad;

  public Persona () {
    inicializar ();
  }

  public void setNombre (String nombre2) {
    nombre = nombre2;
  }

  public void setEdad (int edad2) {
    if (edad2 > 0) {
      edad = edad2;
    }
  }

  public boolean validaVariables () {
    return edad > 0 &#038;&#038; ! "".equals(nombre);
  }

  private void inicializar () {
    nombre = "";
    edad = 0;
  }
}</pre>
<p>En este caso, lo que vemos desde fuera es que para la clase Persona podemos asignar una variable <em>nombre</em> y una variable <em>edad</em>. Podría haber más, pero no nos interesan puesto que no podemos interaccionar con ellas.</p>
<p>Además disponemos de una función para validar que los datos son correctos, pero nunca sabremos desde otra clase que existe un método <em>inicializar</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/encapsulamiento/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Recursividad</title>
		<link>http://blog.4bits.es/recursividad/</link>
		<comments>http://blog.4bits.es/recursividad/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 13:07:28 +0000</pubDate>
		<dc:creator>Lek</dc:creator>
				<category><![CDATA[Conceptos]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/?p=53</guid>
		<description><![CDATA[Era de noche, los bandidos se refugiaron en el bosque. El capitán se levanta y dice: - Pedro, cuéntanos esa historia que tan bien sabes y tan mal dices Pedro se levanta y dice: Era de noche, los bandidos se refugiaron en el bosque. El capitán se levanta y dice: - Pedro, cuéntanos esa historia [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Era de noche, los bandidos se refugiaron en el bosque. El capitán se levanta y dice:<br />
- Pedro, cuéntanos esa historia que tan bien sabes y tan mal dices<br />
Pedro se levanta y dice:</p>
<blockquote><p>Era de noche, los bandidos se refugiaron en el bosque. El capitán se levanta y dice:<br />
- Pedro, cuéntanos esa historia que tan bien sabes y tan mal dices<br />
Pedro se levanta y dice:</p>
<blockquote><p>Era de noche, los bandidos se refugiaron en el bosque. El capitán se levanta y dice:<br />
- Pedro, cuéntanos esa historia que tan bien sabes y tan mal dices<br />
Pedro se levanta y dice:<br />
&#8230;</p></blockquote>
</blockquote>
</blockquote>
<p>La recursividad es la propiedad por la cual una función o trozo de código <strong>se llama a sí mismo</strong>. Para mí es una práctica bastante útil para ciertas tareas (la más socorrida podría ser sin lugar a dudas la de recorrer un árbol de directorios), pero desde luego no se trata de una práctica que acostumbre a pasar inadvertida. Hay <strong>defensores</strong> de ella, que la ven como una forma de evitar repeticiones de código o interminables bucles anidados; y también tiene firmes <strong>detractores</strong>, pues el código recursivo requiere más memoria y requiere más atención del programador (esto lo digo por mi experiencia).</p>
<p>Tenéis más información en este post de <a href="http://picandocodigo.net/index.php/2008/01/23/aprendiendo-programacion-recursividad/">Picando Código</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/recursividad/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ofuscación</title>
		<link>http://blog.4bits.es/ofuscacion/</link>
		<comments>http://blog.4bits.es/ofuscacion/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 14:01:58 +0000</pubDate>
		<dc:creator>Lek</dc:creator>
				<category><![CDATA[Conceptos]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/ofuscacion/</guid>
		<description><![CDATA[Una de las máximas de los programadores es que el código debe ser fácilmente legible. Suele decirse que no hay mejor documentación de un programa que su código fuente. Hacer lo contrario, programar deliberadamente de forma que no sea legible es una práctica de programación conocida como ofuscación. Un arte como otro cualquiera, que tiene [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las máximas de los programadores es que <strong>el código debe ser fácilmente legible</strong>. Suele decirse que no hay mejor documentación de un programa que su código fuente. Hacer lo contrario, programar deliberadamente de forma que no sea legible es una práctica de programación conocida como <a href="http://es.wikipedia.org/wiki/Ofuscaci%C3%B3n">ofuscación</a>. Un arte como otro cualquiera, que tiene sus propios concursos y todo.</p>
<p>Para las empresas es una práctica útil para complicar a la competencia el entendimiento del código decompilado (<strong>aunque sea ilegal decompilarlo</strong>). Pero como es complicado hacer grandes programas de esta forma, existen multitud de herramientas que lo hacen por nosotros. Para Java he encontrado <a href="http://proguard.sourceforge.net/alternatives.html">este listado</a> en la página del <a href="http://www.versioncero.com/noticia/175/proguard">ProGuard</a>.</p>
<p>Sin embargo, en ocasiones uno se encuentra con un programa doblemente ofuscado&#8230; porque está <strong>ofuscado por pura ilegibilidad</strong>. Imaginad el siguiente trozo de código y comprenderéis&#8230;</p>
<pre class="brush:java">FileOutputSream ff = new FileOutputStream (
  String.valueOf (
    String.valueOf (
      (
        new StringBuffer (
          String.valueOf (
            String.valueOf (
              new File (
                String.valueOf (
                  String.valueOf (
                    (
                      new StringBuffer (
                        String.valueOf (
                          String.valueOf (
                            System.getProperty (
                              "java.home"
                            )
                          )
                        )
                      )
                    ).append (
                      System.getProperty (
                        "file.separator"
                      )
                    ).append (
                      "empresa"
                    )
                  )
                )
              )
            )
          )
        )
      ).append (
        System.getProperty (
          "file.separator"
        )
      ).append (
        "adm.conf"
      )
    )
  )
);</pre>
<p>Es un trozo de código de un programa real y tenéis la suerte de que os lo he ordenado un poco, porque estaba en 4 líneas tan solo&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/ofuscacion/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>¿Referencia o valor?</title>
		<link>http://blog.4bits.es/referencia-o-valor/</link>
		<comments>http://blog.4bits.es/referencia-o-valor/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 07:00:24 +0000</pubDate>
		<dc:creator>Fran</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Conceptos]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/referencia-o-valor/</guid>
		<description><![CDATA[Después de la pequeña discusión en el post sobre la mutabilidad de las clases en Java, me propongo aclarar un poco el dilema y las dudas sobre lo qué realmente ocurre al pasar parámetros por referencia o por valor. La definición de un parámetro por referencia nos dice que es aquel parámetro cuyo valor se [...]]]></description>
			<content:encoded><![CDATA[<p>Después de la pequeña discusión en <a href="http://blog.4bits.es/mutabilidad-en-java/">el post sobre la mutabilidad de las clases en Java</a>, me propongo aclarar un poco el dilema y las dudas sobre lo qué realmente ocurre al pasar parámetros por referencia o por valor.</p>
<p>La definición de <strong>un parámetro por referencia</strong> nos dice que es aquel parámetro cuyo valor se puede modificar dentro de la función y se propagará a la variable que se paso como parámetro fuera de la función, es decir, nuestra variable podrá cambiar de valor una vez ejecutada la función.</p>
<p>En cambio, la definición de <strong>un parámetro por valor</strong> nos dice que es aquel parámetro cuyo valor cuyo valor se puede modificar dentro de la función, pero que no se propagará a la variable que se paso como parámetro fuera de la función, es decir, nuestra variable nunca podrá cambiar de valor una vez ejecutada la función.</p>
<p>Normalmente (por lo menos con los lenguajes de programación que yo he tratado) lo que se hace es que en los parámetros por referencia se pasa la dirección de la variable usándose ésta dentro de la función, y en los parámetros por valor se crea una copia de la variable que se usará dentro de la función.</p>
<p>Hay que darse cuenta de que <strong>en el caso de los parámetros por referencia pasamos la dirección</strong>, lo cual se traduce en un puntero a una zona de memoria, y aquí es donde entra en conflicto Java (y por lo que se produjo la discusión), ya que Java sólo permite parámetros por valor, pero <strong>los objetos son referencias a direcciones de memoria</strong>, es decir, punteros a una zona de memoria con una estructura un tanto especial, y por lo tanto aunque Java cree una copia de nuestra referencia (o puntero) nosotros podremos seguir modificando los datos de dentro de esta zona y al salir de la función tener un objeto modificado, aún cuando Java sólo permite parámetros por valor y nosotros pensábamos que no se propagaría el cambio realizado dentro de la función hacia fuera de ésta.</p>
<p>En C ocurre algo semejante (y que ya comenté con un pequeño ejemplo en la discusión), ya que <strong>en C existen parámetros por valor y por referencia</strong>, lo que tiende a hacernos creer que los parámetros por referencia no crean una copia auxiliar, lo cual (creo, por mi poca experiencia) es falso, ya que en <strong>cualquier parámetro por referencia en C trabaja con una copia de la dirección que le pasamos</strong>, lo cual induce a errores muy graves y tontos como el siguiente:</p>
<pre class="brush:c">void
funcion (char *referencia, int n)
{
    referencia = (char *) realloc (referencia, n * sizeof (char));
}

int
main (int argc, char *argv[])
{
    char *ref = (char *) malloc (sizeof (char));
    funcion (ref, 100);
    free (ref);
}</pre>
<p>En este ejemplo se puede comprobar que el paso por referencia en C, crea una copia de la dirección que le pasamos, ya que <code>realloc</code> puede cambiar la dirección de nuestro puntero si no tiene suficiente espacio en la actual, por lo tanto deberíamos obtener una nueva dirección en ref y santas pascuas, pero no es así, ya que se trabaja con una copia de la dirección y por tanto si se modifica, al salir de la función no tendremos la nueva dirección y provocaremos un acceso a una zona de memoria que no queríamos, lo que es un error muy grave y a veces difícil de encontrar.</p>
<p>Para hacerlo bien tendríamos que realizar lo siguiente:</p>
<pre class="brush:c">char *
funcion (char *referencia, int n)
{
    char *ptr;
    ptr = (char *) realloc (referencia, n * sizeof (char));
    if (ptr == NULL) {
        free (referencia);
        return NULL;
    }

    return ptr;
}

int
main (int argc, char *argv[])
{
  char *ref = (char *) malloc (sizeof (char));
  ref = funcion (ref, 100);
  free (ref);
}</pre>
<p>Que es la solución que más me gusta, o la otra solución un poco más difícil de entender:</p>
<pre name="code" class="c">void
funcion (char **referencia, int n)
{
    char *ptr;
    ptr = (char *) realloc (*referencia, n * sizeof (char));
    if (ptr == NULL)
        free (*referencia);

    *referencia = ptr;
}

int
main (int argc, char *argv[])
{
    char *ref = (char *) malloc (sizeof (char));
    funcion (&#038;ref, 100);
    free (ref);
}</pre>
<p>Se puede ver que en C sólo habrá errores si al pasar un parámetro por referencia modificamos la dirección de éste y queremos seguir usándola fuera de la función, mientras no toquemos nada de la dirección será un parámetro por referencia normal y corriente.</p>
<p>Espero que esto aclare un poco las cosas, porque estos temas son los más liosos en programación.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/referencia-o-valor/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Rendimiento</title>
		<link>http://blog.4bits.es/rendimiento/</link>
		<comments>http://blog.4bits.es/rendimiento/#comments</comments>
		<pubDate>Mon, 15 Oct 2007 12:53:03 +0000</pubDate>
		<dc:creator>Lek</dc:creator>
				<category><![CDATA[Conceptos]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/rendimiento/</guid>
		<description><![CDATA[Empecemos con algo lúdico-festivo: Juanito fue contratado para pintar una carretera. El primer día pintó 100 km, el segundo 70 y el tercero 30. Su jefe, preocupado por esta alarmante bajada en su rendimiento le preguntó qué le pasaba, a lo que Juanito le contestó: &#8220;Es que el cubo de pintura cada vez me queda [...]]]></description>
			<content:encoded><![CDATA[<p>Empecemos con algo lúdico-festivo:</p>
<blockquote><p>Juanito fue contratado para pintar una carretera. El primer día pintó 100 km, el segundo 70 y el tercero 30. Su jefe, preocupado por esta alarmante bajada en su rendimiento le preguntó qué le pasaba, a lo que Juanito le contestó: &#8220;Es que el cubo de pintura cada vez me queda más lejos&#8221;</p></blockquote>
<p>El rendimiento de un programa es, a grosso modo, <em>lo que tarda</em> en realizar su cometido. Es, de todas las métricas de calidad, una de las más difíciles de evaluar para mí. No solemos disponer de ejemplos lo suficientemente grandes, en ocasiones el problema aparece en una librería de terceros o, simplemente, se escapa de nuestro control (hasta que aparece). Lo que suele ser común en todos los casos es el mal uso de los tipos <code>String</code> (o similar), y es que <strong>en todos los lenguajes que conozco el tratamiento de los <code>String</code> es una mierda</strong> (bueno, en realidad suele estar entre <em>una puta mierda</em> y <em>una putísima mierda</em>).</p>
<p>Os expongo como ejemplo lo que me ha pasado con un proyecto recientemente. Consistía en generar unos ficherucos y enviarlos a un servidor vía HTTP. No problem. Los ficheros con los que probamos funcionaban a las mil maravillas y el proyecto pasó a pilotaje dividido en 2 partes: la generación y el envío. Cuando quisieron hacer una prueba enviando datos de un mes (en lugar de un día), aquello explotó. Revisando toda la parte de generación solventamos el problema y pasó de tardar 8 horas a 15 segundos, <strong>¡¡cambiando sólo 3 líneas de código!!</strong>. La cosa siguió funcionando hasta la semana pasada, en que empezaron a fallar ficheros de 75 y 40 megas respectivamente, ahora en la parte de envío (solventado el jueves :)).</p>
<p>Éste es un tema para hablar largo y tendido, porque ejemplos hay miles y creo que todos los que hayamos programado habremos sufrido estas pérdidas, en principio inexplicables. Y, además, está relacionado con algo de lo que hablaré dentro de poco (espero): <strong>trampear los límites</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/rendimiento/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Conceptos de programación: Abstracción</title>
		<link>http://blog.4bits.es/conceptos-de-programacion-abstraccion/</link>
		<comments>http://blog.4bits.es/conceptos-de-programacion-abstraccion/#comments</comments>
		<pubDate>Sun, 14 Oct 2007 20:41:51 +0000</pubDate>
		<dc:creator>Lek</dc:creator>
				<category><![CDATA[Conceptos]]></category>

		<guid isPermaLink="false">http://blog.4bits.es/conceptos-de-programacion-abstraccion/</guid>
		<description><![CDATA[Siendo éste un blog de programación, no estaría de más ir definiendo algunos de los conceptos de esta ciencia que algunos convierten en auténtico arte. Y uno de los términos más importantes (y ambiguos) es el de abstracción. No la abstracción de mirar por la ventana, evidentemente. He rebuscado en mis apuntes de la carrera [...]]]></description>
			<content:encoded><![CDATA[<p>Siendo éste un blog de programación, no estaría de más ir definiendo algunos de los conceptos de esta ciencia que algunos convierten en auténtico arte. Y uno de los términos más importantes (y ambiguos) es el de <strong>abstracción</strong>. No la abstracción de mirar por la ventana, evidentemente. He rebuscado en mis apuntes de la carrera por dar una definición formal y que no sea copiada de la Wikipedia (<a href="http://es.wikipedia.org/wiki/Abstracción_(programación_orientada_a_objetos)">Abstracción, programación orientada a objetos</a>, aunque es un concepto válido para cualquier tipo de programación).</p>
<blockquote><p> La abstracción nos permite simplificar el análisis y resolución de un problema separando las características que son relevantes de aquéllas que no lo son. La relevancia dependerá fuertemente del contexto. Un ejemplo típico de abstracción es una jerarquía de objetos determinada por sus características comunes (mamíferos -&gt; primates -&gt; humanos) (&#8230;)<br />
Aunque la abstracción es un concepto general aplicable a cualquier campo, nosotros estamos interesados en la abstracción que proporciona un lenguaje de programación. En este sentido, la aportación más importante ha sido el desarrollo de los lenguajes de alto nivel, que nos permiten utilizar ciertas construcciones de alto nivel en lugar de una secuencia de instrucciones máquina.</p></blockquote>
<p>Personalmente, siempre he definido la abstracción como la capacidad de, viendo un jarrón, ver también todo el proceso de creación del jarrón; y viceversa. Cambiad &#8220;jarrón&#8221; por <em>programa</em> y &#8220;proceso&#8221; por <em>código</em> y tenéis el concepto.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.4bits.es/conceptos-de-programacion-abstraccion/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
