Programarea meciurilor

Programarea cu potriviri , denumită uneori „programare aleatorie”, este o abordare a dezvoltării software în care programatorul rezolvă o problemă în mod iterativ, făcând mici modificări ( permutări ) și testând fiecare modificare pentru a vedea dacă se comportă așa cum se dorește.

Această abordare pare uneori atractivă atunci când programatorul nu înțelege pe deplin codul și consideră că una sau mai multe mici modificări pot duce la un cod corect.

Exemplu

De exemplu, următorul exemplu de cod C (conceput pentru a găsi și copia o secvență de cifre dintr-un șir mare) are mai multe probleme:

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

Dar acest lucru nu dă rezultatul corect. Pentru un șir de început dat, se afișează „13”, în timp ce rezultatul corect este „123”. Un programator care nu vede problema structurală ar putea sări la o comandă și să spună: „Da, asta este un increment suplimentar”. Îndepărtează linia „++i”, dar programul face bucle la testare. „Hopa, mărire greșită”. Comanda este repusă la loc și eliminată de variabila post-increment i pe linia de mai sus:

if ( isdigit ( buffer [ i ])) { destinație [ j ++ ] = buffer [ i ]; }

În timpul testării, codul produce acum răspunsul corect, „123”. Cu toate acestea, deoarece programatorul nu s-a deranjat să înțeleagă pe deplin codul, rămân următoarele probleme:

  • Dacă intrarea conține mai multe numere separate prin caractere nenumerice (de exemplu, „123ab456”), toate cifrele dintr-un rând vor intra în memoria tampon țintă.
  • Dacă intrarea este mai lungă decât tamponul țintă, atunci tamponul țintă se va depăși.
  • Dacă intrarea este mai lungă decât INT_MAX, atunci comportamentul devine nedefinit deoarece strlen() returnează o valoare întreagă fără semn de tip size_t care poate stoca o valoare mai mare decât maximul pentru un întreg cu semn.
  • Dacă, pe platforma utilizată, tipul char este semnat și intrarea conține caractere care nu se află în intervalul 0 până la UCHAR_MAX după ce a fost turnată în int, atunci apelarea isdigit() are ca rezultat un comportament nedefinit.

Deși soluția va fi adecvată pentru un anumit set de intrări, nu este corectă pentru toate aceste intrări, iar comentariile asupra unui astfel de cod vor persista în timp.

Note