Está en la página 1de 5

Buenas Prcticas de Programacin en Lenguaje C

El presente documento recopila un conjunto de buenas prcticas de programacin en lenguaje C


provenientes de diferentes fuentes que estn especificadas al final del documento. Estas normas
pueden no ser estrictamente necesarias para que un programa funcione, pero son recomendables
para tener menos errores y para que, si los hay, sea ms fcil encontrarlos. Los profesores tendrn
en cuenta en la correccin de los proyectos que usted emplee un buen estilo de programacin.
La presente lista no est necesariamente completa, pero si contiene una cantidad significativa de
buenas prcticas de programacin que deben seguir los estudiantes del curso.
1. Cada programa debe comenzar con un comentario que describa su propsito.
2. Hacer un diseo previo al programa (pseudo cdigo, diagramas, ...). Se aconseja revisarla
antes de empezar a programar. Se empieza por la descomposicin del problema en
funciones, para pasar luego al detalle de cada una. El pseudo cdigo se emplea con
frecuencia para pensar el programa durante el proceso de diseo. Luego el programa en
pseudo cdigo se convierte a su equivalente el C.
3. Su computadora y su compilador son buenos maestros. Si tras la lectura de su manual del
lenguaje C no est seguro del funcionamiento de alguna caracterstica de C, experimente con
un pequeo programa de prueba y vea lo que sucede. Ajuste las opciones de su compilador
para que le devuelva el mximo de avisos. Estudie cada mensaje que aparezca al compilar
sus programas y corrija los errores y advertencias reportados para eliminar los mensajes.
4. Declare las variables con nombres significativos (o mnemotcnicos). Esto ayuda a que los
programas estn auto documentados, es decir, que resulte ms fcil entenderlos simplemente
leyndolos en lugar de tener que consultar manuales o hacer referencia a muchos
comentarios.
5. Como en lgebra, para hacer ms clara a una expresin es aceptable agregarle parntesis
aunque estos no sean imprescindibles. Dichos parntesis se llaman parntesis redundantes.
Estos se emplean normalmente para agrupar sub-expresiones de expresiones ms grandes.
6. Capture los resultados de todas las llamadas al sistema que su programe realice, y aplique el
tratamiento que corresponda en cada caso.
7. Indente la instruccin del cuerpo de una estructura if para que resalte la estructura y
simplificar la lectura del programa.
8. Su programa no debe tener instrucciones no alcanzables, es decir, que nunca se ejecuten, ni
realizar varias veces la misma operacin sobre los mismos datos.
9. Al escribir expresiones que contengan muchos operadores, consulte la tabla de precedencia
de los operadores. Confirme que los operadores de la expresin se ejecutan en el orden que
espera. Si no est seguro del orden de evaluacin de una expresin compleja, coloque
parntesis para forzar el orden, justo igual como lo hara en una expresin algebraica.
Adems, observe que algunos operadores, como el de asignacin (=), se asocian de derecha
a izquierda, y no de izquierda a derecha.
Pgina 1

10. La iniciacin de variables cuando se declaran ayuda al programador a evitar los problemas
provocados por datos no inicializados.
11. En los programas no debe haber ms que una instruccin por lnea.
12. Sangre o indente las instrucciones de ambos cuerpos de las estructuras if/else.
13. Si hay varios niveles de sangrado, todos deben sangrarse con espacios iguales.
14. Siempre ponga llaves en las estructuras if/else (y en cualquier estructura de control) para
ayudarle a evitar su omisin accidental, especialmente si despus le agrega instrucciones a
una clusula if o else.
15. Inicialice todas las variables que use como los contadores y totalizadores.
16. Declare cada variable en una lnea diferente.
17. Al efectuar divisiones entre una expresin cuyo valor podra ser cero, busque explcitamente
esta condicin y manjela de manera adecuada (imprimiendo un mensaje de error) en lugar
de permitir que suceda un error fatal.
18. Mediante un mensaje pdale al usuario todas las entradas de teclado. Dicho mensaje debe
especificar la forma de la entrada y los valores especiales que pueda tener (como el valor
centinela que debe indicar el usuario para terminar algn ciclo) .
19. En los ciclos controlados por un valor centinela, las solicitudes de entrada de informacin
deben recordarle explcitamente al usuario dicho valor centinela.
20. No compare la igualdad o desigualdad de los valores de punto flotante. En cambio, pruebe
que el valor absoluto de la diferencia sea menor que un valor pequeo especificado.
21. Controle los ciclos con contadores por medio de variables enteras.
22. Para ayudarle a evitar los errores por diferencia de uno, utilice el valor final en la condicin
de una estructura while o for y el operador relacional <=. Por ejemplo, para un ciclo que
imprime los valores 1 a 10, la condicin de continuacin del ciclo debera ser contador <=
10, en lugar de contador < 10 (lo que es un error por diferencia de uno) o contador < 11
(que,sin embargo, es correcta) No obstante, muchos programadores prefieren el llamado
conteo basado en cero, en el que para contar 10 veces, habra que inicializar contador a cero
y la prueba de continuacin del ciclo sera contador < 10.
23. En las secciones de iniciacin e incremento de las estructuras for slo ponga expresiones
relacionadas con las variables de control. Las manipulaciones de otras variables deben
aparecer antes del ciclo (si slo se ejecutan una vez, como las instrucciones de
inicializacin) o en el cuerpo del ciclo (si se ejecutan una vez por repeticin, como en el
caso de las instrucciones de incremento o decremento) .
24. Aunque el valor de la variable de control puede cambiarse en el cuerpo del ciclo for, evite
hacerlo, pues esta prctica puede generar sutiles errores de lgica.

Pgina 2

25. Evite reinventar la rueda. Cuando sea posible, utilice las funciones de la biblioteca estndar
de C en lugar de escribir nuevas. Con esto se reduce el tiempo de desarrollo de los
programas. A menos que al hacerlo, no cumpla con los objetivos del proyecto en cuanto al
aprendizaje de las herramientas descritas en las clases.
26. Cada funcin debe limitarse a efectuar una sola tarea bien definida, y el nombre de dicha
funcin debe expresar claramente la tarea. Esto promueve la reutilizacin del software.
27. Si no puede seleccionar un nombre conciso que exprese lo que hace la funcin es posible
que sta haga demasiadas tareas. Generalmente es mejor dividir dicha funcin en varias
partes ms pequeas.
28. Agregue un caso default en las instrucciones switch. Los casos no probados explcitamente
en una instruccin switch que no tenga un caso default son ignorados. Al incluir el caso
default se enfoca al programador en la necesidad de procesar condiciones excepcionales.
Hay situaciones en las que no es necesario el procesamiento default.
29. Aunque las clusulas case y el caso default de la estructura switch pueden suceder en
cualquier orden, se considera una buena prctica de programacin poner la clusula default
al ltimo.
30. La declaracin de una variable como global en lugar de local permite que sucedan efectos
secundarios cuando una funcin, que no necesita tener acceso a ella, la modifica
accidentalmente o por malicia. En general, las variables globales deben evitarse, excepto en
ciertas situaciones en las que hay requerimientos de desempeo especiales.
31. Las variables que slo se utilizan en una funcin particular deben declararse como variables
locales de dicha funcin, en lugar de cmo variables globales.
32. Los programas deben escribirse como conjuntos de funciones pequeas. Esto hace ms fcil
escribir, depurar, mantener y modificar los programas.
33. Las funciones que requieran de un gran nmero de parmetros podran estar efectuando
demasiadas tareas. Considere dividir la funcin en funciones ms pequeas que realicen las
distintas tareas. El encabezado de la funcin debe caber en una lnea, de ser posible.
34. Cualquier problema que pueda resolverse por recursividad tambin puede resolverse por
iteracin (de manera no recursiva). Normalmente se prefiere un enfoque recursivo sobre un
enfoque iterativo cuando el primero refleja de manera ms natural el problema y su
resultado es un programa ms fcil de entender y depurar. Otra razn para seleccionar la
solucin recursiva es que tal vez no se encuentre una solucin iterativa aparente.
35. Todo valor constante que se use ms de una vez deber estar declarado al principio del
programa con #define.

Pgina 3

36. Los nombres usados para constantes, variables, tipos y funciones deben seguir las siguientes
reglas:

Sern verbos para las funciones y nombres para tipos, variables y constantes.
Se podr abreviar una palabra en vez de ponerla completa, pero debe quedar claro su
significado.
Los nombres de constantes deben ir en mayscula.
Los nombres de tipos tendrn la inicial mayscula y el resto debe ir en minsculas.
Los nombres de variables y funciones deben ir en minsculas.
Las variables cuyo sentido no quede suficientemente aclarado con su nombre, deber tener
un comentario explicativo junto a su declaracin.
Las funciones deben llevar un comentario indicando sus objetivos, as como a que resultados
pretenden llegar en funcin de los datos de entrada.
Toda entrada de datos (individual o ciclo de ellas) con scanf debe ir precedida de un
mensaje de peticin con printf.

37. Evite los identificadores que comiencen con uno o dos caracteres de subrayado, pues podra
ser que el compilador de C utilice nombres de este tipo para fines internos. Esto evitar que
los nombres que usted determine se confundan con los nombres que el compilador
seleccione.
38. Dentro de los corchetes que definen el cuerpo de una funcin, indente el cuerpo de la
funcin un nivel. Esto resalta la estructura funcional de los programas y ayuda a simplificar
su lectura.
39. Slo indique letras maysculas para los nombres de constantes de enumeracin. Con esto se
resaltan las constantes en el programa, recordndole al programador que las constantes de
enumeracin no son variables.
40. Algunos programadores siempre incluyen llaves en las estructuras do/while, incluso cuando
no son necesarias. Esto ayuda a eliminar las ambigedades entre la estructura while y la
estructura do/while que contiene una sola instruccin.
41. Algunos programadores prefieren declarar las variables en lneas separadas. Este formato
permite la fcil insercin de comentarios descriptivos junto a cada declaracin.
42. Para hacer ms legibles sus programas, ponga espacios despus de las comas (, ) .
43. La consistencia en la aplicacin razonable de convenciones de sangrado a sus programas
simplificar notablemente su lectura. Sugerimos una tabulacin fija de 14 de pulgada o tres
espacios en blanco por cada sangra.
44. Cada funcin debera caber en una ventana del editor. Sin importar su tamao, lo importante
es que efecte bien una tarea. Las funciones pequeas promueven la reutilizacin del
software.
45. Establezca una convencin para el tamao de las sangras y luego aplquela de manera
uniforme. La tecla Tab sirve para crear sangras, pero las tabulaciones pueden variar.
Recomendamos manejar tabulaciones de 14 de pulgada o (de preferencia) de tres espacios
por cada nivel de sangra.
Pgina 4

46. Es posible distribuir una instruccin grande sobre varias lneas. Si tiene que dividir una
instruccin sobre varias lneas, seleccione puntos de ruptura que tengan sentido, como
despus de una coma en el caso de una lista separada por comas o despus de un operador
en el caso de una expresin larga. Si necesita dividir una instruccin en varias lneas, sangre
todas las lneas subsecuentes.
47. Algunos programadores prefieren colocar primero las llaves izquierda y derecha y despus
introducir las instrucciones que van dentro de ellas. Con esto se evita la omisin de alguna
de dichas llaves.
48. Si hay demasiados niveles de anidamiento puede volverse difcil entender el programa.
Como regla general, trate de evitar codificar ms de 5 niveles de sangrado.
49. Donde va una condicin (if, while, for, ...) no se pondr un nmero.
50. Ponga espacios en ambos lados de los operadores binarios. Con esto se resalta el operador y
se simplifica la lectura del programa.
51. Muchos programadores hacen que el ltimo carcter impreso por una funcin sea un salto de
lnea (\n). Esto asegura que la funcin dejar el cursor al inicio de una nueva lnea. Las
convenciones de esta naturaleza promueven la reutilizacin del software, meta clave en los
entornos de desarrollo de software.
Recopilacin hecha por el Prof. Ricardo Gonzalez para el Curso de Redes 1 CI4835.

Pgina 5

También podría gustarte