Vous êtes sur la page 1sur 10

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: PRIMERA PARTE

SUGERENCIAS-1

MIGUEL . TOLEDO MARTNEZ

ERRORES COMUNES DE PROGRAMACIN


Bajo el ttulo de buenas prcticas de programacin se incluirn muchas sugerencias a lo largo de las lecciones para subrayar las prcticas que ayudarn a escribir programas ms claros, comprensibles y fciles de mantener, probar y depurar. Estas prcticas son slo guas; sin duda usted desarrollar su propio estilo de programacin. Tambin subrayaremos varios errores comunes de programacin (problemas que prever para evitar caer en estos errores en sus programas), consejos de desempeo (tcnicas que le ayudarn a escribir programas ms rpidos y de menor consumo de memoria), explicaciones de portabilidad (tcnicas que le ayudarn a escribir programas que puedan ejecutarse con pocos o ningn cambio en diferentes tipos de computadora), observaciones sobre ingeniera de software (ideas y conceptos que afectan y mejoran la arquitectura general de un sistema de software y, en particular, en el caso de los sistemas de software grandes), as como indicaciones de prueba y depuracin (sugerencias para probar sus programas y ayudarle a aislar y eliminas bugs)
1. Los errores como la divisin entre cero suceden durante la ejecucin del programa, por lo que se llaman errores en tiempo de ejecucin. La divisin entre cero por lo general es un error fatal, es decir, un error que provoca que el programa termine de inmediato sin haber concluido de manera apropiada su trabajo. Los errores no fatales permiten que los programas se ejecuten hasta el fin, generalmente produciendo resultados incorrectos. (Nota: en algunos sistemas, la divisin entre cero no es un error fatal. Lea la documentacin del sistema con el que est trabajando). Si olvida incluir el archivo iostream.h en un programa que acepta entrada desde el teclado o enva datos a la pantalla, el compilador emitir un mensaje de error. La omisin del punto y coma al final de una instruccin es un error de sintaxis. Los errores de sintaxis se producen cuando el compilador no puede reconocer una instruccin. El compilador normalmente emite un mensaje de error que ayuda al programador a localizar y corregir la instruccin incorrecta. Los errores de sintaxis son violaciones al lenguaje. Tambin se les conoce como errores de compilacin y errores en tiempo de compilacin, debido a que aparecen durante la fase de compilacin. Si intenta utilizar el operador de mdulo, %, con operandos que no son enteros, se producir un error de sintaxis. Si cualquiera de los operadores ==, !=, >= y <= aparece con espacios entre el par de smbolos, suceder un error de sintaxis. La inversin del orden del par de operadores de los operadores !=, >= y <= (al escribirlos como =!, => o =<) normalmente es un error de sintaxis. En algunos casos, escribir != como =! no ser un error de sintaxis, pero casi con toda seguridad ser un error de lgica.

2. 3.

4. 5. 6.

No confunda el operador de igualdad == con el operador de asignacin =. El primero debe leerse como es igual que y el segundo como obtiene, obtiene el valor de o se le asigna el valor de. Algunas personas prefieren leer el operador de igualdad como doble igual. Como veremos pronto, la confusin de estos operadores no necesariamente causa un error de sintaxis fcil de reconocer, pero puede provocar errores muy sutiles de lgica. 8. Es un error utilizar el operador AND lgico (&&) en vez del operando AND a nivel de bits (&) y viceversa. 9. Utilizar el operador OR lgico ( || ) en vez del operador OR a nivel de bits ( | ) y viceversa. 10. El resultado del desplazamiento de un valor es indefinido si el operando derecho es negativo o si el operando derecho es ms grande que el nmero de bits en los que est almacenado el operando izquierdo. 7.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-2

MIGUEL . TOLEDO MARTNEZ

11. Las funciones de manipulacin de cadenas diferentes a memmove() que copian caracteres tienen resultados indefinidos cuando el copiado se realiza entre partes de la misma cadena. 12. La colocacin de un punto y como (;) justo despus del parntesis derecho tras la condicin de una estructura if con frecuencia es un error de lgica (aunque no un error de sintaxis). El punto y coma provocar que el cuerpo de la estructura if est vaci,, por lo que la estructura misma no llevara a cabo ninguna accin, sin importar si la condicin es verdadera o no. Peor an, la instruccin original del cuerpo de la estructura if ahora se volver una instruccin en secuencia con la estructura if y siempre se ejecutar, causando muchas veces que el programa genere resultados incorrectos. 13. Dividir los identificadores insertando caracteres de espacios en blanco (por ejemplo, escribiendo main como ma in) es un error de sintaxis. 14. El empleo de una palabra reservada como identificador es un error de sintaxis. 15. Si olvida una o ambas llaves delimitadoras de una instruccin compuesta, pueden producirse errores de sintaxis o de lgica en el programa. 16. Un punto y coma tras la condicin de una estructura if genera un error de lgica en las estructuras if de seleccin nica y un error de sintaxis en las estructuras if de doble seleccin (si la parte if contiene una instruccin en su cuerpo). 17. Si no se indica en el cuerpo de una estructura while una accin que en algn momento provoque que la condicin se vuelva false, lo comn es que se presente un error llamado ciclo infinito, en el que la estructura de repeticin nunca termina. 18. La palabra reservada while no se debe escribir con W mayscula (como While), ya que es un error de sintaxis (recuerde que C++ es un lenguaje sensible a las maysculas y minsculas). Todas las palabras reservadas de C++, como while, if y else, slo utilizan minsculas. 19. Si los contadores y totales no se inicializan, el resultado del programa probablemente sea incorrecto. Este es un ejemplo de error de lgica. 20. En los ciclos controlados por contador, debido a que el contador de ciclo tiene un valor mayor en uno que su ltimo valor legtimo (es decir 11, en el caso de que se est contando del 1 al 10), es comn que, si se toma el valor del contador para efectuar un clculo tras terminar el ciclo, se genere un error por diferencia de uno. 21. La seleccin de un valor centinela que tambin es un valor de datos vlido es un error de lgica. 22. Los intentos por dividir entre cero causan errores fatales. 23. El uso de nmeros de punto flotante de una manera que suponga que se representan con precisin puede dar resultados incorrectos. La mayora de las computadoras slo representan de manera aproximada a los nmeros de punto flotante. 24. Utilizar el operador de incremento o decremento en una expresin que no sea un nombre de variable simple (por ejemplo, ++(x+1)) es un error de sintaxis. 25. Dado que los valores de punto flotante pueden ser aproximados, el control de los ciclos con contador mediante variables de punto flotante puede dar como resultado valores de contador imprecisos y pruebas de terminacin incorrectas. 26. El empleo de un operador relacional incorrecto o de un valor final de contador de ciclo equivocado en la condicin de una estructura while o for puede provocar errores por diferencia de uno. 27. Cuando la variable de control de una estructura for se define desde el principio en la seccin de iniciacin del encabezado de la estructura for, el empleo de la variable de control fuera del cuerpo de la estructura es un error de sintaxis. 28. Indicar comas en lugar de los dos puntos y coma en el encabezado for es un error de sintaxis. 29. Un punto y coma inmediatamente a la derecha del parntesis derecho de un encabezado for hace que el cuerpo de dicha estructura sea una instruccin vaca. Comnmente ste es un error de lgica. 30. No emplear el operador relacional adecuado para la condicin de continuacin de un ciclo que cuenta hacia abajo (como cuando se utiliza incorrectamente i <= 1 en un ciclo que cuenta hacia abajo hasta 1) podra generar un error de lgica que producira resultados incorrectos al ejecutarse el programa.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-3

MIGUEL . TOLEDO MARTNEZ

31. Si no se incluye el archivo math.h en un programa que maneje funciones de la biblioteca matemtica se generar un error de sintaxis. 32. Olvidar una instruccin break cuando es necesaria en una instruccin switch es un error de lgica. 33. La omisin del espacio entre la palabra case y el valor entero que se est probando en una estructura switch puede provocar un error de lgica. Por ejemplo, escribir case3: en lugar de case 3: simplemente crea una etiqueta no usada. El problema es que la estructura switch no efectuar las acciones correctas cuando la expresin de control del switch tenga un valor de 3. 34. Si no se procesan los caracteres de salto de lnea y otros caracteres de espacio en blanco que aparecen en la entrada durante la lectura de caracteres uno por uno, es posible que sucedan errores de lgica. 35. Indicar varias etiquetas case iguales en una estructura switch es un error de programacin. 36. Los ciclos infinitos suceden cuando la condicin de continuacin del ciclo de una estructura while, for o do/while nunca se vuelve false. Para evitarlos, asegrese de que el valor de la condicin cambie en algn lugar del encabezado o del cuerpo del ciclo, para que la condicin pueda, en algn momento volverse false. 37. Aunque 3 < x < 7 es una condicin matemticamente correcta, en C++ no se evala correctamente. Para obtener en C++ la evaluacin correcta, utilice (3 < x && x < 7) 38. En las expresiones que utilizan el operador &&, es posible que una condicin (a la que llamaremos condicin dependiente) requiera que otra condicin sea true para que tenga sentido evaluar la condicin dependiente. En este caso, dicha condicin debe ponerse tras la otra condicin o podra suceder un error. 39. Emplear el operador == para realizar una asignacin o utilizar el operador = para realizar una igualdad son errores de lgica. 40. Es un error tratar de leer de un ostream (o de cualquier otro flujo de slo salida) 41. Es un error tratar de escribir a un istream (o a cualquier otro flujo de slo entrada) 42. Es un error no colocar parntesis para forzar la precedencia adecuada cuando se utiliza el operador de insercin de flujo << o el operador de extraccin de flujo >> que tienen una precedencia relativamente alta. 43. El establecimiento de anchura se aplica slo para la siguiente insercin o extraccin. Despus de ello la anchura se establece implcitamente a 0, es decir, los valores de salida sern tan anchos como necesiten serlo. La funcin width sin argumentos devuelve el valor actual. Suponer que el establecimiento de anchura se aplica a todas las salidas es un error de lgica. 44. Cuando no se proporciona un campo lo suficientemente ancho para manejar las salidas, stas se imprimirn tan anchas como necesiten serlo lo que causar, posiblemente, que sean difciles de leer. 45. Es un error abrir un archivo existente para salida (ios::out) cuando, de hecho, el usuario quiere conservar dicho archivo, ya que el contenido de ste se descarta sin aviso alguno. 46. El uso de un objeto ofstream incorrecto para referirse a un archivo. 47. Es un error no abrir un archivo antes de intentar referenciarlo en un programa.

BUENAS PRCTICAS DE PROGRAMACIN


1. 2. Escriba sus programas de C++ sencillo y directamente. Esto a veces se conoce como mantelo simple. No estire el lenguaje intentando usos raros. Lea los manuales de la versin de C++ que est empleando. Consulte estos manuales con frecuencia para asegurar que tenga presente el rico conjunto de caractersticas de C++ y que est empleando correctamente estas caractersticas. 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

3.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-4

MIGUEL . TOLEDO MARTNEZ

4. 5.

devuelva el mximo de avisos. Estudie cada mensaje que aparezca al compilar sus programas y corrjalos para eliminar los mensajes. Cada programa debe comenzar con un comentario que describa su propsito. Muchos programadores hacen que el ltimo carcter impreso por una funcin sea un saldo 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. Dentro de los corchetes que definen el cuerpo de una funcin, sangre el cuerpo de la funcin un nivel. Esto resalta la estructura funcional de los programas y ayuda a simplificar su lectura. 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 de pulgada o (de preferencia) de tres espacios por cada nivel de sangra. Algunos programadores prefieren declarar las variables en lneas separadas. Este formato permite la fcil insercin de comentarios descriptivos junto a cada declaracin. Para hacer ms legibles sus programas, ponga espacios despus de las comas (, ) La declaracin de variables con nombres significativos 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 demasiados comentarios. 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. Siempre inserte una lnea en blanco antes de una declaracin que aparezca entre instrucciones ejecutables. Esto resalta las declaraciones y contribuye a la claridad del programa. Si prefiere poner declaraciones al inicio de una funcin, seprelas de las instrucciones ejecutables de la funcin por medio de una lnea en blanco que resalte el punto donde terminan las declaraciones e inician las instrucciones ejecutables. Ponga espacios en ambos lados de los operadores binarios. Con esto se resalta el operador y se simplifica la lectura del programa. Como en lgebra, para hacer ms clara a una expresin es aceptable agregarle parntesis innecesarios. Dichos parntesis se llaman parntesis redundantes. Estos se emplean normalmente para agrupar subexpresiones de expresiones ms grandes. Sangre la instruccin del cuerpo de una estructura if para que resalte la estructura y simplificar la lectura del programa. En los programas no debe haber ms que una instruccin por lnea. 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. 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. La consistencia en la aplicacin razonable de convenciones de sangrado a sus programas simplificar notablemente su lectura. Sugerimos una tabulacin fija de de pulgada o tres espacios en blanco por cada sangra. El seudo cdigo se emplea con frecuencia para pensar el programa durante el proceso de diseo. Luego el programa en seudo cdigo se convierte a su equivalente en C++. Sangre las instrucciones de ambos cuerpos de las estructuras if/else.

6. 7.

8. 9. 10.

11.

12. 13.

14. 15.

16. 17. 18.

19.

20.

21. 22.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-5

MIGUEL . TOLEDO MARTNEZ

23. Si hay varios niveles de sangrado, todos deben sangrarse con espacios iguales. 24. 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. 25. 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. 26. Inicialice los contadores y totales. 27. Declare cada variable en una lnea diferente. 28. 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 el error fatal. 29. 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) 30. En los ciclos controlados por un valor centinela, las solicitudes de entrada de informacin deben recordarle explcitamente al usuario dicho valor centinela. 31. 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. 32. La iniciacin de variables cuando se declaran ayuda al programador a evitar los problemas provocados por datos no inicializados. 33. Los operadores unarios deben ponerse junto a sus operandos, sin espacios intermedios. 34. Controle los ciclos con contadores por medio de variables enteras. 35. Sangre las instrucciones del cuerpo de cada estructura de control 36. Ponga una lnea en blanco antes y despus de cada estructura de control, con el fin de resaltarlas en el programa. 37. Si hay demasiados niveles de anidamiento puede volverse difcil entender el programa. Como regla general, trate de evitar codificar ms de tres niveles de sangrado. 38. El espaciado vertical de las estructuras de control, as como el sangrado de los cuerpos de las estructuras de control dentro de sus encabezados, le da al programa una apariencia bidimensional que simplifica en gran medida su lectura. 39. 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. 40. 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) 41. 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. 42. Aunque las instrucciones que preceden a un ciclo for y las del cuerpo de ste con frecuencia pueden insertarse en el encabezado del for, evite hacerlo, pues podra hacer ms difcil la lectura del programa. 43. De ser posible, limite a una sola lnea el tamao de los encabezados de las estructuras de control. 44. No emplee variables de tipo float o double para efectuar clculos monetarios. La imprecisin de los nmeros de punto flotante puede provocar errores que generarn valores monetarios incorrectos.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-6

MIGUEL . TOLEDO MARTNEZ

45.

46. 47. 48.

49.

50.

Nota: estn apareciendo bibliotecas de clases de C++ para manejar adecuadamente los clculos monetarios. 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. 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. En las estructuras switch, cuando la clusula default se lista al ltimo, no es necesaria la instruccin break. Algunos programadores incluyen este break por claridad y simetra con los dems case. 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. Algunos programadores sienten que break y continue violan la programacin estructurada. Y no las utilizan debido a que los efectos de estas instrucciones pueden lograrse por medio de tcnicas de programacin estructurada. En los programas C++ utilice exclusivamente la forma de E/S de C++, a pesar de que los programadores de C++ tienen disponible la E/S estilo C.

51. Cuando enve a la salida expresiones, colquelas entre parntesis para impedir problemas de precedencia de operadores entre los operadores de la expresin y el operador <<. 52. Abra un archivo un archivo para entrada (utilizando ios::in) solamente si el contenido del archivo no debe ser modificado. Esto impide una modificacin no intencional del contenido del archivo. Este es un ejemplo del principio de menor privilegio.

PROPUESTAS DE DESEMPEO
1. Utilizar las funciones y clases de la biblioteca estndar, en lugar de escribir sus propias versiones comparables, puede mejorar el desempeo de sus programas, debido a que han sido escritas cuidadosamente para que su desempeo sea eficiente. La estructura if/else anidada puede ser mucho ms rpida que una serie de estructuras if de seleccin nica, pues existe la posibilidad de salir con rapidez de la estructura una vez que se satisfacen las condiciones. En la estructura ilf/else, pruebe hacia el principio de la estructura las condiciones que ms probablemente sean true. Esto permite que dicha estructura se ejecute con mayor rapidez y salga antes que en los casos que suceden con menos frecuencia. Cuando se emplean operadores de asignacin abreviados, los programadores pueden escribir sus programas con un poco ms de rapidez y los compiladores pueden compilar los programas a una velocidad un poco mayor. Algunos compiladores generan cdigos que se ejecuta ms rpido cuando se utilizan dichos operadores. Muchos de las propuestas de desempeo que mencionados en estas lecciones generan mejoras marginales, por lo que el lector podra estar tentado a ignorarlos. Sin embargo, cuando se pone una mejora supuestamente marginal en un ciclo que se repite muchas veces, se suele lograr un mejor desempeo. Evite poner dentro de los ciclos expresiones cuyos valores no cambien. Pero si lo hace, muchos de los compiladores refinados optimizadores actuales colocarn automticamente tales expresiones fuera de los ciclos, cuando se genere el cdigo de lenguaje de mquina. Muchos compiladores contienen caractersticas de optimizacin que mejorar el cdigo que usted escribe, pero sigue siendo mejor que escriba un buen cdigo desde el principio. En situaciones en las que la prioridad es el desempeo y donde la memoria es escasa o la velocidad de ejecucin es crucial, podra ser necesario manejar enteros pequeos.

2.

3.

4.

5.

6.

7. 8.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-7

MIGUEL . TOLEDO MARTNEZ

9.

10. 11.

12. 13.

Utilizar enteros de tamao pequeo puede provocar la ejecucin ms lenta del programa si las instrucciones de la mquina que los manipulan no son tan eficientes como aqullas que manipulan los enteros de tamao natural (por ejemplo, cuando debe efectuarse la extensin del signo en ellos) Las instrucciones break y continue bien empleadas se ejecutan ms rpido que sus tcnicas estructuradas correspondientes. En las expresiones que utilizan el operador &&, si las condiciones individuales son independientes entre ellas, haga que la condicin que ms probablemente sea false quede a la izquierda. En las expresiones que utilizan el operador ||, haga que la condicin que ms probablemente sea true sea la de la izquierda. Con esto es posible reducir el tiempo de ejecucin del programa. Utilice la E/S sin formato para obtener el mejor desempeo en el procesamiento de archivos de alto volumen. Cierre explcitamente cada archivo tan pronto como sepa que el archivo ya no volver a hacer referencia al mismo. Esto puede reducir el uso de recursos de un programa que continuar ejecutndose despus de que ya no necesite un archivo particular. Esta prctica tambin mejora la claridad del programa.

SUGERENCIAS DE PORTABILIDAD
1. Debido a que C es un lenguaje estandarizado, independiente del hardware y ampliamente difundido, es frecuente que las aplicaciones escritas en C puedan ejecutarse con pocas o ninguna modificacin en un gran rango de sistemas de cmputo. El empleo de funciones y clases de la biblioteca estndar, en lugar de escribirlas usted mismo, puede mejorar la portabilidad de los programas, debido a que dicho software est incluido en prcticamente todas las implementaciones de C++. Aunque es posible escribir programas portables, hay muchos problemas entre los distintos compiladores de C y C++ y las distintas computadoras que pueden hacer difcil lograr la portabilidad. El simple hecho de escribir programas en C y C++ no lo garantizan. El programador con frecuencia tendr que encarar directamente las variaciones entre compiladores y computadoras. C++ permite identificadores de cualquier longitud, pero el sistema y/o tipo de implementacin de C++ podran aplicar algunas restricciones a la longitud de los identificadores. Utilice identificadores de 31 caracteres o menos, para asegurar la portabilidad. Las manipulaciones de datos al nivel de bits son dependientes de la mquina. El resultado de desplazar a la derecha un valor con signo depende de la mquina. Algunas mquinas rellanan con ceros y otras utilizan el bit de signo. El tipo size_t es un alias dependiente del sistema para el tipo unsigned long o el tipo unsigned int. El mensaje que strerror() genera es dependiente del sistema. En el nuevo estndar preliminar de C++, el alcance de la variable de control declarada en la seccin de inicializacin de una estructura for es diferente del alcance en los compiladores de C++ anteriores,. El cdigo C++ creado con los viejos compiladores de C++ podra fallar al compilarse en los compiladores que son compatibles con el estndar preliminar de C++. Las siguientes son dos estrategias de defensa para evitar este problema: defina las variables de control con nombres diferentes en cada estructura for o, si prefiere emplear el mismo nombre para las variables de control de varias estructuras for, defina la variable de control fuera y antes del primer ciclo for.

2.

3.

4.

5. 6. 7. 8. 9.

10. Las combinaciones de teclas para dar el fin de archivo son dependientes del sistema. 11. Probar por la constante simblica EOF en lugar de 1 hace a los programas ms portables. El estndar ANSI indica que EOF es un valor entero negativo (pero no necesariamente 1) Por lo tanto, EOF podra tener valores diferentes, segn el sistema. 12. Dado que el tamao de los int vara segn el sistema, emplee enteros long si espera procesar enteros que caigan fuera del rango 32767 y si desea ejecutar el programa en diferentes sistemas de cmputo.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-8

MIGUEL . TOLEDO MARTNEZ

13. Por compatibilidad con las versiones anteriores de estndar C++, el valor booleano true tambin puede representarse mediante cualquier valor distinto de cero y el valor booleano false como 0. 14. Cuando le indique al usuario cmo terminar la entrada desde el teclado, pdale que teclee un fin de archivo para terminar la entrada, en vez de pedirle <ctrl>d (para UNIX y Macintosh) o <ctrl>z (PC y VAX).

OBSERVACIONES DE INGENIERA DE SOFTWARE


1. Utilice un enfoque de bloques de construccin para crear programas. Evite reinventar la rueda. Utilice las partes existentes donde sea posible; a esto se le llama reutilizacin de software, lo cual es crucial en la programacin orientada a objetos. Al programar en C++, normalmente utilizar los siguientes bloques de construccin: clases y funciones de la biblioteca estndar de C++, clases y funciones creadas por usted mismo y clases y funciones de diversas bibliotecas no estndar comunes. Cualquier programa en C++ puede construirse con los siete tipos de estructuras de control: if, if/else, switch, while, do/while y for, combinndolas nicamente de dos maneras (apilamiento de estructuras de control y anidamiento de estructuras de control) Las instrucciones compuestas pueden ponerse en cualquier lugar del programa en el que pueda ir una instruccin sencilla. As como pueden ponerse instrucciones compuestas en cualquier lugar donde pueda ir una instruccin sencilla, tambin es posible no tener ninguna instruccin, es decir, tener una instruccin vaca. Esta se representa poniendo un punto y coma (;) donde normalmente ira una instruccin. Cada refinamiento, as como la parte superior misma, es una especificacin completa del algoritmo; lo que vara es el nivel de detalle. Muchos programas pueden dividirse lgicamente en tres fases: Una de inicio, que inicializa las variables del programa; otra de procesamiento, que acepta los datos de entrada y ajusta las variables de programa correspondientes; y otra de terminacin, que calcula e imprime el resultado final. El programador termina el proceso de refinamiento descendente paso a paso cuando especifica el algoritmo con el detalle suficiente para poder convertir el seudo cdigo en cdigo de C++; a partir de aqu, la implementacin del programa en C++ suele ser directa. La experiencia ha mostrado que la parte ms difcil de resolver un problema en una computadora es desarrollar el algoritmo de solucin. Una vez que se ha especificado un algoritmo correcto, el proceso de generacin de un programa C++ funcional a partir de dicho algoritmo suele ser directo. Muchos programadores experimentados escriben programas sin emplear herramientas de desarrollo como el seudo cdigo. Estos programadores sienten que su meta es revolver el problema en la computadora y que la escritura del seudo cdigo simplemente retrasa la obtencin de resultados. Aunque esto podra funcionar en el caso de problemas sencillos y conocidos, puede provocar errores serios y retrasar proyectos grandes y complejos. A veces se pone un punto y como justo despus de un encabezado for para crear un ciclo de retardo. Tal ciclo for con un cuerpo vaco efecta la cantidad indicada de ciclos sin hacer nada ms que contar. Puede utilizar un ciclo de retardo, por ejemplo, para reducir la velocidad de un programa que genera salidas a la pantalla a una velocidad demasiado alta para poderlas leer. Existe un conflicto entre conseguir una ingeniera de software de calidad y lograr el mejor desempeo del software. Es frecuente que se logre una de estas metas a expensas de la otra. El estilo de E/S de C++ es a prueba de tipos. C++ permite un tratamiento comn de la E/S de tipos predefinidos y tipos definidos por el usuario. Este tipo de comunidad facilita el desarrollo de software en general y la reutilizacin del software en particular.

2.

3.

4. 5.

6. 7.

8.

9.

10.

11.

12. 13. 14.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-9

MIGUEL . TOLEDO MARTNEZ

INDICACIONES PARA PRUEBA Y DEPURACIN


1. Los programadores normalmente escriben condiciones como x == 7 con el nombre de la variable a la izquierda y la constante a la derecha. Si el programador las invierte de modo que la constante est a la izquierda y el nombre de la variable a la derecha como en 7 == x, el reemplazo accidental del operador == con = quedar protegido por el compilador. Este tratar esto como error sintctico, pues a la izquierda de una instruccin de asignacin slo se puede poner un nombre de variable. Esto cuando menos evitar el desastre potencial de un error de lgica en tiempo de ejecucin. Utilice su editor de texto para buscar todas las apariciones de = en el programa y comprueba que cada operador est en el lugar correcto.

2.

SUGERENCIAS, OBSERVACIONES Y CONSEJOS: PRIMERA PARTE

SUGERENCIAS-10

Vous aimerez peut-être aussi