Astăzi vom aborda programarea funcțională. Mai precis, ne vom uita la diferența dintre programarea declarativă și imperativă.

Mai întâi, să trecem rapid peste termeni. Apoi vom compara aceste stiluri de programare și vom vedea cum apar ele în Java și dacă limbajul sprijină coexistența lor fericită.

Programarea funcțională este o paradigmă în care funcțiile sunt înțelese ca funcții matematice, nu ca subrutine, ca în programarea procedurală . Adică, în aceste două paradigme interpretează diferit cuvântul „funcție”. Amintiți-vă acest lucru și nu le încurca. Java nu te lasă să fii confuz, deoarece subprogramele sunt denumite „metode”, în timp ce funcțiile se referă la funcții matematice (de asemenea: funcții lambda sau referință la metode).

În practică, în programarea procedurală, funcțiile depind nu numai de variabilele de intrare, ci și de factori externi (cum ar fi alte variabile din afara funcției sau de starea sistemului). Aceasta înseamnă că apelarea aceleiași funcții cu aceleași argumente, dar într-un context diferit, poate produce rezultate diferite. În programarea funcțională, atunci când o funcție este apelată cu aceleași argumente, produce întotdeauna același rezultat, deoarece funcțiile depind doar de datele de intrare.

Avantajele programării funcționale

  • Fiabilitate îmbunătățită a codului
  • Testare unitară convenabilă
  • Oportunități de optimizare a codului în timpul compilării
  • Oportunități de concurență

Contra programării funcționale

Dezavantajele programării funcționale provin din toate aceste caracteristici:

  • Nu există declarații de atribuire. În schimb, noile valori sunt stocate în noi variabile, ceea ce duce la necesitatea alocarii în mod constant și a eliberării automate a memoriei. Ca rezultat, colectarea gunoiului în mod foarte eficient este o parte esențială a oricărui sistem care execută programe funcționale.

  • Evaluarea nestrictă înseamnă că ordinea apelurilor de funcții este imprevizibilă, ceea ce creează probleme I/O atunci când ordinea operațiilor este importantă.

Asta încheie revizuirea noastră rapidă a programării funcționale. Acum să trecem la stilurile de programare.

Programarea imperativă este o paradigmă de programare caracterizată prin următoarele caracteristici:

  • Codul sursă al programului constă din instrucțiuni (instrucțiuni).

  • Instrucțiunile trebuie urmate secvenţial.

  • Datele generate prin executarea instrucțiunilor anterioare pot fi citite din memorie prin instrucțiunile ulterioare.

  • Datele obținute prin executarea unei instrucțiuni pot fi scrise în memorie.

Iată principalele caracteristici ale limbajelor imperative:

  • Utilizarea variabilelor booleene.
  • Utilizarea operatorului de atribuire.
  • Utilizarea expresiilor compuse.
  • Utilizarea subrutinelor.

Un program imperativ este ca ordinele exprimate în modul imperativ în limbile naturale. Cu alte cuvinte, un program imperativ este o secvență de comenzi.

Limbajele de programare imperative includ C și C++.

Programarea declarativă este o paradigmă de programare în care este specificată soluția unei probleme. Adică, rezultatul final este descris, nu modalitatea de a-l atinge. HTML este un exemplu de limbaj declarativ. Când scriem etichete în această limbă, nu ne gândim la modul în care vor fi desenate elementele pe pagină. Descriem doar cum ar trebui să arate pagina.

Un alt limbaj de programare declarativ este SQL.

comparăm cele două stiluri de programare luând în considerare un exemplu din viața reală: cum îi explicăm unei persoane cum să ajungă într-un anumit loc?

Imaginați-vă această situație: un bărbat vine la noi pe stradă și ne întreabă: „Cum ajung la muzeu?”

Cu o abordare imperativă, i-am furniza algoritmul cum să ajungă acolo pe jos:

  • întoarce-te chiar aici
  • parcurgeți 2 blocuri în linie dreaptă
  • vireaza la dreapta

Cu o abordare declarativă, am da pur și simplu adresa, iar apoi persoana ar ajunge singură la locul potrivit.

Java este în prezent un limbaj de programare cu mai multe paradigme . Multi-paradigma înseamnă că limbajul acceptă mai multe paradigme.

Pe parcursul lungii sale evoluții, limbajul și-a extins modelul orientat pe obiecte, astfel încât utilizatorii săi să aibă diferite instrumente și să poată alege pe cel mai bun pentru sarcina lor specifică.

Ca rezultat, Java suportă în prezent atât abordarea imperativă (cum ar fi scrierea codului pentru apelurile de metodă), cât și abordarea declarativă (cum ar fi adnotările disponibile la runtime).

Să rezumăm:

  • Există diverse paradigme de programare.

  • Există abordări declarative și imperative.

  • Ar trebui să-l alegeți pe cel mai potrivit pentru sarcina în cauză.

  • Java este un limbaj multi-paradigmă care acceptă ambele abordări.