Jeg programmerer i Java i en meget objektorienteret (OO) stil. OOP kommer meget intuitivt til mig, men jeg har meget lidt viden om andre former for programmering.
Hvad er procedureprogrammering ? Hvordan er det nøjagtigt forskelligt fra OOP? Er det den samme som funktionel programmering ?
Jeg troede, at al programmering, der ikke er OO, er proceduremæssig. Men jeg ” Jeg begynder at tro, at dette ikke er sandt.
Kommentarer
- Deling af din forskning hjælper alle. Fortæl os hvad du ‘ har prøvet, og hvorfor det ikke opfyldte dine behov. Dette viser, at du har taget dig tid til at prøve at hjælpe dig selv, det sparer os for at gentage indlysende svar, og mest af alt hjælper det dig med at få et mere specifikt og relevant svar. Se også Sådan spørger du
- Procedurel programmering er ikke det samme som funktionel programmering; det ‘ er egentlig det samme som objektorienteret programmering minus objekter og klasser.
- Imperativ OOP er faktisk procedurel programmering, så det er nøjagtigt hvad du ‘ gør hele tiden …
Svar
Wikipedia har gode forklaringer på disse termer. Uanset her er resuméet:
- Imperativ programmering modellerer beregning som en sekvens af udsagn der ændrer den ændrede tilstand.
- Procedurel programmering er bydende nødvendigt programmering, der nedbryder koden i underrutiner.
- Struktureret programmering er en mere disciplineret tilgang til procedureprogrammering, der forbyder vilkårlige spring (f.eks. goto) og globale tilstandsændringer.
-
Deklarativ programmering er det modsatte af imperativ programmering – det specificerer, hvad man skal beregne snarere end hvordan (f.eks. SQL, regexes).
-
Funktionelt program ming modellerer beregning som udtryk der (kan) give værdier. Funktioner er værdier og kan overføres til eller returneres fra andre funktioner. Mutation frarådes; alle variabler er uforanderlige som standard. Som et resultat er det “mere erklærende end nødvendigt, da det understreger, hvad der beregnes snarere end rækkefølgen af tilstandsændringer, der er nødvendige for at opnå det.
- Rent funktionel programmering tillader ikke mutation helt (selvom i modsætning til populær tro stadig har mekanismer til at opnå side effekter).
- Samlet funktionel programmering forbyr desuden undtagelser og uendelig looping. (En total funktion i matematik er en funktion, der returnerer en værdi for alle af dens input.)
- Objektorienteret programmering understreger brug af objekter / grænseflader for at opnå abstraktion og modularitet.
Deres forhold er lidt komplicerede, fordi OOP er et ret fyldt udtryk. Du kan bruge objekter på både funktionelle sprog og proceduremæssige sprog, men de sprog, der annoncerer sig selv som OO, er proceduremæssige. For yderligere at forvirre problemet:
- De fleste mennesker kender ikke forskellen mellem et objekt og en abstrakt datatype
- Mainstream OOP-sprog nævner ikke ADTer, yder meget dårlig støtte til dem og viser objekter som The One True Way.
- Ingen siger Abstrakt datatyporienteret programmering (fordi det ville være en fjollet ting at gøre; du har brug for både ADTer og objekter.)
Dette får folk til at tro, at OOP er den eneste måde at opnå abstraktion på, og at funktionel programmering og OOP er på en eller anden måde modsætninger eller udelukker hinanden gensidigt. Mange mennesker synes også, at alle funktionelle sprog er rene og ikke tillader mutation.
Derudover kaster folk generelt om nødvendigt / proceduremæssigt om hinanden, nogle gange kontrasterer det med OOP (antyder abstraktion-mindre kode, generelt C) og undertiden kontrast til funktionel programmering.Udtrykket struktureret programmering er for det meste ude af brug så vidt jeg kan fortælle (sandsynligvis fordi de fleste på dette tidspunkt tager for givet, at goto og globals betragtes som skadelige.)
Kommentarer
- ” forbyder spring ” er ret generisk; der inkluderer hvis / mens / osv .. måske ” forbyder vilkårlige spring “?
- @Izkata Godt punkt, ændret.
- Det kan være værd at faktisk linke til wikipedia-poster.
- Og at ‘ hvorfor det ‘ kaldes objekt ” Orienteret ” og ikke kun objekt.
- @OrangeDog Hvordan er det noget forskelligt fra en abstrakt datatype, som også definerer et indkapslet sæt data og funktioner, der kan virke på det? Desuden kan du have uforanderlige objekter, så i så fald hvilken tilstand ?
Svar
Procedureprogrammering er en tilgang til programmering, der er en af de grundlæggende i byggesten til mange andre sprogdesign (funktionel ikke at være en).
De fleste sprog falder inden for sæt af “Procedurel programmering” og det er sandsynligvis den mest naturlige designtilgang for de fleste mennesker (hvis du tænker i form af OO, så vil jeg sige, at du er i mindretal).
BASIC er proceduremæssig.
Som andre har sagt, er det en mekanisme til at strukturere programmer på en sekventiel måde.
- Først gør jeg x
- Andet gør jeg y
- For det tredje gør jeg Z
Det kræver en mekanisme til at definere “procedurer” – blokke med navngivet kode svarende til OO-metoder, der kan acceptere nul til mange parametre og eventuelt returnere en værdi (som kaldes derefter generelt en funktion – hvilket sandsynligvis fører til din forvirring med funktionelle sprog)
Para digm dikterer ikke, hvad de ting, du laver, eller hvordan de ting, der sendes rundt.
Det beskriver simpelthen, at programmet vil være struktureret som en række procedurer (eller funktioner), der fungerer i en sekventiel måde. Dataene defineres derefter uafhængigt af procedurerne.
Dette adskiller sig fra objektorienteret programmering, som strukturerer programmet omkring samlinger af data og metoder (ikke funktioner), der virker på disse data.
En måde at tænke på det er med hensyn til datarækkevidde.
I et proceduremæssigt sprog er scoping ret simpelt. En variabel kan være inden for rækkevidden af en given procedure (erklæret lokalt) op til niveauet for det øverste, der kalder ting (erklæret globalt) med indlejrede rækkevidde imellem.
I et objektorienteret sprog tilføj en ny scoping-kontekst, det vil sige for det objekt, der i øjeblikket er i brug, hvilket er vinkelret på ovenstående.
En anden måde at tænke på proceduremæssigt i forhold til objektorienteret er at overveje et objektorienteret sprog hvor alle metoder skal erklæres som statiske. Resultatet er et processprog, hvor klasser kan bruges til at gruppere procedurer sammen.
Svar
Procedurel programmering er bestemt ikke funktionel programmering.
Procedurel programmering er, når du har en model af computeren som en maskine i hovedet, og du tænker over, hvordan den “ændrer data i hukommelsen. Så du indstiller A
til værdien 3, derefter tilføjer du 1 og gemmer det på hukommelsesplacering A
igen (overskriver den forrige værdi) .
Funktionel programmering vil sige, at A
er 3, og B
er A + 1
og derefter lade computeren finde ud af, hvordan man beregner B
. Når du først har defineret A
, skal det være uforanderligt (ikke-skiftende). Funktionel giver dig også mulighed for at gøre ting som at sende en funktion rundt som en første- klasseværdi (en funktion kan tage en funktion som et argument).
Objektorienteret programmering kombinerer ofte begge dele og er en slags ortogonal for begge. Du kan bruge funktionel programmering og returnere et uforanderligt objekt, og det objekt kan have en metode, der returnerer en beregnet værdi, og endda gøre det doven – det er funktionel objektorienteret programmering. Du kan også have et objekt, der repræsenterer et “lager” (abstrakt version af en database), og du kan “gemme” ting i lageret og “få” ting ud igen, og lade objektet håndtere alle detaljer om, hvordan det ” det er gjort. Det er grundlæggende objektorienteret procedureprogrammering.
Svar
OOP er intet andet end en lidt raffineret form for procedureprogrammering , der igen hører til den større familie af bydende programmering.Bevis for denne påstand er, at mange C # / Java-programmører har tendens til at “gøre noget” og foretrækker metoder som:
void doThisAndThat(....) { ... do something ... }
Så et program, der består af en flok af ugyldige metoder (tidligere kendt som procedurer (sic!)) og kode som:
doThis(); if (state is that) doSomethingElse(); doThat();
er perfekt procedureprogrammering.
Kommentarer
- doThisAndThat (….) indebærer, at en metode vil gøre mere end én ting, som generelt ikke er en god praksis. Java- og C # -udviklere overholder for det meste princippet om et enkelt ansvar. Jeg synes, din analogi er mangelfuld. objectmentor.com/resources/articles/srp.pdf
- @JohnK Jeg ved, at det ikke er god praksis. Alligevel en almindelig. Især blandt Java-udviklere, hvis man kan bedømme efter, hvad man ser hver dag på SO.
- @JohnK Java- og C # -udviklere overholder for det meste Single Responsibility Princip – Lip service?
- Java-udviklere overholder for det meste det enkelte ansvar? Hvis det kun var sandt i det virkelige liv …