Programez în Java într-un stil foarte orientat obiect (OO). OOP vine foarte intuitiv la mine, dar am foarte puține cunoștințe despre alte tipuri de programare.
Ce este exact programare procedurală ? Cât de exact este diferit de OOP? Este același lucru cu programare funcțională ?
Obișnuiam să cred că toate programările care nu sunt „t OO sunt procedurale. Dar eu” Încep să cred că acest lucru nu este adevărat.
Comentarii
- Partajarea cercetărilor dvs. ajută pe toată lumea. Spuneți-ne ce aveți ‘ Am încercat și de ce nu a satisfăcut nevoile dvs. Acest lucru demonstrează că v-ați făcut timp să încercați să vă ajutați, ne scutește de a repeta răspunsuri evidente și, mai ales, vă ajută să obțineți mai mult răspuns specific și relevant. De asemenea, consultați Cum să întrebați
- Programarea procedurală nu este același lucru cu programarea funcțională; ea ‘ este de fapt același lucru cu programarea orientată pe obiecte, minus obiectele și clasele.
- OOP imperativ de fapt este programare procedurală, deci este exact ce faci ‘ tot timpul …
Răspunde
Wikipedia are explicații bune pentru acești termeni. Indiferent, iată rezumatul:
- Programare imperativă modelează calculul ca o secvență de declarații care modifică starea modificabilă.
- Programare procedurală este o programare imperativă care împarte codul în subrutine.
- Programare structurată este o abordare mai disciplinată a programării procedurale care interzice salturile arbitrare (de exemplu, mergeți) și modificări ale stării globale.
-
Programarea declarativă este opusul programării imperative – specifică ce să calculăm mai degrabă decât cum (de exemplu, SQL, regexuri).
-
Program funcțional ming modelează calculul ca expresii care (pot) da valori. Funcțiile sunt valori și pot fi transmise sau returnate din alte funcții. Mutația este descurajată; toate variabilele sunt imuabile în mod implicit. Drept urmare, este mai declarativ decât imperativ, deoarece subliniază ceea ce se calculează mai degrabă decât succesiunea modificărilor de stare necesare pentru realizarea acestuia.
- Programarea pur funcțională interzice mutația cu totul (deși contrar credinței populare are încă mecanisme pentru realizarea efecte).
- Programare funcțională totală interzice suplimentar excepțiile și buclele infinite. (O funcție totală în matematică este o funcție care returnează o valoare pentru toate intrările sale.)
- Programare orientată pe obiecte subliniază utilizarea obiecte / interfețe pentru a obține abstracție și modularitate.
Relațiile lor sunt un pic complicate, deoarece OOP este un termen destul de încărcat. Puteți utiliza obiecte atât în limbaje funcționale, cât și în limbaje procedurale, dar limbile care se fac publicitate ca OO sunt procedurale. Pentru a confunda problema:
- Majoritatea oamenilor nu știu diferența dintre un obiect și un tip de date abstract
- Limbile OOP mainstream nu menționează ADT-urile, le oferă suport foarte slab și prezintă obiectele drept The One True Way.
- Nimeni nu spune Programare orientată pe tip de date abstracte (pentru că ar fi un lucru prostesc de făcut; aveți nevoie atât de ADT-uri, cât și de obiecte.) programarea funcțională și POO sunt cumva contrare sau se exclud reciproc. O mulțime de oameni consideră, de asemenea, că toate limbajele funcționale sunt pure și nu permit mutația.
În plus, oamenii, în general, aruncă imperativ / procedural în mod interschimbabil, uneori contrastându-l cu OOP (care implică cod fără abstracție, în general C) și uneori contrastând-o cu programarea funcțională.Termenul de programare structurată a căzut în mare parte din uz din câte îmi dau seama (probabil pentru că, în acest moment, majoritatea oamenilor dau de la sine înțeles că goto și globals sunt considerați dăunători.)
Comentarii
- ” interzice salturile ” este destul de generic; care include if / while / etc .. poate ” interzice salturile arbitrare „?
- @Izkata Bun punct, modificat.
- S-ar putea să merite să vă conectați efectiv la intrările Wikipedia.
- Și ‘ este motivul pentru care ‘ se numește obiect ” orientat ” și nu numai obiect.
- @OrangeDog Cum este asta este diferit de un tip de date abstracte, care de asemenea definește un set încapsulat de date și funcții care pot acționa asupra acestuia? Mai mult decât atât, puteți avea obiecte imuabile, deci, în acest caz, ce stare ?
Răspuns
Programarea procedurală este o abordare a programării, care este una dintre elementele de bază ale blocurilor de construcție pentru multe alte modele de limbaj (funcționalul nu este unul).
Majoritatea limbajelor se încadrează în setul „Programare procedurală” și este probabil cea mai naturală abordare de design pentru majoritatea oamenilor (dacă gândiți în termeni de OO, aș spune că sunteți în minoritate).
BASIC este procedural.
După cum au spus alții, este un mecanism de structurare a programelor într-o manieră secvențială.
- Mai întâi fac x
- În al doilea rând fac y
- În al treilea rând fac Z
Necesită un mecanism pentru definirea „procedurilor” – blocuri de coduri denumite similare cu metodele OO, care pot accepta zero la mulți parametri și, opțional, returnează o valoare (care atunci ar fi, în general, denumită o funcție – ceea ce va duce probabil la confuzia dvs. cu limbajele funcționale)
Para digm nu dictează care vor fi lucrurile pe care le faceți sau modul în care lucrurile sunt trecute.
Pur și simplu descrie că programul va fi structurat ca o serie de proceduri (sau funcții) care funcționează în o manieră secvențială. Datele sunt apoi definite independent de proceduri.
Acest lucru diferă de programarea orientată pe obiecte, care structurează programul în jurul colecțiilor de date și metode (nu funcții) care acționează asupra acelor date.
O modalitate de a ne gândi la asta este în ceea ce privește domeniul de aplicare al datelor.
Într-un limbaj procedural, domeniul de aplicare este destul de simplu. O variabilă poate fi în sfera unei proceduri date (declarată local), până la nivelul principalelor lucruri care apelează (declarată global), cu scopuri imbricate între.
Într-un limbaj orientat obiect adăugați un nou context de scop, fiind cel al obiectului utilizat în prezent, care este ortogonal cu cele de mai sus.
Un alt mod de a gândi procedural, comparativ cu cel orientat pe obiecte, este să considerăm un limbaj orientat pe obiect. unde toate metodele trebuie să fie declarate statice. Rezultatul este un limbaj procedural în care clasele pot fi utilizate pentru a grupa procedurile împreună.
Răspuns
Programarea procedurală nu este cu siguranță o programare funcțională.
Programarea procedurală este atunci când aveți un model al computerului ca o mașină în cap și vă gândiți cum este modifică datele din memorie. Așadar, mai întâi setați A
la valoarea 3, apoi adăugați 1 și o stocați în locația de memorie A
(suprascriind valoarea anterioară) .
Programarea funcțională ar spune că A
este 3 și B
este A + 1
, apoi lăsând computerul să afle cum să calculeze B
. Odată ce ați definit A
, ar trebui să fie imuabil (fără modificări). Funcționalul vă permite, de asemenea, să faceți lucruri precum trecerea unei funcții ca primă valoare de clasă (o funcție poate lua o funcție ca argument).
Programarea orientată pe obiecte combină adesea ambele și este un fel de ortogonală pentru ambele. Puteți utiliza programarea funcțională și puteți returna un obiect imuabil, și că obiectul poate avea o metodă care returnează o anumită valoare calculată și chiar o face leneș – programarea funcțională orientată pe obiect. Puteți avea, de asemenea, un obiect care reprezintă un „depozit” (versiunea abstractă a unei baze de date) și puteți „salva” lucruri în depozit și puteți „scoate” lucrurile înapoi și lăsați acel obiect să gestioneze toate detaliile despre modul în care ” S-a terminat. Această „programare procedurală orientată practic spre obiect.
Răspuns
OOP nu este altceva decât o formă puțin rafinată de programare procedurală , care aparține din nou familiei mai mari de programare imperativă.Dovada acestei afirmații este că mulți programatori C # / Java tind să „facă ceva” și preferă metode precum:
void doThisAndThat(....) { ... do something ... }
Deci, un program care constă dintr-o grămadă a metodelor void (cunoscute anterior ca procedure (sic!)) și a codului precum:
doThis(); if (state is that) doSomethingElse(); doThat();
este o programare procedurală perfectă.
Comentarii
- doThisAndThat (….) implică faptul că o metodă va face mai mult de un lucru care nu este, în general, o bună practică. Dezvoltatorii Java și C # aderă în mare parte la principiul de responsabilitate unică. Cred că analogia ta este greșită. objectmentor.com/resources/articles/srp.pdf
- @JohnK Știu că nu este o practică bună. Cu toate acestea, unul comun. Mai ales în rândul dezvoltatorilor Java, dacă se poate judeca după ceea ce se vede zilnic pe SO.
- @JohnK Dezvoltatorii Java și C # aderă în mare parte la Principiul unic de responsabilitate – Serviciul Lip?
- Dezvoltatorii Java aderă în mare parte la Responsabilitatea unică? Dacă ar fi adevărat în viața reală …