KULTUROSFERA

Subprograme și funcții

Săptămâna trecută, la „Algoritmul unei funcționalități noi", cronometrul tău a ajuns în fața clasei și a funcționat. Apoi au început cererile: „puneți și o pauză", „vreau trei avertizări, nu una", „se poate cu altă culoare la final?". Fiecare cerere a mai adăugat blocuri, iar scriptul care încăpea pe un ecran are acum nevoie de trei. Programele bune nu rămân mici — dar programatorii buni au o armă împotriva creșterii: taie programul în bucăți cu nume.

La finalul lecției vei ști să explici de ce împărțim un program în subprograme, să definești blocuri proprii cu parametri și să refactorizezi un program dat, lăsând în urmă comentarii care chiar ajută.

Programul care nu mai încape pe ecran

Ia un exemplu în care creșterea se vede cu ochiul liber. Un coleg a scris în Scratch, cu creionul, un program care desenează trei pătrate de mărimi diferite — unul cu latura 50, unul cu 100, unul cu 150. Scriptul lui arată așa, în rezumat:

mergi 50 pași / rotește 90° / mergi 50 pași / rotește 90° /
mergi 50 pași / rotește 90° / mergi 50 pași / rotește 90° /
sari la alt loc /
mergi 100 pași / rotește 90° / mergi 100 pași / rotește 90° /
... (încă 6 blocuri identice, doar cu 100)
sari la alt loc /
... (încă 8 blocuri, cu 150)

Peste douăzeci de blocuri, dintre care trei sferturi sunt copii la indigo. Acum vine testul adevărat: profesorul cere ca fiecare pătrat să se deseneze cu colțuri rotunjite, adică rotirea să fie făcută în doi pași mici. Colegul tău trebuie să modifice același lucru în trei locuri. La primul uită, la al doilea greșește un număr, iar programul desenează două pătrate și o spirală. Nu e neîndemânatic — e victima propriei arhitecturi.

Copierea codului are un nume în industrie și o reputație proastă pe măsură: unde e copie, orice modificare trebuie repetată identic peste tot, iar orice loc uitat devine o eroare care se ascunde săptămâni.

Subprogramul: dai un nume unei bucăți

Soluția are peste șaizeci de ani și stă la temelia oricărui limbaj de programare modern.

Cunoști deja modelul din bucătărie: rețeta de tort nu repetă de trei ori pașii blatului — spune „prepară un blat (vezi pagina 12)" și merge mai departe. „Prepară blatul" e un apel; pagina 12 e definiția. La fel, manualul de matematică nu redemonstrează teorema lui Pitagora la fiecare problemă: îi spune pe nume.

În Scratch, subprogramele trăiesc în categoria Blocurile mele. Apeși „Creează un bloc", îi dai un nume — și numele contează enorm. desenează pătrat spune totul; blocul meu 2 nu spune nimic. Regula: numele descrie ce face bucata, cu un verb, atât de limpede încât apelul se citește ca o propoziție.

Blocul tău, cu parametru

Colegul nostru are însă trei pătrate de mărimi diferite. Un bloc „desenează pătrat de 50" ar rezolva doar o treime din problemă. Aici intră în scenă parametrul: la crearea blocului, alegi „Adaugă o intrare" și blocul primește o fereastră în care apelantul pune o valoare.

definește desenează pătrat (latură)repetă de 4 orimergi (latură) pașirotește 90 de grade... iar în scriptul principal, trei apeluri:desenează pătrat (50)desenează pătrat (100)desenează pătrat (150)

Douăzeci și patru de blocuri au devenit o definiție de patru blocuri plus trei apeluri. Iar cererea cu colțurile rotunjite? Se rezolvă acum într-un singur loc — în definiție — și toate cele trei pătrate se schimbă deodată. Acesta e câștigul real al subprogramelor: nu că scrii mai puțin azi, ci că modifici mai puțin mâine.

Refactorizarea, pas cu pas

A doua oră lucrezi pe un program dat de profesor: cronometrul din lecția trecută, în varianta crescută de cererile clasei — cu trei praguri de avertizare, fiecare cu propria secvență de blocuri aproape identică (sunet, schimbare de culoare, mesaj scurt). Sarcina ta: fă-l curat, fără să-i schimbi comportamentul. Operația se numește refactorizare și are un protocol strict:

  1. Rulează programul original și notează exact ce face. Acesta e etalonul.
  2. Identifică secvențele care se repetă sau aproape se repetă. Diferă doar printr-o valoare? Acea valoare e viitorul parametru.
  3. Definește blocul propriu — de exemplu avertizează (mesaj) — și mută secvența în el.
  4. Înlocuiește o singură copie cu un apel. Doar una.
  5. Rulează din nou. Se comportă identic? Abia atunci înlocuiești următoarea copie. Repetă până dispar toate.

Pasul 4 pare exagerat de prudent — de ce nu înlocuim tot dintr-un foc? Pentru că atunci când ceva se strică după cinci înlocuiri simultane, nu știi care dintre ele e vinovată. Câte o schimbare, câte o verificare: mai încet pe hârtie, mult mai rapid în realitate.

Comentarii: scrisori către tine, cel din martie

Programul refactorizat mai are nevoie de un strat: explicațiile. În Scratch, clic dreapta pe zona de scripturi sau pe un bloc și alegi „Adaugă un comentariu" — apare un bilețel galben legat de cod. Calculatorul îl ignoră complet; oamenii, nu.

Un comentariu bun nu repetă ce se vede. „Setează prag la 30" ca bilețel lângă blocul setează prag la 30 e zgomot curat. Comentariul valoros spune ce nu se vede: de ce 30? „Pragul de 30 s a fost cerut de doamna profesoară — nu-l micșora fără să o întrebi" — asta da informație. Peste o lună, când redeschizi proiectul, tu însuți vei fi un străin pentru propriul cod; comentariile sunt scrisorile pe care ți le lași.

Trei locuri merită aproape întotdeauna un bilețel: deasupra fiecărei definiții de bloc (ce face și ce înseamnă parametrii), lângă valorile „magice" (de unde vine numărul), și lângă orice truc care te-a costat o oră de depanare.

Exersează

  1. Ia programul cu cele trei pătrate și adaugă un al doilea parametru blocului: desenează pătrat (latură, culoare). Desenează cele trei pătrate în culori diferite, fără nicio copiere de secvență.
  2. Definește blocul numărătoare (de_la) care numără invers de la valoarea primită până la 0, afișând fiecare valoare. Apelează-l de două ori, cu 10 și cu 5. Verifică: definiția singură, fără apel, face ceva?
  3. În programul refactorizat la clasă, scrie trei comentarii după regula „spune ce nu se vede". Schimbă apoi caietul cu colegul de bancă: înțelege el, doar din comentarii, de ce are programul valorile pe care le are?
  4. Provocare. Blocul desenează poligon (laturi, lungime) desenează orice poligon regulat: triunghi, pătrat, hexagon. Cheia e unghiul de rotire — găsește formula care îl calculează din numărul de laturi și testeaz-o pe cel puțin trei poligoane.

Subprogramele tale au acum nume, parametri și comentarii — dar trăiesc în blocuri colorate. Săptămâna viitoare punem același program față în față cu fratele lui geamăn scris în Python și descoperi că știi deja să citești cod-text. Diferența e mai mică decât crezi.

Verifică-te

Activitate

Se încarcă activitatea…

Activitate

Se încarcă activitatea…

Activitate

Se încarcă activitatea…