Co přesně je procedurální programování? Jak přesně se liší od OOP? Je to stejné jako funkční programování?

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í:


  • 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.)

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ě …

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *