Hay mucho escrito sobre cómo diseñar orientado a objetos; reglas, buenos usos y cosas a evitar. Todo en pos de que el código sea reutilizable, fácil de entender y fácil de modificar.
El problema surge cuando nos damos cuenta que estas técnicas no sólo no cumplen con lo que prometen, sino que muchas veces tienen el efecto contrario, difíciles de entender, difíciles de modificar y poco reutilizables.
Entonces, cuando nos alejamos de esas prácticas, tenemos si o si que inventar unas nuevas.
A continuación presento 2 técnicas que uso a diario, y como las use mientras programaba un rasterizer de fuentes TrueType.
A continuación presento 2 técnicas que uso a diario, y como las use mientras programaba un rasterizer de fuentes TrueType.
Exploración
Cuando tengo que programar algo que nunca hice antes, en vez de perder tiempo diseñando o diagramando clases, prefiero escribir código que me vaya acercando a la solución.Es importante mantener un objetivo claro e intentar alcanzarlo programando lo mínimo necesario. El mio era poder entender un archivo TTF y obtener información para dibujar texto en pantalla.
Comencé con una función que sólo recibía el nombre del archivo y me iba mostrando información en la consola. Es recomendable poner esta función en un lugar que sea fácil de invocar, en mi caso, se ejecuta siempre que el código se compila. Si no hubiese tenido implementado hot reloading, hubiese puesto esta función al inicio de todo, por ejemplo.
Es muy común tener dudas sobre cual es la mejor manera de avanzar, ¿es performante mi código? ¿es reutilizable? ¿Es la idea A es mejor que la B?
Todas estas dudas nos impiden avanzar y este no es el mejor momento para responderlas; en modo exploración uno tiene que programar hasta tener el problema resuelto, recién ahí se pueden evaluar alternativas.
Evaluar alternativas sin conocer la solución al problema es una completa pérdida de tiempo.
Unir extremos
Por un lado tengo el API que estoy creando, lo que va a usar el programador cada vez que quiera dibujar texto en pantalla, tiene que ser fácil de entender y de usar.
DrawText("Blah", X, Y);
En el otro extremo, esta el hardware, píxeles en pantalla que forman el texto ingresado.
En este caso yo tengo que cumplir con un protocolo impuesto por la GPU y OpenGL, crear una textura en memoria con un determinado formato. "Subirlo" a la GPU. Texturizar un polígono con la textura anterior. Dibujar en pantalla.
Si yo solo tengo en cuenta uno de los extremos corro el peligro de escribir código que poco tiene que ver con la realidad y en vez de acercarme al objetivo, me voy alejando hasta que tengo que tirarlo a la basura o buscar maneras para que el código, que tanto trabajo me costo escribir, encaje con el otro extremo.
DrawText("Blah", X, Y);
En el otro extremo, esta el hardware, píxeles en pantalla que forman el texto ingresado.
En este caso yo tengo que cumplir con un protocolo impuesto por la GPU y OpenGL, crear una textura en memoria con un determinado formato. "Subirlo" a la GPU. Texturizar un polígono con la textura anterior. Dibujar en pantalla.
Si yo solo tengo en cuenta uno de los extremos corro el peligro de escribir código que poco tiene que ver con la realidad y en vez de acercarme al objetivo, me voy alejando hasta que tengo que tirarlo a la basura o buscar maneras para que el código, que tanto trabajo me costo escribir, encaje con el otro extremo.
Es una buena idea unir los extremos lo antes posible por mas que la información no sea del todo correcto, en este caso, mostrar una textura en pantalla con el ancho y alto correcto, en la posición especificada y con un determinado color ya me ayuda a entender lo que implica esta tarea pudiendo tomar decisiones mas acertadas sobre el diseño del código interno. Haciéndolo mas entendible y modificable.
Por lo general, los extremos no suelen estar tan alejados uno de otro, pero el planteo también sirve para esos casos; por ejemplo, la IA de un NPC va a crear una entidad "Disparo" en un determinado momento. Aquí tengo por un lado la IA y por el otro el mundo y sus entidades.
OOP
La técnica de Exploración no es compatible con orientación a objetos, un evangelista de OOP diría que primero hay que buscar las responsabilidades de las clases y como colaboran con las demas, diagramarlas y recién ahí ponerse a programar.Por otro lado, Unir extremos si es posible ser usado sin importar el paradigma que uno use.








