10 maneras de evitar errores en c ++

Es un hecho lamentable que va a pasar más tiempo buscando y eliminando los errores de lo que pasará en realidad escribir su C ++ programas en el primer lugar. Las sugerencias que aquí pueden ayudar a minimizar el número de errores se introduce en sus programas para hacer la programación de una experiencia más agradable.

Habilitar todas las advertencias y mensajes de error

La sintaxis de C ++ permite una gran cantidad de comprobación de errores. Cuando el compilador encuentra una construcción que no puede descifrar, no tiene más remedio que emitir un mensaje. Intenta sincronizar una copia de seguridad con el código fuente (a veces menos de éxito), pero no va a generar un archivo ejecutable. Esto obliga al programador para arreglar todos los mensajes de error.

Sin embargo, cuando C ++ viene a través de una estructura que se puede averiguar pero la estructura huele a pescado de todos modos, C ++ genera un mensaje de advertencia. Debido a que C ++ es bastante seguro de que entiende lo que quiere, va adelante y crea un archivo ejecutable para que pueda ignorar las advertencias, si quieres. De hecho, si realmente no quiere ser molestado, puede desactivar las advertencias.

Deshabilitar o de otra manera advertencias ignorando es una extraordinaria mala idea. Es un poco como desenchufar el " check engine " la luz en el salpicadero del coche, ya que le molesta. Ignorar el problema no hace que desaparezca.

Adoptar un estilo de codificación clara y consistente

Escribir su código C ++ en un estilo claro y consistente no sólo mejora la legibilidad de su programa, sino que también se traduce en un menor número de errores de codificación. Este sorprendente estado de cosas resulta del hecho de que nuestros cerebros tienen sólo una cantidad limitada de potencia de cálculo.

Cuando se lee el código que está limpia y ordenada, y que sigue un estilo que usted está familiarizado con, que gasta muy poca energía cerebral analizar la sintaxis de las declaraciones de C ++. Esto deja más potencia de CPU cerebro para descifrar lo que el programa está tratando de hacer y no cómo lo está haciendo.

Un buen estilo de codificación le permite hacer lo siguiente con facilidad:

  • Diferenciar entre nombres de clase, nombres de objetos y nombres de funciones

  • Entender lo que la clase, función u objeto se utiliza para, a partir de su nombre

  • Diferenciar símbolos del preprocesador de C ++ símbolos (es decir, #define objetos deben sobresalir)

  • Identificar bloques de código C ++ en el mismo nivel (esto es el resultado de indentación consistente)

Además, es necesario establecer un formato estándar para los encabezados módulo que proporciona información acerca de las funciones o clases en cada módulo, el autor, la fecha, la versión, y algo sobre la historia modificación.

Todos los programadores que participan en un mismo proyecto deben utilizar el mismo estilo de codificación. Un programa escrito en un mosaico de diferentes estilos de codificación es confuso y parece poco profesional.

Comentario del código mientras lo escribes

Usted puede evitar errores si usted comenta tu código mientras lo escribes, en vez de esperar hasta que todo funciona y luego volver atrás y añadir comentarios.

La formulación de comentarios te obliga a hacer un balance de qué es lo que estamos tratando de hacer. Comentarios cortas son esclarecedor, tanto cuando se les leen más tarde y como usted los está escribiendo. Escribir comentarios como si usted está hablando con otro, programador conocedor.

Single-step cada camino en el depurador al menos una vez

Como programador, usted tiene que entender lo que su programa está haciendo. No es suficiente que el programa emite el valor esperado. Es necesario comprender todo lo que su programa está haciendo. Nada de lo que da una mejor idea de lo que está pasando debajo de la capilla de de un solo paso a paso el programa, la ejecución paso a paso con un buen depurador (como el que viene con Code :: Blocks).

Más allá de eso, como se depura un programa, necesita materia prima de averiguar algún comportamiento extraño que pudiera surgir como el programa se ejecuta. Nada de lo que le da ese material mejor que a través de cada función, ya que entra en servicio pisar sola.

Finalmente, cuando una función es terminado y listo para ser añadido al programa, cada camino lógico necesita ser recorrida al menos una vez. Los insectos son mucho más fáciles de encontrar cuando se examina la función por sí mismo en lugar de después de haber sido lanzado en la olla con el resto de las funciones - para entonces, su atención ha pasado a los nuevos retos de programación.

Limite la visibilidad

La limitación de la visibilidad de las partes internas de la clase con el mundo exterior es una piedra angular de la programación orientada a objetos. La clase debe ser responsable de su estado interno - si algo se deja follar hasta en la clase, entonces es culpa del programador clase. El programador de la aplicación debe preocuparse por resolver el problema en cuestión.

En concreto, la visibilidad limitada significa que los miembros de datos no deben ser accesibles fuera de la clase - es decir, deben estar marcados como protegidos. Además, las funciones miembro que el software de aplicación no necesita saber acerca también deben ser marcados protegidos. No exponga más de las partes internas de clase de lo necesario para hacer el trabajo.

Lleve un registro de memoria del montón

La pérdida de un registro de memoria de almacenamiento dinámico es la fuente más común de los errores fatales en los programas que han sido liberados en el campo - y, al mismo tiempo, el problema más difícil de localizar y quitar. (Debido a que este tipo de error es tan difícil de encontrar y quitar, que es frecuente en los programas que usted compra.) Puede que tenga que ejecutar un programa de hora antes que los problemas comienzan a surgir (dependiendo de cuán grande es la pérdida de memoria es).

Como regla general, los programadores siempre deben asignar y liberar memoria de almacenamiento dinámico al mismo ". Nivel " Si una función miembro MyClass :: create () asigna un bloque de memoria del montón y lo devuelve a la persona que llama, entonces debe haber un miembro MyClass :: liberación () que devuelve al montón. Específicamente, MyClass :: create () no debe requerir la función madre para liberar la memoria.

Si es posible, Mi clase debe llevar un registro de este tipo de punteros de memoria por su cuenta y eliminarlos en el destructor.

Cero punteros fuera después de borrar lo que apuntan a

Asegúrese de que usted pone a cero fuera punteros después de que ya no están validez lo hace asignándoles el valor nullptr. Las razones de esta acción se aclaran con la experiencia: Se puede seguir utilizando un bloque de memoria que ha sido devuelto al montón y ni siquiera lo saben. Un programa podría correr bien el 99 por ciento de las veces, lo que es muy difícil encontrar el 1 por ciento de los casos en los que el bloque se reasignan y el programa no funciona.

Si NULL cabo punteros que ya no son válidos y se intenta utilizarlos para almacenar un valor (no se puede guardar nada en o cerca de la ubicación nulo), el programa se bloqueará inmediatamente. Crashing suena mal, pero no es si se expone a un problema. El problema es, por lo que es meramente una cuestión de si le resulta o no antes de ponerlo en producción.

Utilice excepciones para manejar errores

El mecanismo de excepción en C ++ está diseñado para controlar los errores de forma cómoda y eficiente. En general, usted debe lanzar un indicador de error en lugar de devolver un indicador de error. El código resultante es más fácil de escribir, leer y mantener. Además, otros programadores han llegado a esperar, y que no quieren decepcionar a ellos, ¿verdad?

Limite el uso de excepciones a errores verdaderos. No es necesario lanzar una excepción de una función que devuelve un " no funcionó " indicador de si esto es parte de la vida cotidiana para esa función.

Declarar destructores virtuales

No te olvides de crear un destructor de la clase si el constructor asigna recursos como la memoria heap que necesitan ser devuelto cuando el objeto alcanza su desaparición definitiva. Después de haber creado un destructor, no te olvides de declararlo virtual.

" Pero, " tu dices, " mi clase no hereda de nada, y no es una subclase de otra clase ". Sí, pero es podría convertido en una clase base en el futuro. A menos que tenga una buena razón para no declarar el destructor virtual, y luego hacerlo cuando se crea la clase.

Proporcionar un constructor de copia y operador de asignación sobrecargado

Si su clase necesita un destructor, es casi seguro que necesita un constructor de copia y un operador de asignación sobrecargado. Si su constructor asigna recursos como la memoria heap, el constructor de copia por defecto y operador de asignación no harán nada sino crear el caos mediante la generación de múltiples referencias a los mismos recursos.

Cuando se invoca el destructor de uno de estos objetos, restaurará los activos. Cuando el destructor para la otra copia se presente, será enredar las cosas.




» » » » 10 maneras de evitar errores en c ++