Che cos'è esattamente la programmazione procedurale? Quanto è esattamente diverso da OOP? È lo stesso della programmazione funzionale?

32

Sto programmando in Java in uno stile molto orientato agli oggetti (OO). OOP mi viene in modo molto intuitivo, ma ho pochissime conoscenze su altri tipi di programmazione.

Che cos'è esattamente programmazione procedurale ? Quanto è esattamente diverso da OOP? È la stessa cosa di programmazione funzionale ?

Ero solito pensare che tutta la programmazione che non è OO è procedurale. Ma sto iniziando a pensare che questo non sia vero.

    
posta Aviv Cohn 27.02.2014 - 13:05
fonte

4 risposte

68

Wikipedia ha buone spiegazioni per questi termini. Indipendentemente da ciò, ecco il riassunto:

  • La programmazione dichiarativa è l'opposto della programmazione imperativa - specifica cosa calcola piuttosto che come (es. SQL, regex).

  • Programmazione funzionale calcolo dei modelli come espressioni questo (può) produrre valori. Le funzioni sono valori e possono essere passati o restituiti da altre funzioni. La mutazione è scoraggiata; tutte le variabili sono immutabili per impostazione predefinita. Di conseguenza, è più dichiarativo che imperativo, poiché enfatizza ciò che viene calcolato piuttosto che la sequenza di modifiche di stato necessarie per raggiungerlo.

  • Programmazione puramente funzionale non consente affatto la mutazione (anche se contrariamente alla credenza popolare ha ancora meccanismi per ottenere effetti collaterali ).
  • Programmazione funzionale totale vieta inoltre eccezioni e loop infiniti. (Una funzione totale in matematica è una funzione che restituisce un valore per tutti dei suoi input.)

Le loro relazioni sono un po 'complicate perché OOP è un termine piuttosto carico. È possibile utilizzare oggetti in entrambe le lingue funzionali e linguaggi procedurali, ma le lingue che si pubblicizzano come OO sono procedurali. Per confondere ulteriormente il problema:

  • La maggior parte delle persone non sa la differenza tra un oggetto e un tipo di dati astratto
  • I linguaggi OOP mainstream non fanno menzione di ADT, forniscono un supporto molto scarso per loro e pubblicizzano oggetti come The One True Way.
  • Nessuno dice Programmazione orientata al tipo di dati astratti (perché sarebbe una cosa stupida da fare, hai bisogno sia di ADT che di oggetti.)

Ciò induce le persone a pensare che l'OOP sia l'unico modo per ottenere l'astrazione e che la programmazione funzionale e l'OOP siano in qualche modo opposti o mutuamente esclusivi. Molte persone pensano inoltre che tutti i linguaggi funzionali siano puri e non consentano la mutazione.

Inoltre, le persone si muovono generalmente in modo imperativo / procedurale in modo interscambiabile, a volte contrastandolo con OOP (implicando il codice senza astrazione, generalmente C) ea volte contrapponendolo alla programmazione funzionale. Il termine programmazione strutturata è stato per lo più fuori uso per quanto posso dire (probabilmente perché a questo punto la maggior parte delle persone dà per scontato che goto e globals siano considerati dannosi.)

    
risposta data 27.02.2014 - 14:53
fonte
12

La Programmazione procedurale è un approccio alla programmazione che è uno dei fondamenti dei blocchi costitutivi per molti altri progetti linguistici (funzionale a non esserlo).

La maggior parte delle lingue rientrano nel set di "Programmazione procedurale" ed è probabilmente l'approccio di progettazione più naturale per la maggior parte delle persone (se pensi in termini di OO, allora direi che sei in minoranza).

BASIC è procedurale.

Come altri hanno già detto, è un meccanismo per strutturare i programmi in modo sequenziale.

  • Prima faccio x
  • Secondo io faccio y
  • Terzo, faccio Z

Richiede un meccanismo per la definizione di "procedure" - blocchi di codice con nome simili ai metodi OO, che possono accettare zero a molti parametri e facoltativamente restituire un valore (che in genere si chiamerebbe funzione - probabilmente causa della tua confusione con le lingue funzionali)

Il paradigma non stabilisce quali saranno le cose che farai o il modo in cui le cose verranno passate.

Descrive semplicemente che il programma sarà strutturato come una serie di procedure (o funzioni) che operano in modo sequenziale. I dati vengono quindi definiti indipendentemente dalle procedure.

Questo differisce dalla programmazione orientata agli oggetti, che struttura il programma attorno a collezioni di dati e metodi (non funzioni) che agiscono su quei dati.

Un modo per pensarci è in termini di ambito dati.

In un linguaggio procedurale l'ambito è abbastanza semplice. Una variabile può essere nell'ambito di una determinata procedura (dichiarata localmente), fino al livello della cosa principale che chiama roba (dichiarata globalmente), con scope annidati tra.

In un linguaggio orientato agli oggetti si aggiunge un nuovo contesto di scoping, che è quello dell'oggetto attualmente in uso, che è ortogonale a quanto sopra.

Un altro modo di pensare procedurale, in quanto a confronto con l'oggetto è considerare un linguaggio orientato agli oggetti dove tutti i metodi devono essere dichiarati come statici. Il risultato è un linguaggio procedurale in cui le classi possono essere utilizzate per raggruppare insieme le procedure.

    
risposta data 27.02.2014 - 14:48
fonte
5

Programmazione procedurale non è sicuramente una programmazione funzionale.

La programmazione procedurale è quando hai un modello del computer come una macchina nella tua testa, e stai pensando a come sta modificando i dati in memoria. Quindi, per prima cosa imposta A sul valore 3, quindi aggiungi 1 e lo memorizzi nuovamente nella posizione di memoria A (sovrascrivendo il valore precedente).

La programmazione funzionale direbbe che A è 3 e B è A + 1 , e quindi lascia che il computer capisca come calcolare B . Una volta definito A , dovrebbe essere immutabile (non modificabile). Functional consente anche di fare cose come passare una funzione come valore di prima classe (una funzione può assumere una funzione come argomento).

La programmazione orientata agli oggetti spesso combina entrambi, ed è una sorta di ortogonale per entrambi. Puoi usare la programmazione funzionale e restituire un oggetto immutabile, e quell'oggetto può avere un metodo che restituisce un valore calcolato, e persino farlo pigramente - questa è una programmazione funzionale orientata agli oggetti. Puoi anche avere un oggetto che rappresenta un "repository" (versione astratta di un database), e puoi "salvare" cose nel repository e "recuperare" le cose, e lasciare che quell'oggetto gestisca tutti i dettagli di come è fatto . È fondamentalmente una programmazione procedurale orientata agli oggetti.

    
risposta data 27.02.2014 - 14:24
fonte
0

L'OOP non è altro che una forma un po 'raffinata di programmazione procedurale, che appartiene ancora alla più grande famiglia di programmazione imperativa. La prova di tale affermazione è che molti programmatori C # / Java tendono a "fare qualcosa" e preferiscono metodi come:

void doThisAndThat(....) { ... do something ... }

Quindi, un programma che consiste in una serie di metodi void (precedentemente noti come procedure (sic!)) e codice simile:

doThis();
if (state is that) doSomethingElse();
doThat();

è una programmazione procedurale perfetta.

    
risposta data 28.02.2014 - 09:11
fonte

Leggi altre domande sui tag