Sto programmando in Java in uno stile molto orientato agli oggetti (OO). LOOP mi viene molto intuitivo, ma ho pochissime conoscenze su altri tipi di programmazione.
Che cosè esattamente la programmazione procedurale ? In che modo esattamente è diverso da OOP? È la stessa cosa della programmazione funzionale ?
Pensavo che tutta la programmazione che non è “t OO è procedurale. Ma io” Sto cominciando a pensare che non sia “vero.
Commenti
- Condividere la tua ricerca aiuta tutti. Dicci cosa vuoi ‘ ci ho provato e perché non ha soddisfatto le tue esigenze. Ciò dimostra che hai dedicato del tempo per cercare di aiutare te stesso, ci evita di ripetere le risposte ovvie e soprattutto ti aiuta a ottenere un risposta specifica e pertinente. Vedi anche How to Ask
- 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.
- Limperativo OOP in realtà è programmazione procedurale, quindi è esattamente cosa ‘ fai sempre …
Rispondi
Wikipedia fornisce buone spiegazioni per questi termini. Indipendentemente da ciò, ecco il riepilogo:
- Programmazione imperativa modella il calcolo come una sequenza di istruzioni che alterano lo stato mutabile.
- La programmazione procedurale è una programmazione imperativa che suddivide il codice in subroutine.
- La programmazione strutturata è un approccio più disciplinato alla programmazione procedurale che proibisce salti arbitrari (ad es. goto) e modifiche allo stato globale.
-
La programmazione dichiarativa è lopposto della programmazione imperativa: specifica cosa calcolare piuttosto che come (ad esempio SQL, regex).
-
Programma funzionale ming modella il calcolo 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 di cambiamenti di stato necessari per ottenerlo.
- La programmazione puramente funzionale non consente completamente la mutazione (sebbene contrariamente alla credenza popolare abbia ancora meccanismi per raggiungere il lato effetti).
- Programmazione funzionale totale inoltre vieta eccezioni e cicli infiniti (una funzione totale in matematica è una funzione che restituisce un valore per tutti i suoi input)
- La programmazione orientata agli oggetti sottolinea il uso di oggetti / interfacce per ottenere astrazione e modularità.
Le loro relazioni sono un po complicate perché OOP è un termine piuttosto carico. È possibile utilizzare oggetti sia nei linguaggi funzionali che nei linguaggi procedurali, ma i linguaggi che si pubblicizzano come OO sono procedurali. Per confondere ulteriormente il problema:
- La maggior parte delle persone non conosce la differenza tra un oggetto e un tipo di dati astratto
- I linguaggi OOP mainstream non fanno menzione degli ADT, forniscono un supporto molto scarso per loro e pubblicizzano gli oggetti come The One True Way.
- Nessuno dice Abstract Data Type-Oriented Programming (perché “sarebbe una cosa stupida da fare; hai bisogno sia di ADT che di oggetti.)
Questo fa sì che le persone pensino che lOOP sia lunico modo per ottenere lastrazione, e che programmazione funzionale e OOP sono in qualche modo opposti o si escludono a vicenda. Molte persone pensano anche che tutti i linguaggi funzionali siano puri e non consentano la mutazione.
Inoltre, le persone generalmente girano in modo intercambiabile imperativo / procedurale, a volte confrontandolo con OOP (che implica codice senza astrazione, generalmente C) e talvolta contrapponendolo alla programmazione funzionale.Il termine programmazione strutturata è perlopiù caduto in disuso per quanto ne so (probabilmente perché a questo punto la maggior parte delle persone dà per scontato che goto e globali siano considerati dannosi).
Commenti
- ” vieta i salti ” è piuttosto generico; che include if / while / etc .. forse ” vieta salti arbitrari “?
- @Izkata Buon punto, modificato.
- Potrebbe valere la pena collegarlo alle voci di wikipedia.
- E questo ‘ è il motivo per cui ‘ si chiama Object ” Oriented ” e non solo oggetto.
- @OrangeDog Comè qualsiasi diverso da un tipo di dati astratto, che anche definisce un insieme incapsulato di dati e funzioni che possono agire su di esso? Inoltre, puoi avere oggetti immutabili, quindi in tal caso, quale stato ?
Risposta
La programmazione procedurale è un approccio alla programmazione che è uno degli elementi di base di molti altri design di linguaggi (funzionale non essendo uno).
La maggior parte dei linguaggi rientrano nella serie di “Programmazione procedurale” ed è probabilmente lapproccio progettuale più naturale per la maggior parte delle persone (se pensi in termini di OO, allora direi che sei una minoranza).
BASIC è procedurale.
Come altri hanno detto, è un meccanismo per strutturare i programmi in modo sequenziale.
- Prima faccio x
- Secondo faccio y
- Terzo, faccio Z
Richiede un meccanismo per definire “procedure” – blocchi di codice con nome simili ai metodi OO, che possono accettare da zero a molti parametri, e facoltativamente restituire un valore (che sarebbe quindi generalmente chiamata una funzione, probabilmente portando alla tua confusione con i linguaggi funzionali)
Il par digm non determina 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 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 quei dati.
Un modo per pensarci è in termini di ambito dei dati.
In un linguaggio procedurale, lo scoping è abbastanza semplice. Una variabile può trovarsi nellambito di una data procedura (dichiarata localmente), fino al livello dellelemento superiore che chiama roba (dichiarata globalmente), con ambiti nidificati tra.
In un linguaggio orientato agli oggetti tu aggiungere un nuovo contesto di scoping, essendo quello delloggetto attualmente in uso, che è ortogonale a quanto sopra.
Un altro modo di pensare al procedurale, rispetto a quello orientato agli oggetti, è 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 le procedure.
Risposta
La programmazione procedurale non è sicuramente una programmazione funzionale.
La programmazione procedurale è quando hai un modello del computer come macchina nella tua testa e stai pensando a come “sta modificando i dati in memoria. Quindi prima imposti A
al valore 3, quindi aggiungi 1 e lo memorizzi nuovamente nella posizione di memoria A
(sovrascrivendo il valore precedente) .
La programmazione funzionale direbbe A
è 3 e B
è A + 1
e quindi lasciare che il computer capisca come calcolare B
. Una volta definito A
, dovrebbe essere immutabile (non modificabile). Funzionale ti consente anche di eseguire operazioni come passare una funzione come prima cosa. valore della classe (una funzione può accettare una funzione come argomento).
La programmazione orientata agli oggetti spesso combina entrambi ed è in un certo senso ortogonale ad entrambi. Puoi usare la programmazione funzionale e restituire un oggetto immutabile, e questo oggetto può avere un metodo che restituisce un valore calcolato, e lo fa anche pigramente – questa è la 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” cose e lasciare che quelloggetto gestisca tutti i dettagli di come ” È fatto. Questa è fondamentalmente una programmazione procedurale orientata agli oggetti.
Risposta
LOOP non è altro che una forma un po raffinata di programmazione procedurale , che ancora una volta appartiene alla grande famiglia della programmazione imperativa.Prova di questa 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 gruppo di metodi-void (precedentemente noti come procedure (sic!)) e codice come:
doThis(); if (state is that) doSomethingElse(); doThat();
è una perfetta programmazione procedurale.
Commenti
- doThisAndThat (….) implica che un metodo farà più di una cosa che in generale non è una buona pratica. Gli sviluppatori Java e C # aderiscono principalmente al principio di responsabilità unica. Penso che la tua analogia sia sbagliata. objectmentor.com/resources/articles/srp.pdf
- @JohnK So che non è una buona pratica. Eppure comune. Soprattutto tra gli sviluppatori Java, se si può giudicare da ciò che si vede tutti i giorni su SO.
- @JohnK Gli sviluppatori Java e C # aderiscono principalmente al Principio di responsabilità unica – Lip service? li>
- Gli sviluppatori Java aderiscono principalmente alla Responsabilità Unica? Se solo fosse vero nella vita reale …