Sdílet prostřednictvím


Funkční programování vs. imperativní programování (LINQ to XML)

Tento článek porovnává a kontrastuje funkční programování s tradičním imperativním (procedurálním) programováním.

Funkční programování vs. imperativní programování

Paradigma funkčního programování byl explicitně vytvořen tak, aby podporoval čistý funkční přístup k řešení problémů. Funkční programování je forma deklarativního programování. Naproti tomu většina běžných jazyků, včetně jazyků OOP (object-oriented programming), jako jsou C#, Visual Basic, C++ a Java, byly navrženy tak, aby primárně podporovaly imperativní (procedurální ) programování.

S imperativním přístupem vývojář napíše kód, který určuje kroky, které musí počítač provést k dosažení cíle. Někdy se to označuje jako algoritmické programování. Naproti tomu funkční přístup zahrnuje vytvoření problému jako sadu funkcí, které se mají spustit. Pečlivě definujete vstup pro každou funkci a to, co každá funkce vrátí. Následující tabulka popisuje některé obecné rozdíly mezi těmito dvěma přístupy.

Charakteristika Imperativní přístup Funkční přístup
Programátor fokus Jak provádět úlohy (algoritmy) a jak sledovat změny ve stavu. Jaké informace jsou požadované a jaké transformace jsou potřeba.
Změny stavu Důležité! Neexistující.
Pořadí provádění Důležité! Nízká důležitost.
Řízení primárního toku Smyčky, podmíněné volání a volání funkce (metoda). Volání funkcí, včetně rekurze.
Primární jednotka manipulace Instance struktur nebo tříd. Funguje jako prvotřídní objekty a kolekce dat.

Přestože byla většina jazyků navržena tak, aby podporovala konkrétní programovací paradigmata, mnoho obecných jazyků je dostatečně flexibilní, aby podporovalo více paradigmat. Například většina jazyků, které obsahují ukazatele funkce, lze použít k zajištění podpory funkčního programování. Kromě toho jazyk C# a Visual Basic zahrnují explicitní jazyková rozšíření pro podporu funkčního programování, včetně výrazů lambda a odvození typu. Technologie LINQ je forma deklarativního funkčního programování.

Funkční programování pomocí XSLT

Mnoho vývojářů XSLT je obeznámeno s čistým funkčním přístupem. Nejúčinnější způsob, jak vytvořit šablonu stylů XSLT, je zacházet s každou šablonou jako s izolovanou a kompozovatelnou transformací. Pořadí provádění je zcela zvýrazňováno. XSLT neumožňuje vedlejší účinky (s výjimkou, že eskapační mechanismy pro provádění procedurálního kódu mohou představovat vedlejší účinky, které mají za následek funkční nečistoty). I když je XSLT účinným nástrojem, některé jeho vlastnosti nejsou optimální. Například vyjádření programovacích konstruktorů v jazyce XML dělá kód relativně podrobný, a proto je obtížné udržovat. Silná závislost na rekurzi pro řízení toku může také vést k tomu, že kód, který je obtížně čitelný. Další informace o XSLT naleznete v tématu Transformace XSLT.

XSLT však prokázal hodnotu použití čistého funkčního přístupu pro transformaci XML z jednoho obrazce do druhého. Čistě funkční programování pomocí LINQ to XML je podobné mnoha způsoby jako XSLT. Programovací konstrukty zavedené jazykem LINQ to XML, C# a Visual Basic však umožňují psát čistě funkční transformace, které jsou čitelnější a udržovatelné než XSLT.

Výhody čistých funkcí

Primárním důvodem implementace funkčních transformací jako čistých funkcí je, že čisté funkce jsou kompozovatelné: to znamená, že jsou samostatné a bezstavové. Tyto charakteristiky přinášejí řadu výhod, včetně následujících:

  • Vyšší čitelnost a udržovatelnost. Důvodem je to, že každá funkce je navržená k provedení konkrétní úlohy vzhledem k argumentům. Funkce nespoléhá na žádný externí stav.
  • Snadnější reiterativní vývoj. Vzhledem k tomu, že refaktoring kódu je jednodušší, změny návrhu se často snadněji implementují. Předpokládejme například, že napíšete složitou transformaci a pak zjistíte, že se v transformaci několikrát opakuje nějaký kód. Pokud refaktorujete čistou metodou, můžete volat čistou metodu, aniž byste se museli starat o vedlejší účinky.
  • Jednodušší testování a ladění. Protože čistě funkční funkce lze snadněji testovat izolovaně, můžete napsat testovací kód, který volá čistou funkci s typickými hodnotami, platnými hraničními případy a neplatnými hraničními případy.

Z výše uvedených důvodů je funkční programování vhodné pro styl architektury mikroslužeb.

Přechod pro vývojáře OOP

V tradičním objektově orientovaném programování (OOP) je většina vývojářů zvyklá na programování v imperativním/procedurálním stylu. Aby mohli přejít na vývoj v čistém funkčním stylu, musí provést přechod v myšlení a jejich přístup k vývoji.

Aby vývojáři OOP vyřešili problémy, navrhují hierarchie tříd, zaměřují se na správnou zapouzdření a uvažují o kontraktech tříd. Chování a stav typů objektů jsou nejdůležitější a jazykové funkce, jako jsou třídy, rozhraní, dědičnost a polymorfismus, jsou k dispozici pro řešení těchto problémů.

Naproti tomu funkční programování přistupuje k výpočetním problémům jako cvičení při vyhodnocování čistě funkčních transformací kolekcí dat. Funkční programování zabraňuje stavům a proměnlivým datům a místo toho zdůrazňuje použití funkcí.

Jazyk C# a Visual Basic naštěstí nevyžadují úplný skok do funkčního programování, protože podporují imperativní i funkční programovací přístupy. Vývojář může zvolit, který přístup je nejvhodnější pro konkrétní scénář. Ve skutečnosti programy často kombinují oba přístupy.

Viz také