Programare declarativa vs programare imperativa

Cum preferati sa scrieti/vedeti codul pentru o anumita solutie ?

  1. Declarativ - Declari si imparti logica in asa fel incat sa se poate compuna automat, va folositi de recursivitate peste tot unde este posibil, preferati imutabilitatea, programarea functionala si spuneti cum arata un buton in loc de a-l crea cu instructiuni e.g button: { size: smallButton, color: green}
  2. Imperativ - Scrieti efectiv fiecare pas al algoritmului, creati de exemplu un buton cu instructiuni gen new Button, setSize, setColor, setX si il modificati cu alte instructiuni

De ce ? Am poate prejudecata ca incepatorii folosesc in mare parte cod imperativ si cei cu ceva mai multa experienta cod declarativ, cu micile exceptii cand e nevoie de eficienta maxima.

Unde apuc si este posibil, bag streams cu map, filter, flatMap din java.
Am java 8, dar macar este bun si ala.

Am observat ca este mai usor de citit decat for cu tot felul de if-uri

Pe frontend mai bag prin js. Folosesc JSF cu Primefaces, deci nu prea apuc sa scriu in JS.

nu am vazut niciodata folosit in productie, mie mi-ar fi frica de stackoverflow, dar prefer declarativ si functional pt ca e mai sigur.

Eu folosesc mereu recursivitate când trebuie să parcurg structuri arborescente de date (de exemplu array de array-uri, când parsezi xml sau json etc). Mi se pare mult mai natural aşa decât să mă chinui să simulez recursivitatea prin iteraţii complicate.

In 95% din cazuri folosesc “imperativ” mai ales ca de obicei imi las deschisa optiunea de a extinde codul pe cai cat mai nebanuite (din experienta cu clientii care faceau specificatiile de-a lungul dezvoltarii :))

Recursivitatea e buna dar eu cred ca trebuie folosita cu precautie. De exemplu nu trebuie folosita in medii concurente (servicii web?). Oricum aici e o discutie destul complexa pentru ca recursiv trebuie sa procesezi o cantitate rezonabila de date iar rezonabilul asta depinde de mai multe aspecte (memorie, concurenta, file descriptors, etc).

LE. Exemplu sugestiv de folosire incorecta a recursivitatii:
Poti calcula PoW recursiv sau nu, totusi atingerea unei solutii la o dificultate medie se poate face in cate zeci sau sute de pasi dar in acelasi timp si in sute de mii sau milioane de pasi. Particularitatea este ca numarul de pasi nu pote fi anticipat nicicum. Asta inseamna ca daca un astfel de caz il tratezi recursiv ca serviciu web concurent poti avea crash-uri aleatoare la care nu vei putea face nimic.