2007/06/20

Programación de orientación abyecta

Esto es una traducción sin autorizar del artículo "Abject-Oriented Programming".

La programación de orientación abyecta es un conjunto de prácticas para promover la reutilización de código y asegurarse que los programadores producen código que se pueda usar en producción durante mucho tiempo. El número de líneas de código en la aplicación es una medida común de la importancia de la aplicación, y el número de lineas que un programador puede producir al día, a la semana o en un mes, es una métrica útil para la planificación de proyectos y la reserva de recursos. La programación de orientación abyecta es una de las mejores formas de conseguir el mayor número de lineas de código en el menor tiempo posible.

abyecto: desesperanzado, miserable, humillante o penoso: pobreza abyecta

Herencia

La herencia es una forma de mantener características del código antiguo en código más nuevo. El programador deriva de una función que ya existe o de un bloque de código haciendo una copia del código, y modificándola posteriormente.

La copia derivada a menudo se especializa añadiendo características no implementadas en el original. De esta forma el código antiguo se mantiene, pero el nuevo código hereda de él.
Los programas que usan herencia se caracterizan por bloques similares de código de los que surgen pequeñas diferencias a lo largo de los fuentes. Otra señal de herencia son los miembros estáticos: código y variables que no se usan ni referencian directamente, pero que sirven para mantener un enlace al código progenitor o base.

Un ejemplo de herencia en pseudo-código:

function getNombreClnt(IDclnt)
{
    regClnt = readFromDB("cliente", IDclnt);
    nombrecompleto = regClnt[1] + ' ' + regClnt[2];
    return nombrecompleto;
}

function getEmailClnt(IDclnt)
{
    regClnt = readFromDB("cliente", IDclnt);
    nombrecompleto = regClnt[1] + ' ' + regClnt[2];
    /***************
    * 4/15/96 git : dirección email está en
    * el segundo campo del fax
    ***************/
    return regClnt[17];
}

La función getEmailClnt fue heredada de getNombreClnt cuando se introdujeron direcciones de correo a la aplicación. Heredar código de esta forma potencia código que funciona con menor riesgo de introducir errores.

El subtyping es una forma de herencia donde los tipos de las variables se cambian al heredar del código original.

Modularidad

Un programa modular es aquel que está dividido en archivos separados que comparten un bloque de comentarios común en la cabecera. Un módulo normalmente está compuesto por:

  • Nota de copyright
  • Descargos legales
  • De tres a cinco líneas de asteriscos
  • Un historial de cambios
  • Una descripción de lo que se supone que hacía el código originalmente
  • Otras tres o cinco líneas de asteriscos
  • Un gran bloque de espacio en blanco delimitado por asteriscos, u otro carácter, donde aparece el nombre de cada función o subrutina, el nombre o iniciales del autor, y la fecha de escritura original
  • El código

Los módulos normalmente se mantienen de un tamaño razonable para reducir dependencias y mejorar la resistencia del módulo. Si un módulo alcanza un tamaño excesivo se divide en partes más pequeñas, copiando la nota de copyright, descargos legales, etc... del original. Es seguro heredar comentarios de un módulo a otro, así que lo más seguro es copiar todos los comentarios del original.

Componentes y bibliotecas

La programación de orientación abyecta se presta a usar componentes conectables (plug-in) (fragmentos de código encontrados en libros o en la red). Usando un buscador, un programador inteligente puede ahorrar tiempo al encontrar componentes prefabricados capaces de hacer casi cualquier cosa. Los mejores componentes son las cajas negras: el programador ni sabe ni le importa como funciona el componente. Muchas aplicaciones grandes están construidas con una combinación de herencia de otros componentes y aplicaciones encontrados en la red.

Encapsulación

La idea tras la encapsulación es mantener los datos separados del código. Esto se llama ocultación de datos en algunas ocasiones, pero los datos no están realmente ocultos, sólo protegidos dentro de otra capa de código. Por ejemplo, no es una práctica recomendable esparcir consultas a la base de datos por todas partes. Una práctica abyecta sería envolver u ocultar todas las funciones relativas a la base de datos en funciones o subrutinas, encapsulando así la base de datos. En la función getNombreClnt de antes, no se consulta la base de datos directamente -- se llama a una función para leer el registro de la base de datos. Lo único que getNombreClnt y getEmailClnt (y otras muchas funciones parecidas) "saben" es donde encontrar los pocos datos que necesitan en el registro del cliente. La forma de leer el registro del cliente está encapsulado en algún otro módulo.

Algunos lenguajes de programación hacen que el programador declare las variables como protegidas, públicas o privadas. Pero esta no es una práctica abyecta. No hay forma de que el autor de un módulo sepa que variables internas del módulo van a hacer falta para implementar nuevas características en el futuro. Los programadores deben hacer todas las variables públicas (o globales), y deben dejar que el resto del código decida qué debe y qué no debe ser privado.

Polimorfismo

Al aprender técnicas de orientación abyecta, los programadores frecuentemente se atascan en el polimorfismo. Suena complicado pero la idea es sencilla y fácil de implementar. El código es polimórfico cuando produce distintos resultados para distintos tipos de datos de entrada.

Para poner un ejemplo, las funciones de arriba se pueden reescribir como una única función polimórfica heredando el código que ya funciona y encapsulándolo en una nueva función:

function getDatosClnt(Idclnt, que)
{
    if (que == 'nombre') {
        regClnt = readFromDB("cliente", Idclnt);
        nombrecompleto = regClnt[1] + ' ' + regClnt[2];
        return nombrecompleto;

    } else if (que == 'email') {
        regClnt = readFromDB("cliente", Idclnt);
        nombrecompleto = regClnt[1] + ' ' + regClnt[2];
        /***************
        * 4/15/96 git : dirección email está en
        * el segundo campo del fax
        ***************/
        return regClnt[17];
    }

    /* ... etc. */
}

El polimorfismo está relacionado con la idea de no-determinismo y las máquinas de estados finitos de Turing, que deberías recordar de tus clases de Informática.

Ser frente a Tener

Esta es una sutileza de buen diseño de orientación abyecta. Al principio de aprender los principios abyectos, los programadores tienden a hacerlo todo con herencia (modelo ser). Con más experiencia los programadores se dan cuenta que la relación tener es a menudo más apropiada. En el código de ejemplo de arriba, cada cliente tiene un mombre, pero regClnt es un registro de la base de datos.

Clases virtuales y funciones

Una función o clase virtual es código que la aplicación necesitará tarde o temprano, pero que no está escrito todavía. Esto se consigue normalmente mediante una clase base en la que se basará el código final:

function calcImpuestoVentas(precio, esDevengable, provincia)
{
    /****************************************
    *
    * TO DO:
    *
    * obtener porcentaje de impuestos de la
    * provincia del cliente
    * en algun momento de alguna tabla
    *
    ****************************************/

    /** 02/07/99 git -- usamos impuestos de M de momento **/
    return precio * (7.25 / 100.0);
}

Una clase base frágil es un módulo o clase que lleva en la aplicación mucho tiempo y hace que la aplicación falle cada vez que se modifica de cualquier manera.

Sobrecarga

La sobrecarga es cuando un módulo o pedazo de código hace más de una cosa. Un ejemplo sería una subrutina que devuelve el nombre del cliente, la dirección postal, la dirección electrónica y la tasas de impuesto estatal. Usar funciones sobrecargadas reduce el method dispatching (reparto de métodos), que es una de las razones por las que otros estilos de programación pueden resultar en código lento.

Documentación

Se dice que el código debe escribirse para que sea leído por gente, por lo tanto se deduce que la documentación se escribe para que nadie la lea. La documentación debe escribirse en cada módulo nuevo y mantenerse conforme los cambios se entreguen a producción o, al menos, la próxima vez que haya un hueco en el trabajo.

Un buen momento para escribir documentación es cuando alguien del departamento entrega el pre-aviso de dos semanas: aprovecha ese tiempo para asegurarte que el miembro del equipo que se marcha documenta todo su código.

Ensuciar el código con montones de comentarios explicando qué es lo que intenta hacer el código distrae y ralentiza al compilador. Por eso cualquier empresa que siga las "practicas recomendadas" mantiene la documentación en un sistema de gestión de documentación donde los programadores no pueden borrar nada accidentalmente.

Control de versiones

No es realmente una práctica de programación per se, pero las empresas abyectas suelen seguir prácticas similares de control de versiones. Mantener cerca versiones previas del código, y llevar un seguimiento de los cambios en el código es importante incluso si sólo hay un programador trabajando en la aplicación. Los programadores abyectos experimentados siguen un sistema como el siguiente:

  • Añade siempre tus iniciales y la fecha de la última revisión en la cabecera del fichero de código.
  • Cuando edites un fichero y te des cuenta que tus cambios son lo bastante grandes como para que revertirlos sea complicado, guarda una copia con extensión .bak.
  • Mantén múltiples copias de respaldo cerca añadiendo tu nombre o iniciales y la fecha en el nombre de archivo de copia de seguridad: datoclnt_git20040321.bak.
  • Guarda siempre copias de respaldo en el mismo directorio o carpeta que el código original, así se facilita ver la historia del archivo.

Conclusión

Probablemente encuentres que en las empresas con más solera ya se siguen algunas o todas estas prácticas abyectas. Modas como métodos ágiles o programación "extrema" vienen y van, pero el estilo abyecto ha existido desde el principio de los tiempos. Los encargados están familiarizados con las prácticas abyectas y esperan que seas capaz de trabajar con su código base de orientación abyecta.

2007/06/16

De noche, todos los blogs son pardos

No es que me hiciera falta una gráfica para comprobar que leo mis feeds por la noche, pero ya que google reader me la ofrece... mi ego blogger no ha podido resistirse (y ya se sabe que las estadísticas son para los bloggers como las scubigalletas para Scooby aunque sean así de chorras... las estadísticas, no las scubigalletas... bueno, las scubigalletas también XD).

a qué hora leo blogs

2007/06/05

alcohol y coche

Agente: El alcoholimetro marca 10.7, ¿Puede leer lo que pone en el cartel ese que tiene delante?

Conductor: Diceee: Ni uda goda de al codl ar voradte, agedte

Agente: ¿Me explica entonces la marca del alcoholimetro?

Conductor: Bueeez, loogue pone en er cardel: ni uda goda de al codl ed er vodadte, lo deggo dodo dedtdo yo, y do he didado nada ed ed vodadte.

Cosecha propia. u_u'

2007/06/04

la grapadora que dice aaaaaah

2007/06/03

envío rápido de notas al notame

Vale, ya hay un bookmarklet para enviar al meneame desde Firefox (en realidad debería valer para cualquier navegador), pero se puede hacer aún más rápido todavía de verdad de la buena y con pepinillos usando las búsquedas rápidas de Firefox.

Preparación (esto sólo hay que hacerlo una vez):

  1. Marcadores
  2. Administrar marcadores
  3. Nuevo marcador
  4. parámetros:
    • Nombre: el que querais, yo tengo puesto "Nótame rápido"
    • Ubicación:
      http://meneame.net/api/newpost.php?user=UUUUUU&key=KKKKKKK&charset=UTF-8text=%s

      con cuidado de cambiar UUUUUU por el nombre del usuario que tengais en meneame y KKKKKKK por la clave que está en el perfil de usuario.
    • Palabra clave: notame
    • Descripción: Podeis poner lo que querais o dejarlo en blanco, yo puse 'envío a notame en la barra de direcciones escribir "notame cosa" envia "cosa" como nota a meneame'
  5. Cargar este marcador en el panel lateral: sin marcar
  6. Aceptar

Y cada vez que quieras enviar una nota, elige:

Ejemplo de uso 1:

  1. CTRL+t
  2. CTRL+l
  3. notame hola mundo
  4. ENTER
  5. esperamos al OK...
  6. CTRL+w
  7. profit!!!

Ejemplo de uso 2:

  1. CTRL+l
  2. notame hola mundo
  3. ENTER
  4. esperamos al OK...
  5. pulsamos el botón de atrás
  6. profit!!!

Limitaciones:

  • Los saltos de linea no funcionan, ni con \n, ni con <br>.
  • Caracteres acentuados no se envian correctamente. He probado a poner la codificación por defecto de Firefox a utf-8, pero ni así se envian. He cambiado el charset que hay en la URL del bookmark a UTF-8, y ya se envían correctamente los acentos :)

Y se me está ocurriendo usar el bookmarklet de habladorcito, pero no estoy seguro de cómo... hmmm... ¿o sí?... otro día.

2007/06/01

traducciones automáticas en la revista EDGE en español

EDGE es una revista de videojuegos de las que se imprimen con papel. La revista es oriunda de UK, y existe una edición en español que traduce algunos artículos, y continene otros de producción propia.

Que traduzca los artículos no me parece mal, lo que me parece mal son cosas como esta:

  • pag102, recuadro amarillo (el más pasable de los 3):
    Como canal de animacíon, Morpheme consiste en un ligero motor multiplataforma para PlayStation 3, Xbox 360 y PC, llamado Morpheme:runtime, que va integrado entre la máquina del juego principal y un entorno competente, Morpheme:connect. Esto se utiliza como una interfaz visual donde la lógica de animación y mezcla se puede crear, editar y retocar utilizando gráficos de transición y árboles de mezclas y revisar utilizando el previsualizador 3D. Se incluye soporte para el pad control del juego, guión (escritura) Lua y compatibilidad con la mayoría del complejo procedimiento de tecnología de animación.
  • pag 103, primer recuadro amarillo:
    Surgido de la experiencia de la compañía en rigidez del cuerpo y física ragdoll, Havok Behavior es una herramienta para animadores y un runtime SDK para programadores. Se construye sobre un sistema de dirección que abarcan ventajas tales como equipos, ataduras de piel/engranados y clips de animación . La herramienta de creación expone dinámicas de animación tales como máquinas jerárquicas en estado finito y mezclan armazones de una manera intuitiva. El SKD integra el sistema de animación del juego y le permite unirse al sistema de IA del juego de modo que los acontencimientos pueden cambiar las animacinoes en movimiento.
  • pag 103, segundo recuadro amarillo:
    Uno de los productos se adquirió cuando Autodesk compró Alias (también fue uno de los productos adquirido cuando Ailas compró Kaydara), ha llevado un tiempo a la empresa saberse cerca de HumanIK. A diferencia de productos tales como 3ds Max y Maya, HumanIK es un componente runtime que los promotores necesitan integrar en su propia máquina de juego. Esto requiere modelo de negocio diferente y otro apoyo que el que Autodesk ha ofrecido por regla general. Pero, siguiendo el reciente acuerdo de EA y el trabajo anterior con Ubisoft, parece que Autodesk buscará despertar interés en esta tecnología dinámica de caracteres de animación que utiliza un enfoque cinemático inverso para crear movimiento en juego. También ofrece una opción de objetivos de modo que la animación se puede aplicar a esqueletos de diferentes tamaños y jerarquías.

Vale que yo también tengo faltas de ortografía, y que mi estilo deja mucho que desear, pero a mi nadie me paga. ¿No es el proofreading una práctica común en los negocios editoriales?, joder, yo pensaba que sí.

Bah, la suscripción está a nombre de la oficina y en realidad me da igual, esto sólo es un poco de talibaneo ortográfico que me apetecía. Pero no deja de ser molesto que gente que cobra cometa los mismos errores que aficionados haciendo lo mismo por que les gusta. Y este no es el único/primero/último ejemplo (p.ej. los subtítulos oficiales en el DVD de animatrix son bastante mediocres).