Anécdota personal: el código más simple que funcione

¡Saludos visitante! si deseas comentar o hacer una pregunta sobre este post por favor dirígete a la nueva dirección en http://variabletecnica.com.ve. La página que estás leyendo dejará de estar disponible el 15/11/2015. Gracias, y disculpa las molestias 🙂 Este artículo es más bien una pequeña anécdota de cuando empecé a aprender programación, pero recuerdo frecuentemente…


¡Saludos visitante! si deseas comentar o hacer una pregunta sobre este post por favor dirígete a la nueva dirección en http://variabletecnica.com.ve. La página que estás leyendo dejará de estar disponible el 15/11/2015. Gracias, y disculpa las molestias 🙂

Keep Calm and Keep it Simple
Este artículo es más bien una pequeña anécdota de cuando empecé a aprender programación, pero recuerdo frecuentemente el caso cuando me toca modelar algún proceso, y me recuerda que debo pensar un poco antes de sentarme a picar código.

Cuando estaba en la universidad empecé a aprender por mi cuenta a programar con Visual Basic para Aplicaciones (VBA)… ok, tal vez no haya sido la mejor elección, pero diría que me fue bien, considerando que aprendí por mi cuenta. En fin, mi amigo Carlos y yo pasamos varias semanas resolviendo algunos ejercicios que encontramos en un libro de Visual Basic 5 y comparando el código de ambos; un fin de semana recibí un mensaje de Carlos pidiéndome ayuda con uno de los ejercicios que decía algo como:

Programe un formulario que pida al usuario un monto, y como resultado devuelva la cantidad mínima de billetes de 50, 20, 10, 5, 2 y 1 que equivalen a ese monto.

Me dijo que el problema parecía sencillo, pero que había que considerar muchas combinaciones posibles y su código fallaba con algunos montos. No entendí lo de combinaciones posibles, así que dediqué unos minutos a programar el formulario en mi casa y lo llevé a la suya para ver lo que él había hecho; el código que programó Carlos era más o menos así:

Dim cantidad50 As Integer
Dim cantidad20 As Integer
'...Otras variables aquí
If (monto>50) Then
    While(monto>=50)
        cantidad50 = cantidad50 + 1
        monto = monto - 50
    End While
    If (monto>20) Then
        While(monto>=20)
            cantidad20 = cantidad20 + 1
            monto = monto - 20
        End While
        If (monto>10) Then
           'Otro While, seguido de los IFs de 4° nivel
           '...
        ElseIf (monto>5) Then
           'Otro While, seguido de más IFs de 4° nivel
           '...
           'resto de los IF de 3° nivel....
        End If
    ElseIf (monto>10) Then
        ...'Otros While's e IFs de 3° nivel
    Else
        ...etc :P
    End If
ElseIf (monto>20) Then
    ...
Else
    ...
End If

Así es, varios niveles de IF anidados y varios bucles para hacer el conteo. El código era largo y complicado; podría haber escrito el mismo código usando recursión y sería más corto y fácil de depurar. Sin hacer mayores cambios lo ayudé a encontrar lo que estaba fallando, corregimos algunas condiciones en los IF y agregamos otros IF que faltaban para que el código funcione correctamente; lo probamos con varios casos y todo funcionó perfecto.

No. Todo funcionó, pero no era perfecto, ni siquiera aceptable.

Enfoque para automatizar un proceso manual

Una regla básica que todo programador debe seguir es programar el código más simple que cumpla con su función. ¿Y qué significa simple en esa frase? Para mí significa corto y comprensible. El código no debería ser más complicado de lo necesario, y debe ser fácil de entender por otros programadores, y especialmente por ti mismo en un par de meses.

Cuando el objetivo es automatizar un proceso “manual” como el ejemplo anterior, muchas veces vamos directamente al editor de código y empezamos a teclear instrucciones en lugar de analizar primero el proceso, y muchas veces terminamos con códigos largos que “funcionan” pero no son para nada simples.

Al ver el enunciado del ejercicio, lo primero que hice fue visualizar una caja (registradora) de supermercado llena de billetes de diferentes denominaciones y preguntarme ¿cómo puedo seleccionar la menor cantidad posible de billetes que sumen el monto indicado? Si quisiera seleccionar 76¤ (¤: símbolo genérico de moneda) usando la mayor cantidad posible de billetes, seleccionaría 76 billetes de la menor denominación: 1¤. Entonces, si quiero seleccionar la menor cantidad posible de billetes debería seleccionar primero los billetes más grandes que pueda. Ahora sí, teniendo claro el procedimiento manual puedo sentarme a programar, o más bien a transcribir, ya que el procedimiento es casi obvio:

Dim cantidad50 As Integer
Dim cantidad20 As Integer
Dim cantidad10 As Integer
Dim cantidad5  As Integer
Dim cantidad2  As Integer
Dim cantidad1  As Integer

cantidad50 = monto \ 50
monto = monto MOD 50
cantidad20 = monto \ 20
monto = monto MOD 20
cantidad10 = monto \ 10
monto = monto MOD 10
cantidad5 = monto \ 5
monto = monto MOD 5
cantidad2 = monto \ 2
monto = monto MOD 2
cantidad1 = monto

Eso es todo, al final del procedimiento las seis variables tendrán las cantidades de billetes de cada denominación que suman el monto inicial solicitado; en el ejemplo sería en total 4 billetes: 76¤ = 1*50¤ + 1*20¤ + 1*5¤ + 1*1¤. Sin bucles, ni siquiera un IF, solo un poco de aritmética (usando módulo y división entera).
Después de corregir el código de Carlos le mostré el mío. Por ser más corto y claro no fue necesario explicarle nada, solo lo vio y lo entendió. Probamos algunos casos con el nuevo código aunque no era necesario, ambos sabíamos que funcionaría perfectamente.

La Moraleja

Programa el código más simple que cumpla con su función. El código no siempre será corto, pero siempre será posible escribirlo de forma entendible.
Claro, sin llevar lo de “corto” a los extremos. He visto ejemplos de código donde usan dos o tres operadores ternarios anidados solo porque el código es “más corto” (conoces los operadores condicionales ternarios, ¿verdad?).

Bueno, dejaré lo de la legibilidad del código para otro post; ese tema tiene mucha tela que cortar.

Referencia

Derecho de uso

Los contenidos generados por el autor de este artículo (explicaciones, código fuente, y archivos adjuntos creados por el autor) están disponibles bajo licencia CC BY-SA 3.0, y pueden ser usados, derivados y compartidos bajo los términos indicados en la misma. Los contenidos no generados por el autor de este artículo son propiedad de sus respectivos dueños y están regidos por las licencias que estos hayan dispuesto.

Cita del día

Everything Should Be Made as Simple as Possible, But Not Simpler.
Albert Einstein

,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Soluciones claras y simples



Ing. Industrial, dedicado a la programación en ASP.NET+VB, SQL y Javascript+AJAX; y un poco de Android, Kotling, y Unity 🙂
Valencia, Venezuela



¿QUIERES APOYARME?

¿Te ha sido de ayuda alguno de mis artículos? Generar contenido técnico requiere de tiempo y esfuerzo. Con tu colaboración me puedes ayudar a mantener mi blog activo y actualizado. Si quieres y puedes apoyarme has clic aquí:

https://paypal.me/roimergarcia


ENTRADAS RECIENTES