Programuji v jazyce Java ve velmi objektově orientovaném (OO) stylu. OOP mi přijde velmi intuitivní, ale o jiných druzích programování mám velmi málo znalostí.
Co přesně je procedurální programování ? Jak přesně se liší od OOP? Je to totéž jako funkční programování ?
Myslel jsem si, že všechno programování, které není OO, je procedurální. Začínám si myslet, že to není pravda.
Komentáře
- Sdílení vašeho výzkumu pomáhá všem. Řekněte nám, co máte ‚ zkoušeli jsme a proč to nesplnilo vaše potřeby. To ukazuje, že jste si našli čas a pokusili se pomoci sami, šetří nás to před opakováním zjevných odpovědí a hlavně vám pomáhá získat více konkrétní a relevantní odpověď. Viz také Jak se zeptat
- Procedurální programování není to samé jako funkční programování; ‚ s je v podstatě to samé jako objektově orientované programování, minus objekty a třídy.
- Imperative OOP ve skutečnosti je procedurální programování, takže je co ‚ děláte pořád …
Odpovědět
Wikipedia má k těmto výrazům dobré vysvětlení. Zde je shrnutí:
- Imperativní programování modely výpočtu jako posloupnost příkazů , které mění měnitelný stav.
- Procedurální programování je imperativní programování, které kód rozdělí na podprogramy.
- Strukturované programování je disciplinovanější přístup k procedurálnímu programování, který zakazuje libovolné skoky (např. goto) a globální změny stavu.
-
Deklarativní programování je opakem imperativního programování – určuje, co se má počítat, nikoli jak (např. SQL, regulární výrazy).
-
Funkční program ming modeluje výpočet jako výrazy , které (mohou) přinést hodnoty. Funkce jsou hodnoty a lze je předat nebo vrátit z jiných funkcí. Mutace se nedoporučuje; všechny proměnné jsou ve výchozím nastavení neměnné. Ve výsledku je to více deklarativní než imperativní, protože zdůrazňuje spíše to, co se počítá, než sled změn stavu potřebných k jeho dosažení.
- Čistě funkční programování mutaci úplně zakazuje (i když na rozdíl od všeobecného přesvědčení stále existují mechanismy pro dosažení strany efekty).
- Celkové funkční programování navíc zakazuje výjimky a nekonečné opakování. (Celková funkce v matematice je funkce, která vrací hodnotu pro všechny její vstupy.)
- Objektově orientované programování zdůrazňuje použití objektů / rozhraní k dosažení abstrakce a modularity.
Jejich vztahy jsou trochu komplikované, protože OOP je docela nabitý termín. Objekty můžete použít jak ve funkčních jazycích, tak v procedurálních jazycích, ale jazyky, které se inzerují jako OO, jsou procedurální. K dalšímu zmatení problému:
- Většina lidí nezná rozdíl mezi objektem a abstraktním datovým typem
- Mainstreamové OOP jazyky se nezmiňují o ADT, poskytují pro ně velmi špatnou podporu a objekty označují jako The One True Way.
- Nikdo neříká Abstraktní datově orientované programování / em> (protože by to byla hloupá věc; potřebujete ADT i objekty.)
To způsobí, že si lidé budou myslet, že OOP je jediný způsob, jak dosáhnout abstrakce, a to funkční programování a OOP jsou jaksi protiklady nebo se vzájemně vylučují. Mnoho lidí si také myslí, že všechny funkční jazyky jsou čisté a nepovolují mutaci.
Navíc lidé obecně zaměňují imperativní / procedurální záměny, někdy to kontrastují s OOP (což znamená kód bez abstrakce, obecně C) a někdy kontrastovat s funkčním programováním.Termín strukturované programování se většinou přestal používat, pokud vím (pravděpodobně proto, že v tomto okamžiku většina lidí považuje za samozřejmé, že goto a globals jsou považovány za škodlivé.)
Komentáře
- “ zakazuje skoky “ je spíše obecné; to zahrnuje if / while / atd .. snad “ zakazuje libovolné skoky „?
- @Izkata Dobrý bod, změněno.
- Možná by stálo za to skutečně odkazovat na záznamy wikipedie.
- A to je důvod, proč ‚ ‚ s názvem Object “ Orientováno “ a ne pouze na objekt.
- @OrangeDog Jak to je liší se od abstraktního datového typu, který také definuje zapouzdřenou sadu dat a funkcí, které na ni mohou působit? Kromě toho můžete mít neměnné objekty, takže v takovém případě jaký stav ?
odpověď
Procedurální programování je přístup k programování, který je jedním ze základních stavebních kamenů pro mnoho dalších jazykových návrhů (funkční není jeden).
Většina jazyků spadá do sady „procedurálního programování“ a je to pravděpodobně nejpřirozenější přístup k designu pro většinu lidí (pokud si myslíte, že jde o OO, pak bych řekl, že jste v menšině).
BASIC je procedurální.
Jak již řekli ostatní, jedná se o mechanismus pro postupné strukturování programů.
- Nejprve udělám x
- Za druhé udělám y
- Zatřetí dělám Z
Vyžaduje mechanismus pro definování „procedur“ – bloků pojmenovaného kódu podobných metodám OO, které mohou přijmout nulu na mnoho parametrů a volitelně vrátit hodnotu (která by se obecně nazývalo funkcí – což by pravděpodobně vedlo k vaší záměně s funkčními jazyky)
Odstavec digm nediktuje, jaké věci uděláte, ani způsob předávání věcí.
Jednoduše popisuje, že program bude strukturován jako řada procedur (nebo funkcí), které fungují v postupným způsobem. Data jsou poté definována nezávisle na postupech.
Tím se liší od objektově orientovaného programování, které program strukturuje kolem sbírek dat a metod (nikoli funkcí), které na tato data působí.
Jedním ze způsobů, jak o tom přemýšlet, je rozsah dat.
V procedurálním jazyce je škálování poměrně jednoduché. Proměnná může být v rozsahu dané procedury (deklarovaná lokálně), a to až na úroveň top věci volající věci (deklarovaná globálně), s vnořenými obory mezi.
V objektově orientovaném jazyce můžete přidat nový kontext rozsahu, který je aktuálně používaným objektem, který je kolmý k výše uvedenému.
Další způsob, jak uvažovat o procedurálním ve srovnání s objektově orientovaným, je zvážit objektově orientovaný jazyk kde všechny metody musí být deklarovány jako statické. Výsledkem je procedurální jazyk, ve kterém lze třídy použít k seskupení postupů.
Odpověď
Procedurální programování rozhodně není funkční programování.
Procedurální programování je, když máte v hlavě model počítače jako stroje a přemýšlíte o tom, jak „upravuji data v paměti. Nejprve tedy nastavíte A
na hodnotu 3, poté přidáte 1 a uložíte jej do paměti A
znovu (přepíšete předchozí hodnotu) .
Funkční programování říká, že A
je 3 a B
je A + 1
a poté počítač nechal přijít na to, jak vypočítat B
. Jakmile jste „definovali A
mělo by to být neměnné neměnné (neměnné). Funkční vám také umožňuje dělat věci jako předat funkci jako první – hodnota třídy (funkce může brát funkci jako argument).
Objektově orientované programování často kombinuje obojí a je pro oba druh ortogonální. Můžete použít funkční programování a vrátit neměnný objekt, a to object může mít metodu, která vrací nějakou vypočítanou hodnotu, a dokonce to dělá líně – to je funkční objektově orientované programování. Můžete také mít objekt, který představuje „úložiště“ (abstraktní verzi databáze), a můžete „ukládat“ věci do úložiště a „získávat“ věci zpět a nechat tento objekt zpracovat všechny podrobnosti toho, jak to “ je hotovo. Toto je v podstatě objektově orientované procedurální programování.
Odpověď
OOP není nic jiného než trochu rafinovaná forma procedurálního programování , který opět patří do větší rodiny imperativního programování.Důkazem tohoto tvrzení je, že mnoho programátorů C # / Java má tendenci „něco dělat“ a upřednostňuje metody jako:
void doThisAndThat(....) { ... do something ... }
Takže program, který se skládá z hromady void-methods (dříve známé jako procedury (sic!)) a kód jako:
doThis(); if (state is that) doSomethingElse(); doThat();
je perfektní procedurální programování.
Komentáře
- doThisAndThat (….) znamená, že metoda bude dělat více než jednu věc, což obecně není dobrá praxe. Vývojáři Java a C # se většinou řídí principem jediné odpovědnosti. Myslím, že vaše analogie je chybná. objectmentor.com/resources/articles/srp.pdf
- @JohnK vím, že to není dobrá praxe. Přesto běžný. Zejména u vývojářů Java, pokud lze soudit podle toho, co každý den vidí na SO.
- @JohnK Vývojáři Java a C # se většinou řídí principem jediné odpovědnosti – služba Lip?
- Vývojáři Java většinou dodržují jednotnou odpovědnost? Kéž by to byla pravda ve skutečném životě …