Sei sulla pagina 1di 6

MIGUEL .

TOLEDO MARTNEZ

ERRORES COMUNES DE PROGRAMACIN

BUENAS PRCTICAS DE PROGRAMACIN

PROPUESTAS DE DESEMPEO

SUGERENCIAS DE PORTABILIDAD

OBSERVACIONES DE INGENIERA DE SOFTWARE

INDICACIONES DE PRUEBA Y DEPURACIN

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: SEGUNDA PARTE

SUGERENCIAS-1

MIGUEL . TOLEDO MARTNEZ

ERRORES COMUNES DE PROGRAMACIN


1. Si al utilizar funciones de la biblioteca matemtica no incluye el archivo de encabezado matemtico, se producir un error de sintaxis. Por cada funcin de la biblioteca estndar que utilice en un programa, debe indicar un archivo de encabezado estndar. La omisin de la clase de valor devuelto de una definicin de funcin es un error de sintaxis si el prototipo especifica una clase devuelto distinto de int. No devolver un valor desde una funcin que supuestamente debe hacerlo es un error de sintaxis. La devolucin de un valor desde una funcin cuya clase de devolucin se ha declarado como void es un error de sintaxis. La declaracin de parmetros de funcin de la misma clase como float x, y, en lugar de float x, float y, causar un error de compilacin debido a que para cada parmetro de la lista de parmetros se requiera una clase de datos. Un punto y coma despus del parntesis derecho de la lista de parmetros de una definicin de funcin es un error de sintaxis. Volver a definir un parmetro de funcin como variable local en la funcin es un error de sintaxis. El ( ) de una llamada de funcin de hecho es un operador de C++. Provoca que se invoque a la funcin. Omitir el () de una llamada de funcin que no tiene argumentos no es un error de sintaxis. Sin embargo si pretenda que se llamara a la funcin, esto no suceder.

2. 3. 4. 5.

6. 7. 8.

9. Definir una funcin dentro de otra es un error de sintaxis. 10. Sucede un error de sintaxis si el prototipo de funcin, el encabezado de la funcin y las llamadas de la funcin no coinciden en el nmero, clase de datos y orden de los argumentos y parmetros, as como en el tipo de valor devuelto. 11. La omisin del punto y coma al final de un prototipo de funcin es un error de sintaxis. 12. Las llamadas de funcin que no sean iguales a su prototipo provocan errores de sintaxis. 13. Cuando el prototipo de funcin y la definicin de la funcin no son iguales, sucede un error de sintaxis. 14. La conversin de una clase de datos ms alto en la jerarqua de promocin a un tipo menor puede cambiar su valor. 15. Omitir el prototipo de una funcin cuando esta no ha sido definida antes de ser llamada por primera vez es un error de sintaxis. 16. El intento por generar nmeros aleatorios con srand() en lugar de rand() es un error de sintaxis, debido a que la funcin srand() no devuelve un valor. 17. Asignarle el equivalente entero de una constante de enumeracin a una variable del tipo de la enumeracin es un error de sintaxis. 18. Si despus de definir una constante de enumeracin intenta asignarle otro valor, provocar un error de sintaxis. 19. Indicar varios especificadores de clase de almacenamiento para un identificador es un error de sintaxis. Slo se le puede aplicar un especificador de clase de almacenamiento a un identificador. Por ejemplo, si incluye register, no incluya tambin auto. 20. Por lo general es un error de lgica utilizar el mismo nombre para un identificador dentro de un bloque interno que para un identificador que es parte de un bloque externo cuando, de hecho, el programador quiere que el identificador del bloque externo est activo en el bloque interno. 21. El no devolver un valor desde una funcin recursiva cuando sea necesario, causar que casi todos los compiladores generen un mensaje de advertencia. 22. La omisin del estado primitivo o la escritura incorrecta del paso de recursin de modo que no converja al estado primitivo, provocar una recursin infinita y agotar tarde o temprano la memoria. Esto es anlogo al problema de los ciclos infinitos en las soluciones iterativas (no recurrentes) La recursividad infinita tambin puede ser provocada al proveer una entrada no esperada. 23. La codificacin de programas que dependen del orden de evaluacin de los operandos de los operadores que no sean &&, ||, ?: ni coma (,) puede generar errores, pues los compiladores no necesariamente evaluarn los operandos en el orden que el programador espera.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: SEGUNDA PARTE

SUGERENCIAS-2

MIGUEL . TOLEDO MARTNEZ

24. Es un error de lgica que una funcin no recursiva se llame a s misma, ya sea directa o indirectamente, a travs de otra funcin. 25. Los programas en C++ no se compilan a menos que se indiquen prototipos de funcin para todas las funciones o que se definan las funciones antes de usarlas. 26. Debido a que los parmetros de referencia se mencionan slo por nombre en el cuerpo de la funcin llamada, el programador podra tratarlos inadvertidamente como parmetros de una llamada por valor. Esto puede provocar efectos secundarios inesperados si el invocador modifica las copias originales de las variables. 27. Declarar mltiples referencia en una instruccin suponiendo que el & se distribuye a travs de una lista de nombres de variables separada por comas. Para declarar las variables x, y y z como referencias a un entero emplee la notacin int &x = a, &y = b, &z = c; en lugar de la notacin incorrecta int& x = a, y = b, z = c; o la otra notacin incorrecta comn int &x, y, z; 28. No inicializar una variable de referencia al declararla es un error de sintaxis. 29. Intentar reasignar una referencia declarada previamente como alias de otra variable es un error de lgica. El valor de la otra variable simplemente se le asigna a la localidad para la que la referencia es un alias. 30. Devolver un apuntador o referencia a una variable automtica en una funcin llamada es un error de lgica. Algunos compiladores presentarn un mensaje de aviso al encontrar esto en un programa. 31. Especificar e intentar utilizar un argumento predeterminado que no sea el de ms a la derecha (ltimo) sin tomar los predeterminados de todos los argumentos a su derecha es un error de sintaxis. 32. Intentar acceder a una variable no global desde un bloque exterior por medio del operador unario de resolucin de alcance es un error de sintaxis si no existe una variable global con el mismo nombre que la variable del bloque exterior, y es un error de lgica si es que existe. 33. La creacin de funciones sobrecargadas con listas de parmetros idnticas y diferentes tipos de devolucin es un error de sintaxis. 34. Una funcin a la que se le han omitido los argumentos predeterminados podra ser llamada de manera idntica a otra funcin sobrecargada; esto es un error de sintaxis. Por ejemplo, cuando un programa tiene tanto una funcin que explcitamente no recibe argumentos como otra con el mismo nombre que contiene slo argumentos predeterminados, sucede un error de sintaxis cuando se intenta utilizar dicho nombre de funcin en una llamada que no pasa argumentos. 35. No poner la palabra clave class antes de cada parmetro de tipo de una plantilla de funcin es un error de sintaxis. 36. No emplear todos los parmetros de tipo de una plantilla de funcin en la firma de la funcin es un error de sintaxis.

BUENAS PRCTICAS DE PROGRAMACIN


1. 2. 3. 4. 5. 6. 7. 8. 9. Familiarcese con el vasto conjunto de funciones y clases de la biblioteca estndar de C++. Ponga una lnea en blanco entre las definiciones de funcin para separarlas y simplificar la lectura del programa. Aunque lo predeterminado cuando se omite el tipo de devolucin es int, siempre indique explcitamente el tipo de valor de devuelto. Aunque no es incorrecto hacerlo, no utilice los mismos nombres para los argumentos pasados a una funcin y para los parmetros correspondientes de la definicin de la funcin. Con esto se evitan ambigedades. Seleccione nombres de funcin y de parmetros que tengan significado para simplificar la lectura de los programas y para ayudar a evitar demasiados comentarios. Muchos programadores indican los nombres de los parmetros en los prototipos de las funciones con fines documentativos. El compilador ignora estos nombres. Ponga con maysculas la primera letra de los identificadores que sean nombres de clase definidos por el usuario. 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. Utilice enumeraciones en lugar de constantes enteras; con esto sus programas sern ms claros.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: SEGUNDA PARTE

SUGERENCIAS-3

MIGUEL . TOLEDO MARTNEZ

10. Evite los nombres de variables que oculten nombres en los alcances exteriores. Esto puede lograrse evitando utilizar identificadores duplicados en el programa. 11. Siempre indique prototipos de funcin, aun cuando sea posible omitirlos al definir las funciones antes de utilizarlas. Al indicar los prototipos se evita enlazar el cdigo al orden en que se definen las funciones (el cual puede cambiar fcilmente con la evolucin del programa) 12. El calificador inline slo debe utilizarse con funciones pequeas de uso frecuente. 13. Los argumentos predeterminados pueden simplificar la escritura de las llamadas de funcin. De cualquier forma, algunos programadores sienten que resulta ms claro indicar explcitamente todos los argumentos. 14. Evite utilizar variables con el mismo nombre cuyos fines sean diferentes. Aunque es vlido bajo varias circunstancias, puede generar confusiones. 15. Sobrecargar funciones que realicen tareas muy relacionadas puede simplificar la lectura de los programas.

PROPUESTAS DE DESEMPEO
1. 2. 3. 4. No intente rescribir las rutinas de biblioteca ya existentes. Generalmente no podr mejorar su desempeo. La funcin srand() slo necesita ser llamada una vez en el programa para obtener el efecto aleatorio deseado. Invocarla ms de una vez es redundante y, por lo tanto, reduce el desempeo del programa. El almacenamiento automtico es un medio para conservar memoria, pues las variables de clase de almacenamiento automtico se crean al entrar en el bloque en el que se declaran y se destruyen al salir de l. El especificador de clase de almacenamiento register puede colocarse antes de la declaracin de una variable automtica para sugerirle al compilador que la mantenga en uno de los registros de hardware, que son de alta velocidad, en lugar de en memoria. Si las variables de uso intensivo, como contadores y totales, pueden mantenerse en registros de hardware, es posible eliminar la sobrecarga de obtener repetidamente las variables de la memoria y cargarlas en los registros y luego volver a almacenar los resultados en memoria. Frecuentemente las declaraciones register son innecesarias. Los compiladores optimizadores actuales pueden reconocer las variables de uso frecuente y decidir colocarlas en los registros, sin necesidad de que el programador haga la declaracin register. Evite los programas recursivos tipo Fibonacci cuyo resultado ser una explosin exponencial de las llamadas. Evite utilizar la recursividad en situaciones en las que es importante el desempeo. Las llamadas recursivas tardan y consumen memoria. Un programa altamente funcionalizado, en comparacin con un programa monoltico (es decir, de una pieza) sin funciones, har potencialmente un gran nmero de llamadas a funciones, y stas consumirn tiempo y espacio del procesador de la computadora. Pero los programas monolticos son difciles de programar, probar, depurar, mantener y evolucionar. Las funciones inline pueden reducir el tiempo de ejecucin, pero aumentan el tamao del programa.

5.

6. 7. 8.

9.

10. Una de las desventajas de la llamada por valor es que, si se est pasando un elemento de datos grande, su copia puede tardar un tiempo de ejecucin considerable. 11. La llamada por referencia es buena por cuestiones de desempeo, pues elimina la sobrecarga generada por copiar grandes cantidades de datos. 12. Para pasar objetos grandes, utilice un parmetro de referencia constante con el que simule la apariencia y seguridad de una llamada por valor y evite la sobrecarga de pasar una copia de dichos objetos.

SUGERENCIAS DE PORTABILIDAD
1. 2. 3. Utilice las funciones de la biblioteca estndar de C++; con ello sus programas sern ms portables. Los programas que dependen del orden de evaluacin de los operandos de los operadores que no sean &&, ||, ?: ni coma (,) pueden funcionar de manera distinta en sistemas con diferentes compiladores. En C++ el significado de una lista de parmetros vaca de una funcin es radicalmente distinto que en C. En C significa que la revisin de argumentos se deshabilita (es decir, la llamada de funcin puede pasar cualquier argumento que quiera) En C++, quiere decir que la funcin no acepta argumentos. Por lo tanto, los programas en C que utilicen estas caractersticas podran reportar errores de sintaxis cuando se compilen en C++.
SUGERENCIAS-4

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: SEGUNDA PARTE

MIGUEL . TOLEDO MARTNEZ

OBSERVACIONES DE INGENIERA DE SOFTWARE


1. 2. 3. 4. 5. 6. 7. 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. En los programas con muchas funciones, main() debera implementarse como un grupo de llamadas a las funciones que realizan las tareas del programa. 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. 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. 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. Los programas deben escribirse como conjuntos de funciones pequeas. Esto hace ms fcil escribir, depurar, mantener y modificar los programas. 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. En C++ los prototipos de funcin son necesarios. Utilice las directivas del procesador #include<> para obtener los prototipos de las funciones de biblioteca estndar apropiadas. Tambin utilice #include<> para obtener los archivos de encabezado que contienen los prototipos de funcin que usted y/o los miembros de su grupo utilizan. No es necesario un prototipo de funcin si la definicin de la funcin aparece antes de la primera vez que se utiliza la funcin en el programa. En tal caso, la definicin de la funcin tambin acta como prototipo de funcin.

8.

9.

10. Los prototipos de funcin fuera de cualquier definicin de funcin se aplican a todas las llamadas de la funcin que aparezcan en el archivo fuera del prototipo de la funcin. Un prototipo de funcin dentro de una funcin slo se aplica a las llamadas hechas dentro de dicha funcin. 11. El almacenamiento automtico es un ejemplo del principio de menor privilegio. Por qu tener las variables almacenadas en memoria y a la mano cuando no se necesitan? 12. 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. 13. Las variables que slo se utilizan en una funcin particular deben declararse como variables locales de dicha funcin, en lugar de cmo variables globales. 14. 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. 15. La funcionalizacin ordenada y jerrquica de los programas promueve la buena ingeniera de software, pero tiene su precio. 16. Cualquier cambio a una funcin inline podra requerir la recompilacin de todos los clientes de la funcin. Este podra ser un trabajo considerable en algunos casos de desarrollo y mantenimiento de programas. 17. Muchos programadores no se molestan en declarar como const los valores de los parmetros, aun cuando la funcin llamada no debera modificar el argumento que se le ha pasado. const slo protege una copia del argumento original, no al propio argumento original. 18. La llamada por referencia puede debilitar la seguridad, pues la funcin llamada puede alterar los datos del invocador. 19. Por razones de claridad y desempeo, muchos programadores de C++ prefieren pasarle a las funciones los argumentos modificables mediante apuntadores, los argumentos pequeos no modificables mediante llamadas por valor y los argumentos grandes no modificables mediante referencias a constantes.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: SEGUNDA PARTE

SUGERENCIAS-5

MIGUEL . TOLEDO MARTNEZ

INDICACIONES DE PRUEBA Y DEPURACIN


1. Proporcione un caso default para atrapar los errores, aun cuando est completamente seguro de que no tiene errores en su programa.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: SEGUNDA PARTE

SUGERENCIAS-6

Potrebbero piacerti anche