it-swarm-eu.dev

Funkční programování vs. OOP

Slyšel jsem hodně řeči o používání funkčních jazyků, jako je Haskell, pozdě. Jaké jsou některé z velkých rozdílů, výhod a nevýhod funkčního programování oproti objektově orientovanému programování?

95
GSto

Řekl bych, že je to více funkční programování vs imperativní programování .

Největší rozdíl je v tom, že imperativní programování je o regulačním toku , zatímco funkční programování je o datovém toku . Jiným způsobem lze říci, že funkční programování používá pouze výrazy, zatímco v imperativním programování se používají oba výrazy a příkazy.

Například v imperativní programovací proměnné a smyčky jsou běžné při zpracování stavu, zatímco ve funkčním programování je stav zpracován předáním parametrů , který se vyhýbá vedlejším účinkům a přiřazením.

Imperativní pseudokód pro funkci pro výpočet součtu seznamu (součet je udržován v proměnné):

int sumList(List<int> list) {
    int sum = 0;
    for(int n = 0; n < list.size(); n++) {
        sum = sum + list.get(n);
    }

    return sum;
}

Funkční pseudokód pro stejnou funkci (součet je předán jako parametr):

fun sumList([], sum) = sum
 |  sumList(v::lst, sum) = sumList(lst, v+sum)

Doporučuji prezentaci Taming Effects with Functional Programming by Simon Peyton-Jones pro dobrý úvod do funkčních konceptů.

69
Jonas

Funkční programování je založeno na deklarativním modelu a má své kořeny z lambda počtu. Nabízí mnoho skvělých konceptů, které si lze půjčit z více imperativních jazyků, jako jsou C++ a C #.

Některé příklady zahrnují referenční transparentnost, lambda funkce, prvotřídní funkce, líné a dychtivé hodnocení a neměnitelnost.

Pokud pro nic jiného není učení funkční programování užitečné pro koncepty, které obsahuje. Změní to způsob programování a přemýšlíte o programování. A myslím, že v budoucnu bude funkční programování stejně důležité jako objektově orientované programování.

Chcete-li začít, můžete se rozhodnout použít čistě funkční jazyk, jako je Haskell, nebo můžete použít hybridní jazyk jako F # .

Většina dobrých univerzit pokryje funkční programování a pokud chodíte do školy, velmi doporučuji tento kurz absolvovat.


Jaké jsou některé z velkých rozdílů, výhod a nevýhod funkčního programování oproti objektově orientovanému programování?

Dobře objektově orientované programování je pěkné, protože umožňuje modelovat složitý problém do hierarchií, abyste jej mohli zjednodušit. Když však začnete uvažovat o vícevláknovém programování při používání proměnlivých objektů, bude to velmi obtížné. V takových případech je třeba použít silné použití synchronizačních objektů a je téměř nemožné zdokonalit velkou aplikaci.

To je místo, kde funkční programování přichází. Kvůli věcem, jako je neměnitelnost, funkční programování opravdu zjednodušuje programy s více vlákny. Je téměř triviální snadné paralelizovat něco, když víte, že při vstupu X do funkce bude vždy výstup Y. Také víte, že proměnná (nebo hodnota ve funkčním programování) nemůže změnit střední použití z jiného vlákna.

16
Brian R. Bondy

(Tato odpověď je upravena z odpověď na uzavřenou otázku na StackOverflow .)

Jeden z velkých rozdílů mezi funkčním programováním a objektově orientovaným programováním je, že každý z nich je lepší v jiném druhu vývoje softwaru:

  • Objektově orientované jazyky jsou dobré, pokud máte pevnou sadu operací na věcech a jak se váš kód vyvíjí, přidáváte především nové věci. Toho lze dosáhnout přidáním nových tříd, které implementují existující metody, a stávající třídy zůstanou samy.

  • Funkční jazyky jsou dobré, když máte pevnou sadu věcí a jak se váš kód vyvíjí, přidáváte hlavně nové operace na existujících věcech. Toho lze dosáhnout přidáním nových funkcí, které počítají s existujícími datovými typy, a stávající funkce zůstávají samy.

Když se evoluce ubírá špatně, máte problémy:

  • Přidání nové operace do objektově orientovaného programu může vyžadovat úpravu mnoha definic tříd a přidání nové metody.

  • Přidání nového druhu věci do funkčního programu může vyžadovat úpravu mnoha definic funkcí pro přidání nového případu.

Tento problém je znám již mnoho let; v roce 1998 Phil Wadler to nazval „problém s výrazem“ . Ačkoli se někteří vědci domnívají, že problém s výrazem lze řešit takovými jazykovými funkcemi, jako jsou mixiny, široce přijímané řešení musí zasáhnout hlavní proud.

10
Norman Ramsey

Neexistuje žádný skutečný versus. Mohou se dokonale doplňovat. Existují FP jazyky, které podporují OOP. Ale komunity se liší ve způsobu, jakým nakládají s modularitou.

Uživatelé FP jazyků mají tendenci dosáhnout modularity pomocí matematických zákonů a dávají přednost důkazům prokazujícím soulad s jejich zákony).

V imperative OOP================================================================================================================================================================================================================= Zpět.

Je to jen malý aspekt, ale myslím, že stojí za zmínku.

5
Edgar Klerks

Analogie:

Dostali jste žádost o zaměstnání. Vyplníte své jméno, kontaktní informace a historii práce. Po dokončení již nemáte prázdnou aplikaci.

Teď si místo toho představte, že před napsáním jej překryjete čistým listem celofánu. Napíš své jméno. Přidáte další list celofánu. Píšete své kontaktní informace. Více celofánu. Napíšete svou pracovní historii. Po dokončení budete mít prázdnou aplikaci nedotčenou. Máte také tři listy celofánu, z nichž každý zachytil účinek jediné, diskrétní změny.

První (OOP) zahrnuje myšlenku na změnu věcí na místě, zatímco druhá (FP) se vyhýbá. Oba jsou paradigmata správy státu. Oba mohou pomocí různých strategií zachytit účinek dokončení žádosti o zaměstnání. OOP mění výchozí nástroj přímo, zatímco FP překrývá to, co přišlo před k provedení vzhledu změny .

2
Mario T. Lanza