martes, 14 de julio de 2015

Consejos para programar mejor

No se si yo sea el mas indicado para crear una entrada así, aunque si escribo código, pero hay cierto tabu en la programación si no programas en Java, Python, .NET o algún lenguaje relativamente popular, me ha pasado que me han preguntado:

"¿En que lenguaje programás?"

yo les dijo:

"Yo programo en Autoit, Vb6 y Pauscal, a veces."

Y ni saben que es, aunque ese no es el problema, nunca falta el cabeza que me dice:

"Ah, entonces vos no programás."

Cuando de hecho yo se hacer mas cosas con AutoIT que el (o ellos) en C Sharp, Python y PHP combinados.

Pero bueno, la trama no es esa, el chiste aca es recibir consejos para programar mejor. Les informo que estos consejos se aplican a CUALQUIER LENGUAJE de programación existente.

Comencemos.

1 - Comentarios
Para los que no creen que los comentarios son importantes, es porque nunca se encontraron con un proyecto real.

Como sabemos, los comentarios son palabras que el compilador ignora y que nos sirven para poder entender mejor el código, nada mas util si se trabaja con código de terceros.

Es recomendable comentar lo mas que se pueda el código con la definición mas humana posible, para mejores resultados, es bueno agregar etiquetas a los comentarios.


  • FIXME: para marcar código problemático potencial que requiere una atención especial y/o revisión.
  • NOTE: peligros potenciales para documentar el funcionamiento interno del código y de indicar.
  • TODO: para indicar las mejoras planificadas.
  • XXX: para advertir a otros programadores de código problemático o equivoco.

Aunque no me las se de memoria, estas etiquetas las e visto en código de Pauscal (obviamente codeadas por otra persona) y me ha sido de utilidad.

2 - Funciones
Un error comun para muchos es llamar multiples veces una función que devuelve un mismo resultado, este error es bastante importante y es cometido mas que nada por los programadores novatos o con poca experiencia, relentiza la velocidad del programa (ya que invoca rutinas pre-programadas multiples veces) y es totalmente innecesario.

Lo mejor que puedes hacer (con funciones que sabes que devolveran el mismo valor no importa cuantas veces la llames) es almacenar el valor de la función en una variable de su tipo y utilizar esta variable, tal vez no notes cambios visibles, pero tu procesador te lo agradecera.

Un código de ejemplo que muestra el mal habito de un programador, esta función convierte una cadena binaria en su valor octal.

Function BinToOct(BinNum As String) As String
   Dim BinLen As Integer, i As Integer
   Dim OctNum As Variant
   On Error GoTo ErrorHandler
   BinLen = Len(BinNum)
   For i = BinLen To 1 Step -1
'     Check the string for invalid characters
      If Asc(Mid(BinNum, i, 1)) < 48 Or Asc(Mid(BinNum, i, 1)) > 49 Then ' < ERROR
         OctNum = ""
         Err.Raise 1002, "BinToOct", "Invalid Input"
      End If
'     Calculate Octal value of BinNum
      If Mid(BinNum, i, 1) And 1 Then
         OctNum = OctNum + 2 ^ Abs(i - BinLen)
      End If
   Next i
'  Return OctNum as String
   BinToOct = Oct(OctNum)
ErrorHandler:
End Function

Como se puede apreciar, el programador de este código (no, no fui yo) utilizo dos veces la misma sentencia "Asc(Mid(BinNum, i, 1))". ¿No conoce las variables? pff...

3 - Tabulaciones
Por fin llegamos a mi parte favorita, las tabulaciones, estas son tan importantes en mi código como el mismísimo código.

No son solo para que el código se vea mejor, nos hace diferenciar las instrucciones (por ejemplo) de dentro de un procedimiento a las de afuera de este, ocupan menos memoria ROM (¿a poco no es mejor usar tabulaciones que 6 espacios normales? por favor... son 5 bytes ahorrados...) y son mas estéticamente correctas.

En el ejemplo anterior les mostre un código de Visual Basic 6.0 sin tabular.

Function BinToOct(BinNum As String) As String
  Dim BinLen As Integer, i As Integer
  Dim OctNum As Variant
  On Error GoTo ErrorHandler
  BinLen = Len(BinNum)
  For i = BinLen To 1 Step -1
     'Check the string for invalid characters
     If Asc(Mid(BinNum, i, 1)) < 48 Or Asc(Mid(BinNum, i, 1)) > 49 Then ' < ERROR
     OctNum = ""
        Err.Raise 1002, "BinToOct", "Invalid Input"
     End If
     'Calculate Octal value of BinNum
     If Mid(BinNum, i, 1) And 1 Then
        OctNum = OctNum + 2 ^ Abs(i - BinLen)
     End If
  Next i
  'Return OctNum as String
  BinToOct = Oct(OctNum)
  ErrorHandler:
End Function

¿No les parece mas bonito?

4 - Parametros
Los parámetros son general mente pasados por valor (se crea una copia en la función o procedimiento con el mismo valor), esto puede ser conveniente aveces, pero si no vas a modificar el parámetro en ningún aspecto, no olvides pasarlos por referencia para evitarle al compilador tener que crear la copia a la variable parámetro.

5 - POO
La programación orientada a objetos es muy util, pero muchas personas se vuelven "adictas" a este paradigma, imaginense a alguien que haga una función unica pero dentro de una clase, ¿que chiste tiene?. Siempre que sea posible evita utilizar POO, ya que añade código innecesario y por lo tanto, reduce el rendimiento de tus aplicaciones, la programación orientada a objetos es utilizada para encerrar procedimientos en una tematica en particular, como una clase llamada "SO" que administre el sistema operativo, pero si programás en C# o Java, lamentablemente este tip no te sirve.

¡Saludos!