Programación de partidos

La programación de coincidencias , a veces denominada "programación aleatoria", es un enfoque del desarrollo de software en el que el programador resuelve un problema de forma iterativa, realizando pequeños cambios ( permutaciones ) y probando cada cambio para ver si se comporta como se desea.

Este enfoque a veces parece atractivo cuando el programador no comprende completamente el código y cree que uno o más pequeños cambios pueden conducir a un código correcto.

Ejemplo

Por ejemplo, el siguiente ejemplo de código C (diseñado para buscar y copiar una secuencia de dígitos de una cadena grande) tiene varios problemas:

char * búfer = "123abc" ; char destino [ 10 ]; int i = 0 ; int j = 0 ; intl = strlen ( búfer ) ; mientras ( yo < l ) { if ( es un dígito ( búfer [ i ])) { destino [ j ++ ] = búfer [ i ++ ]; } ++ yo ; } destino [ j ] = '\0' ; printf ( "%s \n " , destino );

Pero esto no da el resultado correcto. Para una cadena inicial dada, imprime "13" mientras que el resultado correcto es "123". Un programador que no ve el problema estructural podría saltar en un comando y decir: "Sí, eso es un incremento de uno adicional". Elimina la línea "++i", pero el programa se repite durante la prueba. "Vaya, aumento incorrecto". El comando se vuelve a poner en su lugar y se elimina mediante la variable de incremento posterior i en la línea de arriba:

if ( es un dígito ( búfer [ i ])) { destino [ j ++ ] = búfer [ i ]; }

Durante la prueba, el código ahora produce la respuesta correcta, "123". Sin embargo, dado que el programador no se ha molestado en comprender completamente el código, persisten los siguientes problemas:

  • Si la entrada contiene varios números separados por caracteres no numéricos (por ejemplo, "123ab456"), todos los dígitos de una fila irán al búfer de destino.
  • Si la entrada es más larga que el búfer de destino, el búfer de destino se desbordará.
  • Si la entrada es más larga que INT_MAX, el comportamiento se vuelve indefinido porque strlen() devuelve un valor entero sin signo de tipo size_t que puede almacenar un valor mayor que el máximo para un entero con signo.
  • Si, en la plataforma que se utiliza, el tipo de char está firmado y la entrada contiene caracteres que no están en el rango de 0 a UCHAR_MAX después de convertirse en int, llamar a isdigit() da como resultado un comportamiento indefinido.

Si bien la solución será apropiada para un determinado conjunto de entradas, no es correcta para todas esas entradas y los comentarios sobre dicho código persistirán con el tiempo.

Notas