Che cos'è esattamente la programmazione procedurale? In che cosa differisce esattamente da OOP? È lo stesso della programmazione funzionale?


32

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

Che cos'è esattamente la programmazione procedurale ? In che cosa differisce esattamente da OOP? È la stessa cosa della programmazione funzionale ?

Pensavo che tutta la programmazione che non fosse OO fosse procedurale. Ma sto iniziando a pensare che questo non sia vero.


9
Condividere la tua ricerca aiuta tutti. Dicci cosa hai provato e perché non ha soddisfatto le tue esigenze. Ciò dimostra che hai impiegato del tempo per cercare di aiutarti, ci salva dal ribadire risposte ovvie e soprattutto ti aiuta a ottenere una risposta più specifica e pertinente. Vedi anche Come chiedere
moscerino il

2
La programmazione procedurale non è la stessa cosa della programmazione funzionale; in realtà è essenzialmente la stessa cosa della programmazione orientata agli oggetti, meno gli oggetti e le classi.
Mason Wheeler,

1
Imperative OOP in realtà è una programmazione procedurale, quindi è esattamente quello che stai facendo tutto il tempo ...
Ingo,

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 calcolare anziché come (ad es. SQL, regex).

  • Calcolo dei modelli di programmazione funzionale come espressioni che (possono) produrre valori. Le funzioni sono valori e possono essere passate o restituite 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 dei cambiamenti di stato necessari per raggiungerlo.

  • La programmazione puramente funzionale non consente del tutto la mutazione (sebbene contrariamente alla credenza popolare abbia ancora meccanismi per ottenere effetti collaterali).
  • La programmazione funzionale totale proibisce inoltre eccezioni e loop infiniti. (Una funzione totale in matematica è una funzione che restituisce un valore per tutti i suoi input.)

Le loro relazioni sono un po 'complicate perché OOP è un termine piuttosto carico. Puoi usare oggetti sia in linguaggi funzionali che in linguaggi procedurali, ma i linguaggi che si pubblicizzano come OO sono procedurali. Per confondere ulteriormente il problema:

  • Molte persone non conoscono la differenza tra un oggetto e un tipo di dati astratto
  • I linguaggi OOP tradizionali non menzionano gli ADT, forniscono un supporto molto scarso per essi e propongono oggetti come The One True Way.
  • Nessuno dice Programmazione orientata al tipo di dati astratti (perché sarebbe una cosa sciocca da fare; hai bisogno sia di ADT che di oggetti.)

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

Inoltre, le persone generalmente si muovono in modo intercambiabile imperativo / procedurale, a volte contrastandolo con OOP (implicando codice senza astrazione, generalmente C) e talvolta contrastandolo con la programmazione funzionale. Il termine programmazione strutturata è 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).


3
"proibisce i salti" è piuttosto generico; che include if / while / etc .. forse "proibisce salti arbitrari"?
Izkata,

@Izkata Un buon punto, è cambiato.
Doval,

1
Potrebbe valere la pena collegarsi effettivamente alle voci di Wikipedia.
haylem,

Ed è per questo che si chiama Object "Oriented" e non Object Only.
JeffO,

1
@OrangeDog In che modo differisce da un tipo di dati astratto, che definisce anche un insieme incapsulato di dati e funzioni che possono agire su di esso? Inoltre, puoi avere oggetti immutabili, quindi in tal caso, quale stato ?
Doval,

12

La programmazione procedurale è un approccio alla programmazione che è una delle basi dei mattoni per molti altri linguaggi (funzionale non essendo uno).

La maggior parte delle lingue rientrano nel set della "Programmazione procedurale" ed è probabilmente l'approccio progettuale più naturale per la maggior parte delle persone (se si pensa in termini di OO, 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, lo faccio
  • In terzo luogo, faccio Z

Richiede un meccanismo per la definizione di "procedure" - blocchi di codice denominato simili ai metodi OO, che possono accettare da zero a molti parametri e facoltativamente restituire un valore (che sarebbe quindi generalmente chiamato una funzione - probabilmente portando alla confusione con i linguaggi funzionali )

Il paradigma non impone quali saranno le cose che farai, o il modo in cui le cose passeranno.

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.

Ciò differisce dalla programmazione orientata agli oggetti, che struttura il programma attorno a raccolte di dati e metodi (non funzioni) che agiscono su tali dati.

Un modo di pensarci è in termini di portata dei 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 ambiti annidati tra.

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

Un altro modo di pensare procedurale, rispetto all'orientamento agli oggetti è quello di considerare un linguaggio orientato agli oggetti in cui tutti i metodi devono essere dichiarati come statici. Il risultato è un linguaggio procedurale in cui le classi possono essere utilizzate per raggruppare le procedure.


5

La programmazione procedurale non è sicuramente una programmazione funzionale.

La programmazione procedurale è quando hai un modello di computer come una macchina in testa e stai pensando a come sta modificando i dati in memoria. Quindi prima imposti Ail valore 3, quindi aggiungi 1 e lo memorizzi Anuovamente nella posizione di memoria (sovrascrivendo il valore precedente).

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

La programmazione orientata agli oggetti spesso combina entrambi, ed è una specie di ortogonale ad 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" roba nel repository e "recuperare" roba, e lasciare che l'oggetto gestisca tutti i dettagli di come è stato fatto . Questa è sostanzialmente una programmazione procedurale orientata agli oggetti.


0

OOP non è altro che una forma un po 'raffinata di programmazione procedurale, che appartiene di nuovo alla grande famiglia della programmazione imperativa. 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 un mucchio di metodi vuoti (precedentemente noti come procedure (sic!)) E codice come:

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

è una programmazione procedurale perfetta.


doThisAndThat (....) implica che un metodo farà più di una cosa che non è in generale una buona pratica. Gli sviluppatori Java e C # aderiscono principalmente al principio della responsabilità singola. Penso che la tua analogia sia difettosa. objectmentor.com/resources/articles/srp.pdf
JohnK,

@JohnK So che non è una buona pratica. Eppure comune. Soprattutto tra gli sviluppatori Java, se si può giudicare da ciò che si vede ogni giorno su SO.
Ingo,

@JohnK Gli sviluppatori Java e C # aderiscono principalmente al principio della responsabilità singola - servizio Lip?
Ingo,

Gli sviluppatori Java aderiscono principalmente alla responsabilità singola? Se solo fosse vero nella vita reale ...
Sridhar Sarnobat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.