Match programmering

Matchprogrammering , nogle gange omtalt som "tilfældig programmering", er en tilgang til softwareudvikling, hvor programmøren løser et problem iterativt, laver små ændringer ( permutationer ) og tester hver ændring for at se, om den opfører sig som ønsket.

Denne tilgang virker nogle gange attraktiv, når programmøren ikke helt forstår koden og mener, at en eller flere små ændringer kan føre til kode, der er korrekt.

Eksempel

For eksempel har følgende C -kodeeksempel (designet til at finde og kopiere en sekvens af cifre fra en stor streng) flere problemer:

char * buffer = "123abc" ; char destination [ 10 ]; int i = 0 ; int j = 0 ; intl = strlen ( buffer ) ; mens ( i < l ) { if ( isdigit ( buffer [ i ])) { destination [ j ++ ] = buffer [ i ++ ]; } ++ i ; } destination [ j ] = '\0' ; printf ( "%s \n " , destination );

Men dette giver ikke det rigtige resultat. For en given startstreng udskriver den "13", mens det korrekte resultat er "123". En programmør, der ikke kan se det strukturelle problem, kan springe på én kommando og sige: "Ja, det er et ekstra trin." Det fjerner "++i"-linjen, men programmet går i løkker, når det testes. "Ups, forkert forstørrelse." Kommandoen sættes tilbage på plads og fjernes af post-increment-variablen i på linjen ovenfor:

if ( isdigit ( buffer [ i ])) { destination [ j ++ ] = buffer [ i ]; }

Under testen producerer koden nu det rigtige svar, "123". Men da programmøren ikke har gidet at forstå koden fuldt ud, forbliver følgende problemer:

  • Hvis inputtet indeholder flere tal adskilt af ikke-numeriske tegn (f.eks. "123ab456"), vil alle cifre i en række gå ind i målbufferen.
  • Hvis inputtet er længere end målbufferen, vil målbufferen flyde over.
  • Hvis input er længere end INT_MAX, bliver adfærden udefineret, fordi strlen() returnerer en heltalsværdi uden fortegn af typen size_t, der kan lagre en værdi, der er større end maksimum for et fortegnsheltal.
  • Hvis char-typen på den platform, der bruges, er signeret, og inputtet indeholder tegn, der ikke er i intervallet 0 til UCHAR_MAX efter at være blevet castet til int, resulterer kald af isdigit() i udefineret adfærd.

Selvom løsningen vil være passende for et bestemt sæt af input, er den ikke korrekt for alle sådanne input, og kommentarer til en sådan kode vil fortsætte over tid.

Noter