¿Existe una mejor estrategia que confiar en el compilador para detectar errores?

8

He estado programando en C y C ++ durante algún tiempo, aunque diría que estoy lejos de ser un experto. Durante algún tiempo, he estado usando varias estrategias para desarrollar mi código, como pruebas unitarias, diseño basado en pruebas, revisiones de código, etc.

Cuando escribí mis primeros programas en BASIC, escribí largos bloques antes de encontrar que no se ejecutarían y que era una pesadilla para depurar. Entonces aprendí a escribir un poco y luego probarlo.

En estos días, a menudo me encuentro escribiendo repetidamente un pequeño código y luego usando el compilador para encontrar todos los errores. Eso está bien si detecta un error tipográfico, pero cuando comienzas a ajustar los tipos de parámetros, etc. solo para compilarlo, puedes arruinar el diseño. También parece que el compilador se está arrastrando al proceso de diseño cuando solo debe usarse para verificar la sintaxis.

Aquí existe el peligro de depender demasiado del compilador para mejorar mis programas. ¿Hay mejores estrategias que esta?

Recuerdo vagamente hace algún tiempo un artículo sobre una compañía que desarrollaba un tipo de compilador de C donde un archivo de encabezado adicional también especificaba los prototipos. La idea era que las inconsistencias en la definición de API serían más fáciles de detectar si tuviera que definirlo dos veces de diferentes maneras.

koan
fuente
Confíe en el programador para detectar errores ... mediante análisis, comprensión, pruebas y compilación.
dietbuddha

Respuestas:

13

No ajuste las cosas para que se compile. Ajusta las cosas para que sean correctas . Si fue "diseñado" para que los tipos de parámetros no coincidan, entonces el diseñador no tiene idea de lo que están haciendo.

Si no desea confiar en el compilador, mejore su conocimiento del idioma. Estudie la estructura de definiciones y declaraciones, y verifique lo que escribe en busca de errores antes de compilar. Y use revisiones de código.

Esa idea de prototipos adicionales suena mal. Si lo diseñas incorrectamente una vez, ¿qué impide que el segundo diseño se diseñe incorrectamente? Y al usar diferentes formatos / paradigmas / etc. para la misma cosa, es probable que confundas a las personas. Me aseguraría de que todos entiendan el formato primario para que pueda concentrarse en hacer el diseño correcto la primera vez, en lugar de duplicar el trabajo de diseño para detectar errores. Como todo lo demás, los diseños deben ser refactorizados, pero no creo que hacerlo dos veces tenga mucho sentido.

Matthew Read
fuente
Creo que el diseñador (yo) no recordaba el parámetro de la otra función correctamente, probablemente porque estoy pensando en una versión anterior del diseño.
koan
El segundo archivo de encabezado no se escribió en el estándar C y creo que tenía la forma de prototipos de nivel superior. La idea era que si sus dos definiciones diferentes definían lo mismo, entonces es más probable que su diseño sea correcto. No se trataba de dos archivos de encabezado C estándar, sino con diferentes "tipeos".
koan
Pero eso fue en la etapa de implementación, ¿verdad? De cualquier manera, simplemente cámbielo para seguir el diseño o cambie el diseño para que sea correcto ... no solo haga feliz al compilador;). Actualizaré mi respuesta para reflejar su explicación de los prototipos.
Matthew leyó el
Entiendo su punto y creo que es una buena respuesta, pero ¿en qué etapa dice "Vaya, tengo que detener toda implementación y volver a hacer el diseño correctamente", porque "simplemente cambiar el diseño" también se puede hacer rápidamente rápido, a fondo o demasiado a fondo ...
koan
Esa es una pregunta realmente difícil de responder. Creo que es más un sentimiento basado en la experiencia que cualquier otra cosa, excepto cuando te encuentras con el raro "whoa, entendimos mal este problema, necesitamos volver a hacer el diseño".
Mateo leyó el
4

Honestamente, creo que tu objetivo SIEMPRE debe ser escribir un programa que se compile por primera vez. Me doy cuenta de que esto es difícil y probablemente no sucederá con frecuencia, pero aún así debería ser su objetivo. Piense en el software como una pieza de hardware. Hazte creer que es poco costoso recompilar tu código (como refabricar una placa). Un cumplidor no es un depurador y no debe tratarse como tal.

Pemdas
fuente
+1 para "el compilador no es un depurador"
Joris Meys
Interesante. Siempre me sentí mucho más cómodo si encontraba un error porque inevitablemente existen en mi código, es solo que todavía no los he encontrado. Sin embargo, mi pregunta no es tanto sobre depuración; Estoy buscando estrategias para diseñar o escribir código que sean más efectivas para producir un buen código. Por ejemplo, si su compilador da más de X mensajes de error no triviales, debe detenerse y repensar el diseño; o algo.
koan
Creo que su mejor apuesta en términos de aprender a escribir un buen código es leer un libro sobre. Recomiendo Code Complete. Es el mejor libro que he leído personalmente sobre el software en general.
Pemdas
Siento que estás tratando de anular el problema al no tenerlo en primer lugar. Eso no es malo, pero finalmente habrá problemas que surjan durante la compilación, después de todo, nadie es perfecto.
koan
1
Si bien un compilador no es un depurador, una de mis formas preferidas de realizar ciertas refactorizaciones es hacer que el código antiguo no se compile (quizás cambiando el nombre). Hace que sea fácil encontrar cosas que se perdieron.
sdg
3

El compilador no puede encontrar todos los errores, por lo que no tiene sentido fingir que sí. Todo lo que puede encontrar son los errores de sintaxis y los errores tipográficos. Es lo suficientemente bueno para eso que lo dejo hacer esa parte del trabajo (aunque en estos días el entorno atrapa el 99% de los mismos antes de que llegue a compilar), pero sé perfectamente que no son todos los errores.

La única vez que confío en ese tipo de información para decirme qué escribir es cuando recibo cosas como esta diciéndome que no puede convertir automáticamente un doble en flotante, si a dónde envía los datos espera flotantes (y desde lo que estoy haciendo actualmente es jugar con la biblioteca XNA que hace exactamente esto) y la fuente devuelve dobles (como es el caso de la biblioteca matemática C #), entonces simplemente tiene que convertir.

Loren Pechtel
fuente
1

El compilador es una herramienta. Como con todas las herramientas, se puede abusar de ellas.

Cuando comienzas por primera vez con un lenguaje, no hay nada de malo en usar el compilador a ciegas para probar tu programa. Así es como funciona el aprendizaje, adivina y comprueba. Sin embargo, eso no significa que deba continuar codificando así.

Le conviene entender el idioma lo suficientemente bien como para poder compilar su programa en su cabeza. Entonces pasarás menos tiempo esperando que el compilador termine.

Digo que probablemente sea mejor que el programa esté siempre dentro de unas pocas líneas / bloques de código de compilación.

Jeremy Heiler
fuente
0

La mayoría de los IDE modernos detectan muchos problemas de compilación y creo que también me he vuelto bastante dependiente de esto.

¿Tal vez volver a los archivos de texto y compiladores de línea de comandos?

ozz
fuente
¡No uso un IDE! Tal vez debería comenzar? Siempre pensé que debería, pero nunca encontré uno con el que estuviera feliz.
koan