vineri, august 12, 2005

Un alt nivel de abstractizare

Problema abstractizarii ma preocupa in mod deosebit. Imi dau seama ca mintea umana este facuta sa lucreze asa. Ignoram amanuntele si ne jucam numai cu un set de aspecte. Altfel nu am face fata complexitatii. Cine incerca sa stapaneasca tot cu siguranta va pierde si ceea ce are.

In POO, atunci cand un API se vrea a fi facut accesibil si de ceilalti membri ai aplicatiei, acesta se publica (Martin Fowler vorbeste intr-un articol al lui despre public versus publicat). In acest sens un principiu bun de programare sugera ca metodele care vor putea fi accesate de ceilalti sa fie numite publice, iar cele care au rol doar local cu posibilitati mari de modificare sa fie facute private. In ultimul timp a aparut ideea programarii pe interfete (folosit pe larg in framework-ul Spring). Acest lucru face ca fiecarei clase definite sa i se specifice si interfata care contine declaratia metodelor ce se vor a fi executate din exterior. Interfata devine astfel un contract in fata clasei care o implementeaza. Acest lucru, semnifica faptul ca metodele lui pot fi folosite de ceilalti, cu garantia ca semnatura lor nu se va schimba deci cu posibilitatea minima de a aparea incompatibilitati in timp.

In lumea calculatoarelor se intampla aproape la fel. Programam in API-uri care reprezinta colectii de clase deja definite. Nu lucram cu mnemonicile microprocesorului. De mult nu se mai lucreaza asa. Calculatorul a ajuns sa fie infasurat in asa masura in API-uri software incat apoape ca putem sa-i ignoram existenta (si un pocket este la fel de bine invelit). Putem considera ca ceea ce e dincolo de nivelul cu care interactionam nici nu exista. O dovada este faptul ca putem trimite e-mai-uri dintr-o aplicatie Web fara sa cunoastem protocoale de retea sau altceva. Practic, apelam o metoda a unei clase.

Prin contructia sa limbajul Java cu precadere foloseste principiul de abstractizare. Astfel, se lucreaza initial cu o masina virtuala neoptimizata fara a se tine cont ca peste un timp ea este facuta mai performanta. Acest lucru pentru ca interactiunea cu masina virtuala se faca independent de structura ei interna. Optimizarea ei este o problema a specialistilor. Folosirea ei este o problema a dezvoltatorilor.