Técnicas de programación defensiva [cerrado]

7

Estaba intentando identificar un elemento de la ingeniería de software que creo que se pasa por alto, no se enfatiza o no se enseña en el trabajo típico de los cursos de licenciatura para CS o SE. Lo que se me ocurrió es el concepto de programación defensiva. Me gustaría escuchar las opciones de la comunidad sobre el programa de defensa y / o las técnicas específicas que usa regularmente. Además, me gustaría saber si hay alguna técnica específica de lenguaje.

Editar:

Sólo para más claro. No estoy buscando una lección en el programa defensivo. Entiendo lo que es. Esperaba que esto fuera más una discusión acerca de los diferentes métodos que los miembros de la comunidad emplean o encuentran valiosos. Aquí hay algunas técnicas que utilizo. Ten en cuenta que uso C casi exclusivamente.

Norma de codificación. Inicialmente, puede que no piense que esto tiene algo que ver con la programación defensiva, pero sí lo tiene. Para ilustrar, suponga que su estándar de codificación requiere que anteponga nombres de variables con el tipo de variable que es, como IntValue o UIntValue. La convención le permite detectar fácilmente posibles problemas de reglas de promoción como (IntX = IntValue * UIntValue)

Usa macros de preprocesador para constantes. Personalmente, creo que esto también hace que su programa sea más fácil de leer y mantener, pero también proporcionó una red de seguridad. Puede estar seguro de que todas las áreas del código que utilizan la macro se actualizarán cuando cambie el valor. Otros usos de las macros del preprocesador también pueden proporcionar atributos defensivos en su código.

Algunas técnicas están integradas directamente en el lenguaje, como las variables estáticas o las declaraciones de funciones o en el encapsulado de datos c ++.

Por supuesto, hay más obvias, incluida la validación de todas las entradas y salidas.

    
pregunta Pemdas 02.01.2011 - 10:21

3 respuestas

9

Consulte Code Complete 2 , capítulo 8: "Programación defensiva". Para mí fue la mejor fuente para este tipo de técnica hasta ahora. Pequeñas (~ 30 páginas) y las ideas principales están ahí.

Algunos de los conceptos principales copiados estrictamente del libro, con mis palabras (por lo tanto, puede ser mejor comprar el libro y leer el original :-)):

  • Verifique y desinfecte sus entradas;
  • Protege tu rutina de datos incorrectos. No "basura dentro, basura fuera";
  • Use aserciones para documentar condiciones previas y condiciones posteriores;
  • Estandarizar el manejo de excepciones en su código;
  • Considere no usar excepciones para todo: puede manejar los errores de otra manera, el mundo de la programación existía. Se inventaron las excepciones anteriores.
  • La depuración y las aserciones lo ayudan durante el desarrollo, y la mayoría (pero no todas) de las debug / assertions deben estar deshabilitadas en el código de producción;

Pero para mí, el concepto clave se basa en si confía o no en el "otro" código con el que está trabajando.

    
respondido por el Machado 02.01.2011 - 15:30
6

Supongo que nunca tendrá demasiadas afirmaciones en su programa ... Agregue algunos invariantes ajustados a sus clases y tome en cuenta que cualquier referencia / puntero que use será nulo a la vez tiempo u otro ...

    
respondido por el Xavier Nodet 02.01.2011 - 12:09
3

Partes de la programación defensiva se han incorporado mucho en los currículos de aprendizaje aceptados. La programación defensiva implica muchas cosas diferentes, a pesar de que todas giran en torno a "manejar lo inesperado". Los lenguajes principales como Java y C # tienen explícitas "excepciones" y "aserciones" que provienen de la filosofía de programación defensiva. Definitivamente debes usar excepciones en tu código. Las aserciones son más de la programación defensiva "pura" y, a pesar de las siguientes advertencias, debe usarlas con moderación (fuera del código de prueba), pero cuando sea apropiado.

Otros dos aspectos de la programación defensiva tradicional ahora se manejan con nombres diferentes. El primero es simplemente 'Seguridad'. No voy a entrar en todo lo relacionado con la escritura de código seguro aquí.

Otro es "Diseño por Contrato". Este método de programación está fuera de lugar debido al aumento de "Agile", ya que se considera un diseño demasiado cargado al frente. Parte de la razón de esto es doble: primero, muchas de las necesidades anteriores para hacer cumplir los contratos en la programación imperativa ahora son manejadas por la jerarquía de clases OOP de tal manera que es imposible entrar en los estados malos, por lo que no es necesario revisalos. En segundo lugar, muchas de las necesidades tradicionales de verificar parámetros como los desbordamientos de búferes, ahora generan excepciones automáticamente en el tiempo de ejecución y, por lo tanto, el codificador no tiene que verificarlas (el tiempo de ejecución está verificando). Finalmente, hay un impulso, en forma ágil, hacia el desarrollo guiado por pruebas, y a veces es imposible generar pruebas unitarias para condiciones que no se espera que ocurran. En tales casos, un código defensivo hará que su cobertura de código disminuya, lo cual es algo malo.

    
respondido por el Neal Tibrewala 02.01.2011 - 12:09

Lea otras preguntas en las etiquetas