Jeg programmerer i Java i en veldig objektorientert (OO) stil. OOP kommer veldig intuitivt til meg, men jeg har veldig lite kunnskap om andre typer programmering.
Hva er prosessuell programmering ? Hvordan er det helt annerledes enn OOP? Er det det samme som funksjonell programmering ?
Jeg pleide å tro at all programmering som ikke er OO er prosessuell. Men jeg » Jeg begynner å tenke at dette ikke stemmer.
Kommentarer
- Deling av forskningen din hjelper alle. Fortell oss hva du ‘ har prøvd og hvorfor det ikke tilfredsstilte dine behov. Dette viser at du har tatt deg tid til å prøve å hjelpe deg selv, det sparer oss for å gjenta tydelige svar, og mest av alt hjelper det deg å få et mer spesifikt og relevant svar. Se også Hvordan spørre
- Prosedyreprogrammering er ikke det samme som funksjonell programmering; det ‘ er egentlig det samme som objektorientert programmering, minus objektene og klassene.
- Imperativ OOP er faktisk prosessuell programmering, så det er nøyaktig hva du ‘ gjør hele tiden …
Svar
Wikipedia har gode forklaringer på disse begrepene. Uansett, her er sammendraget:
- Imperativ programmering modeller beregning som en sekvens av utsagn som endrer den muterbare tilstanden.
- Prosedyreprogrammering er viktig programmering som bryter ned koden i underrutiner.
- Strukturert programmering er en mer disiplinert tilnærming til prosessuell programmering som forbyr vilkårlige hopp (f.eks. gå til) og globale tilstandsendringer.
-
Deklarativ programmering er det motsatte av imperativ programmering – den spesifiserer hva du skal beregne i stedet for hvordan (f.eks. SQL, regexes).
-
Funksjonelt program ming modeller beregning som uttrykk som (kan) gi verdier. Funksjoner er verdier og kan overføres til eller returneres fra andre funksjoner. Mutasjon frarådes; alle variablene er uforanderlige som standard. Som et resultat er det «mer deklarativt enn imperativt, siden det understreker hva som beregnes i stedet for sekvensen av tilstandsendringer som er nødvendige for å oppnå det.
- Rent funksjonell programmering tillater ikke mutasjon helt (men i motsetning til populær tro har det fremdeles mekanismer for å oppnå side effekter).
- Total funksjonell programmering forbyr i tillegg unntak og uendelig looping. (En totalfunksjon i matematikk er en funksjon som returnerer en verdi for alle inngangene.)
- Objektorientert programmering understreker bruk av objekter / grensesnitt for å oppnå abstraksjon og modularitet.
Forholdet deres er litt komplisert fordi OOP er et ganske lastet begrep. Du kan bruke objekter på både funksjonelle språk og prosessuelle språk, men språkene som annonserer seg selv som OO er prosessuelle. For å forvirre problemet ytterligere:
- De fleste vet ikke forskjellen mellom et objekt og en abstrakt datatype
- Vanlige OOP-språk nevner ikke ADT-er, gir svært dårlig støtte for dem og viser objekter som The One True Way.
- Ingen sier Abstrakt datatyporientert programmering (fordi det ville være en dum ting å gjøre; du trenger både ADT og objekter.)
Dette får folk til å tro at OOP er den eneste måten å oppnå abstraksjon på, og at funksjonell programmering og OOP er på en eller annen måte motsetninger eller gjensidig utelukkende. Mange mennesker tror også at alle funksjonelle språk er rene og ikke tillater mutasjon.
I tillegg slenger folk generelt imperativt / prosessuelt om hverandre, noen ganger kontrasterer det med OOP (antyder abstraksjonsfri kode, generelt C) og noen ganger kontrast til funksjonell programmering.Begrepet strukturert programmering har for det meste falt ut av bruk så vidt jeg kan fortelle (sannsynligvis fordi de fleste på dette tidspunktet tar for gitt at goto og globals anses som skadelige.)
Kommentarer
- » forbyr hopp » er ganske generisk; som inkluderer hvis / mens / etc .. kanskje » forbyr vilkårlige hopp «?
- @Izkata Bra poeng, endret.
- Det kan være verdt å koble til wikipediaoppføringene.
- Og det ‘ hvorfor det ‘ heter Objekt » Orientert » og ikke bare Objekt.
- @OrangeDog Hvordan er det noe forskjellig fra en abstrakt datatype, som også definerer et innkapslet sett med data og funksjoner som kan virke på det? Videre kan du ha uforanderlige gjenstander, så i så fall hvilken tilstand ?
Svar
Prosedyreprogrammering er en tilnærming til programmering som er en av de grunnleggende for byggesteiner for mange andre språkutforminger (funksjonell ikke å være en).
De fleste språk faller inn i settet med «Prosedyreprogrammering» og det er trolig den mest naturlige designtilnærmingen for folk flest (hvis du tenker i form av OO, så vil jeg si at du er i mindretall).
BASIC er prosessuelt.
Som andre har sagt, er det en mekanisme for å strukturere programmer på en sekvensiell måte.
- Først gjør jeg x
- For det andre gjør jeg
- For det tredje gjør jeg Z
Det krever en mekanisme for å definere «prosedyrer» – blokker med navngitt kode som ligner på OO-metoder, som kan akseptere null til mange parametere, og eventuelt returnere en verdi (som vil da vanligvis kalles en funksjon – sannsynligvis fører til forveksling med funksjonelle språk)
Para digm dikterer ikke hva tingene du gjør vil være, eller måten tingene blir sendt på.
Den beskriver ganske enkelt at programmet vil være strukturert som en serie prosedyrer (eller funksjoner) som fungerer i en sekvensiell måte. Dataene defineres deretter uavhengig av prosedyrene.
Dette skiller seg fra objektorientert programmering, som strukturerer programmet rundt datasamlinger og metoder (ikke funksjoner) som virker på disse dataene.
En måte å tenke på det er med tanke på datarekkevidde.
I et prosessuelt språk er scoping ganske enkelt. En variabel kan være i omfanget av en gitt prosedyre (deklarert lokalt), opp til nivået med de viktigste tingene som kalles ting (deklarert globalt), med nestede omfang mellom.
I et objektorientert språk legge til en ny avgrensningskontekst, det vil si objektet som for tiden er i bruk, som er vinkelrett på det ovennevnte.
En annen måte å tenke på prosessuelle, i forhold til objektorientert, er å vurdere et objektorientert språk der alle metodene må deklareres som statiske. Resultatet er et prosedyrespråk der klasser kan brukes til å gruppere prosedyrer sammen.
Svar
Prosedyreprogrammering er definitivt ikke funksjonell programmering.
Prosedyreprogrammering er når du har en modell av datamaskinen som en maskin i hodet, og du tenker på hvordan den «endrer data i minnet. Så først setter du A
til verdien 3, så legger du til 1 og lagrer den på minneplassering A
igjen (overskriver forrige verdi) .
Funksjonell programmering vil si at A
er 3, og B
er A + 1
, og la deretter datamaskinen finne ut hvordan man skal beregne B
. Når du har definert A
, skal den være uforanderlig (uendret). Funksjonell lar deg også gjøre ting som å sende en funksjon rundt som en første- klasseverdi (en funksjon kan ta en funksjon som et argument).
Objektorientert programmering kombinerer ofte begge deler, og er litt ortogonal for begge deler. Du kan bruke funksjonell programmering og returnere et uforanderlig objekt, og det objekt kan ha en metode som returnerer en beregnet verdi, og til og med gjøre det lat – det er funksjonell objektorientert programmering. Du kan også ha et objekt som representerer et «repository» (abstrakt versjon av en database), og du kan «lagre» ting i depotet og «få» ting ut igjen, og la objektet håndtere alle detaljene om hvordan det » s gjort. Det er i utgangspunktet objektorientert prosessuell programmering.
Svar
OOP er ingenting enn litt raffinert form for prosessuell programmering , som igjen tilhører den større familien av tvingende programmering.Bevis for det påstanden er at mange C # / Java-programmerere har en tendens til å «gjøre noe» og foretrekker metoder som:
void doThisAndThat(....) { ... do something ... }
Så, et program som består av en haug av ugyldige metoder (tidligere kjent som prosedyrer (sic!)) og kode som:
doThis(); if (state is that) doSomethingElse(); doThat();
er perfekt prosessuell programmering.
Kommentarer
- doThisAndThat (….) innebærer at en metode vil gjøre mer enn én ting som generelt ikke er en god praksis. Java- og C # -utviklere følger for det meste prinsippet om enkelt ansvar. Jeg tror analogien din er feil. objectmentor.com/resources/articles/srp.pdf
- @JohnK Jeg vet at det ikke er god praksis. Likevel en vanlig. Spesielt blant Java-utviklere, hvis man kan bedømme etter hva man ser hver dag på SO.
- @JohnK Java- og C # -utviklere følger stort sett Single Responsibility Principle – Leppetjeneste?
- Java-utviklere holder seg stort sett til det ene ansvaret? Hvis bare det var sant i det virkelige liv …