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.