Mikä on menettelyohjelmointi? Kuinka tarkalleen se eroaa OOP: sta? Onko se sama kuin toiminnallinen ohjelmointi?

Ohjelmoin Java-sovelluksessa hyvin olio-tyylisellä (OO) tyylillä. OOP tulee minulle hyvin intuitiivisesti, mutta minulla on hyvin vähän tietoa muusta ohjelmoinnista.

Mikä tarkalleen on menettelyohjelmointi ? Kuinka tarkalleen se eroaa OOP: sta? Onko se sama asia kuin toiminnallinen ohjelmointi ?

Ajattelin, että kaikki ohjelmoinnit, jotka eivät ole ”O OO”, ovat menettelyllisiä. Mutta minä ” m alkaa ajatella, että tämä ei ole totta.

Kommentit

  • Tutkimuksen jakaminen auttaa kaikkia. Kerro meille, mitä ’ olet yrittänyt ja miksi se ei vastannut tarpeitasi. Tämä osoittaa, että olet käyttänyt aikaa yrittääksesi auttaa itseäsi, se säästää meitä toistamasta ilmeisiä vastauksia, ja ennen kaikkea se auttaa sinua saamaan enemmän täsmällinen ja asiaankuuluva vastaus. Katso myös Kuinka kysyä
  • Menettelyohjelmointi ei ole sama asia kuin toiminnallinen ohjelmointi; se ’ s oikeastaan olennaisesti sama asia kuin olio-ohjelmointi, miinus objektit ja luokat.
  • Pakollinen OOP todella on menettelyohjelmointi, joten se on täsmälleen sama mitä ’ teet koko ajan …

Vastaa

Wikipedialla on hyvät selitykset näille termeille. Tästä huolimatta tässä on yhteenveto:


  • Deklaratiivinen ohjelmointi on välttämätön ohjelmoinnin vastakohta – se määrittää, mitä lasketaan sen sijaan, miten (esim. SQL, regexit).

  • Toiminnallinen ohjelma ming mallinnaa laskennan lausekkeina , jotka antavat arvoja. Funktiot ovat arvoja, ja ne voidaan siirtää muille toiminnoille tai palauttaa niistä. Mutaatiota ei suositella; kaikki muuttujat ovat oletusarvoisesti muuttumattomia. Seurauksena on, että se on enemmän julistavaa kuin välttämätöntä, koska siinä korostetaan laskettavaa eikä sen saavuttamiseksi tarvittavaa tilamuutosjaksoa.

  • Pelkästään toiminnallinen ohjelmointi kieltää mutaation kokonaan (vaikkakin päinvastoin kuin yleisessä uskossa on vielä mekanismeja puolen saavuttamiseksi vaikutukset).
  • Toiminnallinen kokonaisohjelmointi kieltää lisäksi poikkeukset ja loputtoman silmukan. (Matematiikan kokonaisfunktio on funktio, joka palauttaa arvon kaikille syötteilleen.)

Heidän suhteensa ovat hieman monimutkaisia, koska OOP on melko ladattu termi. Voit käyttää objekteja sekä toiminnallisilla kielillä että menettelykielillä, mutta OO: ksi mainostavat kielet ovat menettelytapoja. Hämmentää asiaa entisestään:

  • Useimmat ihmiset eivät tiedä kohteen ja abstraktin tietotyypin välistä eroa
  • OOP-kielet eivät mainitse ADT: itä, antavat heille erittäin heikkoa tukea ja mainostavat objekteja nimellä The One True Way.
  • Kukaan ei sano Abstract Data Type-Oriented Programming (koska se olisi typerä asia; tarvitset sekä ADT: itä että esineitä.)

Tämä saa ihmiset ajattelemaan, että OOP on ainoa tapa saavuttaa abstraktio, ja että toiminnallinen ohjelmointi ja OOP ovat jotenkin vastakohtia tai sulkevat toisiaan pois. Monet ihmiset ajattelevat myös, että kaikki funktionaaliset kielet ovat puhtaita ja estävät mutaation.

Lisäksi ihmiset yleensä heittävät pakollisia / menettelytapoja keskenään, toisinaan vastakkain OOP: n kanssa (mikä viittaa abstraktiota sisältämättömään koodiin, yleensä C) ja joskus vastakohta sen toiminnalliselle ohjelmoinnille.Termi jäsennelty ohjelmointi on enimmäkseen poistunut käytöstä, sikäli kuin voin kertoa (todennäköisesti siksi, että tässä vaiheessa useimmat ihmiset pitävät itsestäänselvyytenä, että goota ja globaaleja pidetään haitallisina.)

Kommentit

  • ” kieltää hyppyjä ” on melko yleinen; johon sisältyy if / while / etc .. ehkä ” kieltää mielivaltaiset hyppyt ”?
  • @Izkata Hyvä asia, muuttunut.
  • Voi olla todella linkittäminen wikipedia-merkintöihin.
  • Ja ’ s miksi se ’ nimeltään Object ” Oriented ” eikä vain Object.
  • @OrangeDog Miten se on eroavatko abstraktista tietotyypistä, mikä myös määrittelee kapseloidun tietojoukon ja toiminnot, jotka voivat toimia sen perusteella? Lisäksi sinulla voi olla muuttumattomia esineitä, joten siinä tapauksessa mikä tila ?

Vastaa

Proseduurinen ohjelmointi on lähestymistapa ohjelmointiin, joka on yksi monien muiden kielimallien rakennuspalikoista (toiminnallinen ei ole sellainen).

Suurin osa kielistä kuuluu ”Prosessiohjelmoinnin” sarjaan ja se on luultavasti luonnollisinta suunnittelutapaa useimmille ihmisille (jos ajattelet OO: n suhteen, sanoisin, että olet vähemmistössä).

BASIC on menettelyllinen.

Kuten muut ovat sanoneet, se on mekanismi ohjelmien jäsentämiseksi peräkkäin.

  • Ensin teen x
  • Toiseksi teen y
  • Kolmanneksi teen Z

Se vaatii mekanismin ”menettelyjen” määrittelemiseksi – nimettyjen koodilohkojen kaltaiset OO-menetelmät, jotka voivat hyväksyä nollan moniin parametreihin ja palauttaa valinnaisesti arvon (joka kutsutaan sitten yleensä funktioksi – mikä todennäköisesti johtaa sekaannukseen toiminnallisten kielten kanssa.

Para digm ei sanele mitä tekemäsi asiat ovat, tai miten liikkuvia asioita siirretään.

Se vain kuvaa, että ohjelma rakennetaan sarjana menettelyjä (tai toimintoja), jotka toimivat peräkkäisellä tavalla. Tiedot määritetään sitten menettelyistä riippumatta.

Tämä eroaa olio-ohjelmoinnista, joka rakentaa ohjelman tietojen kokoelmiin ja menetelmiin (ei funktioihin), jotka vaikuttavat kyseisiin tietoihin.

Yksi tapa ajatella sitä on datan laajuus.

Menettelykielellä kattavuus on melko yksinkertainen. Muuttuja voi kuulua tietyn menettelyn piiriin (ilmoitettu paikallisesti) korkeimpaan asiaan kutsuvan tavaran tasoon asti (ilmoitettu globaalisti), sisäkkäisten laajuuksien välillä.

Objektikeskeisellä kielellä lisää uusi laajennuskonteksti, joka on tällä hetkellä käytössä olevan objektin konteksti, joka on kohtisuorassa ylläolevaan nähden.

Toinen tapa ajatella menettelytapoja, olio-suuntautuneeseen verrattuna, on harkita olio-orientoitua kieltä jossa kaikki menetelmät on ilmoitettava staattisina. Tuloksena on menettelykieli, jossa luokkia voidaan käyttää ryhmittelemään menettelyt yhteen.

Vastaus

Menettely-ohjelmointi ei todellakaan ole toiminnallinen ohjelmointi.

Menettely-ohjelmointi on, kun sinulla on koneen malli koneena päähäsi ja ajattelet, miten se ”muokkaavat tietoja muistissa. Joten ensin asetat A arvoon 3, lisäät sitten 1 ja tallennat sen muistipaikkaan A uudelleen (korvaa edellisen arvon) .

Toiminnallinen ohjelmointi sanoisi, että A on 3 ja B on A + 1 ja anna tietokoneen sitten selvittää, kuinka lasketaan B. Kun olet määrittänyt A, sen pitäisi olla muuttumaton (ei muuttuva). Toiminnallinen antaa sinun tehdä myös asioita, kuten siirtää funktio ensimmäisenä luokan arvo (funktio voi ottaa funktion argumenttina).

Objektikeskeinen ohjelmointi yhdistää usein molemmat ja on tavallaan ortogonaalinen molemmille. Voit käyttää toiminnallista ohjelmointia ja palauttaa muuttumattoman objektin, ja että objektilla voi olla menetelmä, joka palauttaa jonkin lasketun arvon, ja jopa tehdä sen laiskasti – se on toiminnallinen olio-ohjelmointi. Sinulla voi olla myös objekti, joka edustaa ”arkistoa” (abstrakti versio tietokannasta), ja voit ”tallentaa” tavaraa arkistoon ja ”saada” tavaraa takaisin ulos ja antaa objektin käsitellä kaikkia yksityiskohtia siitä, miten ” Se on tehty. Se on periaatteessa olio-suuntautunut menettelytapojen ohjelmointi.

Vastaus

OOP ei ole mitään muuta kuin hieman hienostunut menettelytavan ohjelmointi , joka taas kuuluu pakollisen ohjelmoinnin suurempaan perheeseen.Todiste tästä väitteestä on se, että monet C # / Java-ohjelmoijat pyrkivät ”tekemään jotain” ja pitävät parempana menetelmistä, kuten: void-methodien (tunnettiin aiemmin nimellä menettelyt (sic!)) ja koodin kaltaiset:

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

on täydellinen menettelyjen ohjelmointi.

Kommentit

  • doThisAndThat (….) tarkoittaa, että menetelmä tekee enemmän kuin yhden asian, mikä ei yleensä ole hyvä käytäntö. Java- ja C # -kehittäjät noudattavat enimmäkseen yhden vastuun periaatetta. Minusta analogisuutesi on puutteellinen. objectmentor.com/resources/articles/srp.pdf
  • @JohnK Tiedän, että se ei ole hyvä käytäntö. Silti yhteinen. Varsinkin Java-kehittäjien keskuudessa, jos voidaan arvioida sen perusteella, mitä jokapäiväinen näkee SO: ssa.
  • @JohnK Java- ja C # -kehittäjät noudattavat enimmäkseen yhden vastuun periaatetta – Lip-palvelua?
  • Java-kehittäjät noudattavat enimmäkseen yksittäistä vastuuta? Jospa vain totta tosielämässä …

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *