A Java-ban nagyon objektum-orientált (OO) stílusban programozom. Az OOP nagyon intuitív módon jön hozzám, de nagyon kevés ismeretem van más típusú programozásról.
Mi is pontosan az a eljárásprogramozás ? Miben különbözik pontosan az OOP-tól? Ugyanaz, mint a funkcionális programozás ?
Korábban azt gondoltam, hogy minden olyan programozás, amely nem “O O”, eljárási. De én ” Kezdem azt gondolni, hogy ez nem igaz.
Megjegyzések
- A kutatásod megosztása mindenkinek segít. Mondd el, mit ‘ próbáltuk, és miért nem felelt meg az Ön igényeinek. Ez azt bizonyítja, hogy időt szakított arra, hogy segítsen magának, ez megment minket a nyilvánvaló válaszok megismétlésétől, és főleg ez segít abban, hogy minél többet kapjon konkrét és releváns válasz. Lásd még: Hogyan kell kérdezni
- Az eljárási programozás nem ugyanaz, mint a funkcionális programozás; ez ‘ valójában lényegében ugyanaz, mint az objektum-orientált programozás, levonva az objektumokat és az osztályokat.
- Az imperatív OOP valójában az az eljárási programozás, tehát pontosan amit ‘ folyamatosan csinálsz …
Válasz
A Wikipédia jól magyarázza ezeket a kifejezéseket. Ettől függetlenül itt van az összefoglaló:
- Rendszeres programozás a számítást a megváltoztatható állapotot megváltoztató utasítások sorozataként modellezi.
- Az eljárási programozás elengedhetetlen programozás, amely szubrutinokra bontja a kódot.
- A strukturált programozás fegyelmezettebb megközelítés az eljárási programozáshoz, amely tiltja az önkényes ugrásokat (pl. goto) és a globális állapotváltozások.
-
A deklaratív programozás ellentétes az imperatív programozással – nem a hogyan, hanem a mit kell kiszámítani (pl. SQL, regexes).
-
Funkcionális program ming a számítást kifejezések ként modellezi, amelyek értékeket hozhatnak (adhatnak). A függvények értékek, és átadhatók vagy visszavihetők más függvényekhez. A mutáció nem kedvelt; az összes változó alapértelmezés szerint megváltoztathatatlan. Ennek eredményeként inkább deklaratív, mint imperatív, mivel a megvalósításhoz szükséges állapotváltozások sorrendje helyett a számításokat hangsúlyozza.
- A pusztán funkcionális programozás egyáltalán nem engedélyezi a mutációt (bár a közhiedelemmel ellentétben még mindig vannak mechanizmusok az oldal elérésére effektusok).
- Teljes funkcionális programozás emellett tiltja a kivételeket és a végtelen ciklusokat. (A matematika teljes függvénye olyan függvény, amely értéket ad vissza a bemenetek összes jéhez.)
- Objektumorientált programozás hangsúlyozza a objektumok / interfészek használata az absztrakció és a modularitás elérése érdekében.
Kapcsolataik kissé bonyolultak, mert az OOP elég terhelt kifejezés. Az objektumokat funkcionális és eljárási nyelveken egyaránt használhatja, de azok a nyelvek, amelyek önmagukat OO-ként hirdetik, eljárási nyelvek. A probléma további megzavarása:
- A legtöbb ember nem tudja az objektum és az absztrakt adattípus közötti különbséget
- A mainstream OOP nyelvek nem tesznek említést az ADT-kről, nagyon gyenge támogatást nyújtanak számukra, és az objektumokat az Egy igaz útként emlegetik.
- Senki nem mondja Absztrakt adattípus-orientált programozás (mert ez buta dolog lenne; mind ADT-kre, mind objektumokra van szükség.)
Ez arra készteti az embereket, hogy azt gondolják, az OOP az egyetlen módszer az absztrakció elérésére, és ez a funkcionális programozás és az OOP valahogy ellentétek vagy kizárják egymást. Sokan azt is gondolják, hogy az összes funkcionális nyelv tiszta és nem engedélyezi a mutációt.
Ezenkívül az emberek általában imperatív / eljárási szempontból felcserélődnek egymással, néha szembeállítva az OOP-val (absztrakció nélküli kódot jelentenek, általában C), és néha szembeállítva a funkcionális programozással.A strukturált programozás kifejezés, amennyire meg tudom mondani, többnyire használaton kívül esett (valószínűleg azért, mert ezen a ponton a legtöbb ember magától értetődőnek tartja, hogy a goto és a globálokat károsnak tekintik.)
A megjegyzések
- ” tiltja az ugrásokat ” meglehetősen általános; ide tartozik az if / while / etc .. talán ” tiltja az önkényes ugrásokat “?
- @Izkata Jó pont, megváltozott.
- Lehet, hogy ténylegesen linkelni kell a wikipédia bejegyzéseihez.
- És ez ‘ miért ‘ s objektumnak hívják ” orientált ” és nem csak az objektumot.
- @OrangeDog Hogy van ez különbözik-e egy absztrakt adattípustól, amely szintén meghatároz egy olyan kapszulázott adatsort és funkciókat, amelyek működhetnek rajta? Sőt, változhatatlan objektumaid is lehetnek, tehát ebben az esetben milyen állapot ?
Válasz
Az eljárási programozás egy olyan megközelítés a programozáshoz, amely számos más nyelvi tervezés építőkockájának egyik alapja (funkcionális, ha nem ilyen).
A legtöbb nyelv az „Eljárási programozás” halmazába tartozik. és ez valószínűleg a legtermészetesebb tervezési megközelítés a legtöbb ember számára (ha az OO-val gondolkodik, akkor azt mondanám, hogy kisebbségben van).
A BASIC eljárási.
Mint mások mondták, ez egy mechanizmus a programok egymás utáni strukturálására.
- Először x-et csinálok
- Másodszor y-t csinálok
- Harmadszor, Z-t csinálok
Ehhez mechanizmusra van szükség az “eljárások” meghatározásához – az OO metódusokhoz hasonló nevű kódblokkok, amelyek képesek nulla-sok paramétert elfogadni, és adott esetben visszaadhatnak egy értéket (amely akkor általában függvénynek nevezzük – ami valószínűleg a funkcionális nyelvekkel való összetévesztéshez vezet)
A para A digm nem szabja meg, hogy mi lesz a dolgod, vagy hogy milyen módon adja át a dolgokat.
Egyszerűen leírja, hogy a program az eljárások (vagy függvények) sorozataként fog felépülni, amelyek működnek szekvenciális módon. Az adatokat ezután az eljárásoktól függetlenül definiáljuk.
Ez eltér az objektum-orientált programozástól, amely a programot az adatokra ható adatgyűjtések és módszerek (nem függvények) köré szervezi.
A gondolkodás egyik módja az adattartalom.
Egy eljárási nyelvben a hatókör meglehetősen egyszerű. Egy változó egy adott eljárás hatókörébe tartozhat (helyi szinten deklarálva), a legfelsőbb dolgok szintjéig (globálisan deklarálva), beágyazott hatókörökkel.
Objektumorientált nyelven adjon hozzá egy új hatókör-kontextust, amely a jelenleg használt objektumé, amely ortogonális a fentiekre.
A procedurális gondolkodás másik módja, mivel az objektum-orientálthoz hasonlít, ha egy objektum-orientált nyelvet veszünk figyelembe ahol minden metódust statikusnak kell nyilvánítani. Az eredmény egy olyan eljárási nyelv, ahol az osztályok felhasználhatók az eljárások csoportosítására.
Válasz
Az eljárási programozás határozottan nem funkcionális programozás.
Az eljárási programozás az, amikor a számítógép modellje, mint gép a fejedben, és azon gondolkodsz, hogyan lehet msgstr “” “adatok módosítása a memóriában. Tehát először állítsa be a A
értéket a 3 értékre, majd adjon hozzá 1-et, és tárolja azt ismét a (z) A
memóriahelyen (felülírva az előző értéket) .
A funkcionális programozás azt mondaná, hogy a A
értéke 3, a B
pedig A + 1
, majd hagyja, hogy a számítógép kitalálja, hogyan kell kiszámolni a B
számítást. Ha már meghatározta a A
fájlt, akkor ennek változhatatlannak kell lennie (nem változó). A Funkcionális funkció lehetővé teszi olyan dolgok elvégzését is, mint például egy függvény átadása első osztály értéke (egy funkció függvényt vehet fel argumentumként).
Az objektumorientált programozás gyakran kombinálja mindkettőt, és valamilyen módon merőleges mindkettőhöz. Használhatja a funkcionális programozást és visszaadhat egy megváltoztathatatlan objektumot, és ezt Az objektumnak lehet egy olyan módszere, amely valamilyen számított értéket ad vissza, és még lustán is csinálja – ez a funkcionális objektum-orientált programozás. Lehet olyan objektuma is, amely egy “adattárat” képvisel (az adatbázis absztrakt változata), és “menthet” cuccokat a lerakatba, és “visszakaphatja” a cuccokat, és hagyhatja, hogy az objektum kezelje annak minden részletét. ” kész. Ez alapvetően objektumorientált eljárási programozás.
Válasz
Az OOP nem más, mint az eljárási programozás kissé finomított formája , amely ismét az imperatív programozás nagyobb családjához tartozik.Ennek az állításnak a bizonyítéka, hogy sok C # / Java programozó hajlamos “tenni valamit”, és olyan módszereket részesít előnyben, mint:
void doThisAndThat(....) { ... do something ... }
Tehát egy program, amely egy csomóból áll a void-módszerek (korábban eljárások (sic!) néven ismert) és a következő kódok:
doThis(); if (state is that) doSomethingElse(); doThat();
tökéletes eljárási programozás.
Megjegyzések
- doThisAndThat (….) azt jelenti, hogy egy módszer több dolgot fog megtenni, ami általában nem jó gyakorlat. A Java és a C # fejlesztők többnyire betartják az egységes felelősség elvét. Szerintem hibás a hasonlatod. objectmentor.com/resources/articles/srp.pdf
- @JohnK Tudom, hogy ez nem jó gyakorlat. Mégis egy közös. Különösen a Java-fejlesztők körében, ha meg lehet ítélni, hogy mit lát mindennapi SO-n.
- @JohnK A Java és a C # fejlesztők többnyire betartják az Egységes Felelősség Elve – Lip szolgáltatást?
- A Java fejlesztők többnyire betartják az Egységes Felelősséget? Ha csak ez igaz lenne a való életben …