Oggi toccheremo la programmazione funzionale. Più specificamente, esamineremo la differenza tra programmazione dichiarativa e imperativa.

Innanzitutto, esaminiamo rapidamente i termini. Quindi confronteremo questi stili di programmazione e vedremo come appaiono in Java e se il linguaggio supporta la loro felice coesistenza.

La programmazione funzionale è un paradigma in cui le funzioni sono intese come funzioni matematiche, non come subroutine, come nella programmazione procedurale . Cioè, in questi due paradigmi interpretare la parola "funzione" in modo diverso. Ricordalo e non confonderli. Java non ti lascia confondere, poiché i sottoprogrammi sono indicati come "metodi", mentre le funzioni si riferiscono a funzioni matematiche (anche: funzioni lambda o riferimento al metodo).

In pratica, nella programmazione procedurale, le funzioni dipendono non solo dalle variabili di input, ma anche da fattori esterni (come altre variabili esterne alla funzione o allo stato del sistema). Ciò significa che chiamare la stessa funzione con gli stessi argomenti ma in un contesto diverso potrebbe produrre risultati diversi. Nella programmazione funzionale, quando una funzione viene chiamata con gli stessi argomenti, produce sempre lo stesso risultato, perché le funzioni dipendono solo dai dati di input.

Vantaggi della programmazione funzionale

  • Migliore affidabilità del codice
  • Comodo test unitario
  • Opportunità per l'ottimizzazione del codice durante la compilazione
  • Opportunità per la concorrenza

Contro della programmazione funzionale

Gli svantaggi della programmazione funzionale derivano da tutte queste stesse caratteristiche:

  • Non ci sono dichiarazioni di assegnazione. Invece, i nuovi valori vengono memorizzati in nuove variabili, portando alla necessità di allocare costantemente e rilasciare automaticamente la memoria. Di conseguenza, la raccolta dei rifiuti altamente efficiente è una parte essenziale di qualsiasi sistema che esegue programmi funzionali.

  • La valutazione non rigorosa significa che l'ordine delle chiamate di funzione è imprevedibile, il che crea problemi di I/O quando l'ordine delle operazioni è importante.

Questo conclude la nostra rapida rassegna della programmazione funzionale. Ora passiamo agli stili di programmazione.

La programmazione imperativa è un paradigma di programmazione caratterizzato dalle seguenti caratteristiche:

  • Il codice sorgente del programma è costituito da istruzioni (istruzioni).

  • Le istruzioni devono essere seguite in sequenza.

  • I dati generati dall'esecuzione di istruzioni precedenti possono essere letti dalla memoria da istruzioni successive.

  • I dati ottenuti eseguendo un'istruzione possono essere scritti in memoria.

Ecco le caratteristiche principali delle lingue imperative:

  • Uso di variabili booleane.
  • Uso dell'operatore di assegnazione.
  • Uso di espressioni composte.
  • Uso di subroutine.

Un programma imperativo è come gli ordini espressi nello stato d'animo imperativo nelle lingue naturali. In altre parole, un programma imperativo è una sequenza di comandi.

I linguaggi di programmazione imperativi includono C e C++.

La programmazione dichiarativa è un paradigma di programmazione in cui viene specificata la soluzione a un problema. Cioè, viene descritto il risultato finale, non il modo per raggiungerlo. HTML è un esempio di linguaggio dichiarativo. Quando scriviamo i tag in questa lingua, non pensiamo a come verranno disegnati gli elementi sulla pagina. Descriviamo solo come dovrebbe apparire la pagina.

Un altro linguaggio di programmazione dichiarativo è SQL.

Mettiamo a confronto i due stili di programmazione considerando un esempio di vita reale: come spieghiamo a una persona come arrivare in un determinato luogo?

Immagina questa situazione: un uomo viene da noi per strada e chiede: "Come arrivo al museo?"

Con un approccio imperativo, gli forniremmo l'algoritmo di come arrivarci a piedi:

  • girati proprio qui
  • camminare per 2 isolati in linea retta
  • gira a destra

Con un approccio dichiarativo, forniremmo semplicemente l'indirizzo e poi la persona arriverebbe da sola nel posto giusto.

Java è attualmente un linguaggio di programmazione multi-paradigma . Multi-paradigma significa che la lingua supporta diversi paradigmi.

Durante la sua lunga evoluzione, il linguaggio ha esteso il suo modello orientato agli oggetti in modo che i suoi utenti dispongano di strumenti diversi e possano scegliere quello migliore per il loro compito specifico.

Di conseguenza, Java attualmente supporta sia l'approccio imperativo (come la scrittura di codice per le chiamate di metodo) sia l'approccio dichiarativo (come le annotazioni disponibili in fase di esecuzione).

Riassumiamo:

  • Esistono vari paradigmi di programmazione.

  • Ci sono approcci dichiarativi e imperativi.

  • Dovresti scegliere quello più adatto per il compito da svolgere.

  • Java è un linguaggio multi-paradigma che supporta entrambi gli approcci.