Czy programowanie funkcjonalne zastępuje wzorce projektowe GoF?

Odkąd w zeszłym roku zacząłem uczyć się F# i OCaml, przeczytałem ogromną liczbę artykułów, które podkreślają, że wzorce projektowe (zwłaszcza w Javie) są obejściami brakujących funkcji w językach imperatywnych. Jeden artykuł, który znalazłem , zawiera dość mocne twierdzenie :

Większość ludzi, których poznałam, przeczytała Wzorce projektowe książka Gang of Cztery. Każdy szanujący się programista powie Ci, że książka jest agnostyka językowa i wzorce Zastosuj do oprogramowania inżynieria w ogólne, bez względu na język Ty używasz. To szlachetne roszczenie. Niestety jest daleko od prawdę.

Języki funkcyjne są niezwykle wyraziste. w języku funkcjonalnym nie trzeba wzorców projektowych ponieważ język jest prawdopodobnie tak wysoki poziom, kończysz programowanie w koncepcje eliminujące projektowanie wzory razem.

Do głównych cech programowania funkcyjnego należą funkcje jako wartości pierwszej klasy, currying, niezmienne wartości, itp. Nie wydaje mi się oczywiste, że wzorce projektowe oo zbliżają się do żadnej z tych funkcji.

DODATKOWO, w językach funkcyjnych, które wspierają OOP (takich jak F# i OCaml), wydaje mi się oczywiste, że programiści używający tych języków będą używać tych samych wzorców projektowych dostępnych dla każdego innego języka OOP. W rzeczywistości, obecnie używam F# i OCaml codziennie, i nie ma uderzających różnic między wzorami używam w te języki kontra wzorce, których używam, gdy piszę w Javie.

Czy jest jakaś prawda w twierdzeniu, że programowanie funkcjonalne eliminuje potrzebę wzorców projektowych OOP? Jeśli tak, czy mógłbyś zamieścić lub link do przykładu typowego wzorca projektowego OOP i jego funkcjonalnego odpowiednika?

Author: Ssubrat Rrudra, 0000-00-00

16 answers

Wpis na blogu, który zacytowałeś, trochę zawyża jego twierdzenie. FP nie eliminuje potrzeby tworzenia wzorców projektowych. Termin "wzorce projektowe" nie jest powszechnie używany do opisywania tego samego w językach FP. Ale one istnieją. Języki funkcyjne mają wiele najlepszych zasad praktyki w postaci "gdy napotkasz problem X, Użyj kodu, który wygląda jak Y", który jest w zasadzie tym, czym jest wzorzec projektowy.

Jednak, to prawda, że większość wzorców projektowych specyficznych dla OOP jest w zasadzie brak znaczenia w językach funkcyjnych.

Myślę, że nie powinno być szczególnie kontrowersyjne stwierdzenie, że wzorce projektowe w ogóle istnieją tylko po to, aby naprawić braki w języku. A jeśli inny język może rozwiązać ten sam problem trywialnie, ten inny język nie będzie potrzebował wzorca projektowego. Użytkownicy tego języka mogą nawet nie być świadomi, że problem istnieje, ponieważ, cóż, nie jest to problem w tym języku.

Oto co Gang z Cztery ma do powiedzenia na ten temat:

Wybór języka programowania jest ważny, ponieważ wpływa na jego punkt widzenia. Nasze wzorce przyjmują cechy języka Smalltalk / C++, a wybór ten określa, co można, a czego nie można łatwo zaimplementować. Gdybyśmy przyjęli języki proceduralne, moglibyśmy uwzględnić wzorce projektowe zwane "dziedziczeniem", "enkapsulacją"i " polimorfizmem". Podobnie, niektóre z naszych wzorców są wspierane bezpośrednio przez mniej popularne zorientowane obiektowo języki. CLOS ma na przykład wiele metod, które zmniejszają zapotrzebowanie na wzór, taki jak odwiedzający. W rzeczywistości istnieje wystarczająco dużo różnic między Smalltalkiem A C++, aby oznaczać, że niektóre wzorce mogą być łatwiej wyrażone w jednym języku niż w drugim. (Patrz na przykład Iterator.)

(powyższy cytat jest cytatem ze wstępu do książki wzorce projektowe, Strona 4, ust. 3)

Główne cechy funkcjonalnego programowanie obejmuje funkcje takie jak pierwsza klasa wartości, currying, niezmienne wartości itp. Nie wydaje się dla mnie oczywiste, że wzorce projektowe OO są zbliżone do któregokolwiek z tych funkcje.

Jaki jest wzorzec poleceń, jeśli nie przybliżenie funkcji pierwszej klasy? :) W języku FP wystarczy przekazać funkcję jako argument do innej funkcji. W języku OOP musisz zawinąć funkcję w klasę, którą możesz utworzyć, a następnie przekazać ten obiekt do innej funkcji. Efekt jest taki sam, ale w OOP nazywa się to wzorcem projektowym i wymaga dużo więcej kodu. A czym jest abstrakcyjny wzór fabryczny, jeśli nie currying? Przekazuj parametry do funkcji po trochu, aby skonfigurować, jaką wartość wypluwa, gdy w końcu ją wywołasz.

Tak więc, kilka wzorców projektowych GoF jest zbędnych w językach FP, ponieważ istnieją bardziej wydajne i łatwiejsze w użyciu alternatywy.

Ale oczywiście nadal istnieją wzorce projektowe, które są nie rozwiązywane przez języki FP. Co to jest FP odpowiednik Singletona? (Pomijając przez chwilę, że singletony są ogólnie okropnym wzorem w użyciu)

I działa w obie strony. Jak już mówiłem, FP też ma swoje wzorce projektowe, ludzie po prostu zwykle nie myślą o nich jako o takich.

Ale mogłeś natknąć się na monady. Czym są, jeśli nie wzorcem do "radzenia sobie z Państwem globalnym"? Jest to problem, który jest tak prosty w językach OOP, że nie ma tam równoważnego wzorca projektowego.

My nie potrzebujesz wzorca projektowego dla "increment a static variable", lub "read from that socket", ponieważ jest to po prostu to, co robisz .

W (czystych) językach funkcyjnych efekty uboczne i zmienny Stan są niemożliwe, chyba że obejdziesz je za pomocą monad "wzorca projektowego" lub jakiejkolwiek innej metody pozwalającej na to samo.

DODATKOWO w językach funkcyjnych które obsługują OOP (np. F # i OCaml), wydaje mi się oczywiste, że programistów korzystających z tych języki wykorzystywałby te same wzorce projektowe dostępne dla każdego innego OOP język. W rzeczywistości, w tej chwili używam F# i OCaml codziennie, i nie ma uderzające różnice między wzory, których używam w tych językach vs wzory, których używam pisząc w Java.

Może dlatego, że wciąż myślisz imperatywnie? Wiele osób, po całym swoim życiu, ma trudności z porzuceniem tego nawyku, gdy próbuje funkcjonalnego język. (Widziałem dość zabawne próby w F#, gdzie dosłownie Każda funkcja była tylko ciągiem poleceń 'let', w zasadzie tak, jakbyś wziął program C i zamienił wszystkie średniki na 'let'. :))

Ale inną możliwością może być to, że po prostu nie zdałeś sobie sprawy, że rozwiązujesz problemy trywialnie, które wymagałyby wzorców projektowych w języku OOP.

Kiedy używasz currying, lub przekazujesz funkcję jako argument do innego, zatrzymaj się i pomyśl o tym, jak zrobiłbyś to w języku OOP.

Czy jest jakaś prawda w twierdzeniu, że programowanie funkcjonalne eliminuje potrzebujesz wzorców projektowych OOP?

Tak. :) Pracując w języku FP, nie potrzebujesz już wzorców projektowych specyficznych dla OOP. Ale nadal potrzebujesz ogólnych wzorców projektowych, takich jak MVC lub inne rzeczy nie specyficzne dla OOP, a zamiast tego potrzebujesz kilku nowych "wzorców projektowych" specyficznych dla FP. Wszystkie języki mają swoje wady, a wzorce projektowe są zazwyczaj jak pracujemy wokół nich.

W każdym razie, może okazać się interesujące spróbować swoich sił w "czystszych" językach FP, takich jak ML (mój ulubiony, przynajmniej w celach edukacyjnych), lub Haskell, gdzie nie masz OOP kulę do upadku z powrotem, gdy masz do czynienia z czymś nowym.


Zgodnie z oczekiwaniami, kilka osób sprzeciwiło się mojej definicji wzorców projektowych jako "łatanie niedociągnięć w języku" , więc oto moje uzasadnienie: Jak już wspomniano, większość wzorców projektowych to specyficzny dla jednego paradygmatu programowania, a czasem nawet dla jednego określonego języka. Często rozwiązują problemy, które tylko istnieją w tym paradygmacie (Patrz monady dla FP, lub abstrakcyjne fabryki dla OOP). Dlaczego W FP nie istnieje wzorzec abstrakcyjnej fabryki? Ponieważ problem, który próbuje rozwiązać, tam nie istnieje. Tak więc, jeśli w językach OOP istnieje problem, który nie istnieje w językach FP, to oczywiście jest to wada języków OOP. Problem można rozwiązać, ale twój język tak nie rób tego, ale wymaga od ciebie kodu kotła, aby obejść to. Idealnie, chcielibyśmy, aby nasz język programowania magicznie sprawił, że wszystkie problemy zniknęły. Każdy problem, który nadal istnieje, jest w zasadzie niedociągnięciem języka. ;)

 973
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 06:18:35

Czy jest jakaś prawda w twierdzeniu, że programowanie funkcjonalne eliminuje potrzebę wzorców projektowych OOP?

Programowanie funkcyjne nie jest tym samym co programowanie obiektowe. Obiektowe wzorce projektowe nie mają zastosowania do programowania funkcyjnego. Zamiast tego masz funkcjonalne wzorce projektowe programowania.

W przypadku programowania funkcyjnego, nie będziesz czytać książek oo wzorców projektowych, będziesz czytać inne książki o wzorcach projektowych FP.

Język agnostic

Nie do końca. Tylko język-agnostyk w odniesieniu do języków OO. Wzorce projektowe w ogóle nie dotyczą języków proceduralnych. Ledwo mają sens w kontekście projektowania relacyjnych baz danych. Nie mają zastosowania przy projektowaniu arkusza kalkulacyjnego.

Typowy wzorzec projektowy OOP i jego funkcjonalny odpowiednik?

Powyższe nie powinno istnieć. To jak prośba o fragment kodu proceduralnego przepisany jako kod OO. Hmmm... Jeśli przetłumaczę oryginalny Fortran (lub C) na Javę, nie zrobiłem nic więcej niż przetłumaczyć. Jeśli całkowicie przepiszę go do paradygmatu OO, nie będzie już wyglądał jak oryginalny Fortran lub C -- będzie nierozpoznawalny.

Nie ma prostego odwzorowania od projektu OO do projektu funkcjonalnego. Są bardzo różne sposoby patrzenia na problem.

Programowanie funkcyjne (jak wszystkie style programowania) ma wzorce projektowe. Relacyjne bazy danych mają wzorce projektowe, OO ma wzorce projektowe, programowanie proceduralne ma wzorce projektowe. Wszystko ma wzorce projektowe, nawet architektura budynków.

Wzorce projektowe - jako koncepcja-są ponadczasowym sposobem budowania, niezależnie od technologii czy dziedziny problemu. Jednak konkretne wzorce projektowe odnoszą się do konkretnych dziedzin problemowych i technologii. Każdy, kto myśli o tym, co robi, odkryje wzorce projektowe.
 137
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 21:40:05

Komentarze Briana na temat ścisłego związku między językiem a wzorcem są do rzeczy,

Brakującą częścią tej dyskusji jest pojęcie idiomu. Duży wpływ miała tu książka copliena " Advanced C++". Na długo przed odkryciem Christophera Alexandra i Kolumny Bez Nazwy (i nie można rozsądnie mówić o wzorcach bez czytania Alexandra), mówił o znaczeniu opanowania idiomu w prawdziwej nauce języka. Używał string copy w C jako przykład, while (*from++ = * to++); możesz to zobaczyć jako bandaid dla brakującej funkcji języka( lub funkcji biblioteki), ale to, co naprawdę się w tym liczy, to to, że jest to większa jednostka myśli lub ekspresji niż jakakolwiek z jej części.

To właśnie próbują robić wzorce i języki, aby umożliwić nam bardziej zwięzłe wyrażanie naszych intencji. Im bogatsze jednostki myśli, tym bardziej złożone myśli można wyrazić. Posiadanie bogatego, współdzielonego słownictwa w różnych skalach-od systemu architektura w dół do nieco twidling-pozwala nam na bardziej inteligentne rozmowy, i myśli o tym, co powinniśmy robić.

Możemy również, jako jednostki, uczyć się. I to jest cały cel ćwiczenia. Każdy z nas potrafi zrozumieć i używać rzeczy, których nigdy nie potrafilibyśmy o sobie myśleć. Języki, frameworki, biblioteki, wzorce, idiomy itd. mają swoje miejsce w dzieleniu się intelektualnym bogactwem.

 42
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-01 20:59:55

Książka GOF wyraźnie wiąże się z OOP - tytuł to wzorce projektowe-elementy oprogramowania Wielokrotnego Użytku zorientowanego obiektowo (akcent mine.)

 37
Author: bright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-24 15:49:21

Design Patterns in Dynamic Programming autorstwa Petera Norviga ma przemyślane omówienie tego ogólnego tematu, choć o językach "dynamicznych" zamiast "funkcjonalnych" (jest nakładanie się).

 33
Author: Darius Bacon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-29 20:23:43

Oto kolejny link, omawiający ten temat: http://blog.ezyang.com/2010/05/design-patterns-in-haskel/

W swoim wpisie na blogu Edward opisuje wszystkie 23 oryginalne wzorce GoF pod względem Haskella.

 24
Author: folone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-19 08:15:59

Kiedy spróbujesz spojrzeć na to na poziomie " wzorców projektowych "(ogólnie) i "FP kontra OOP", odpowiedzi, które znajdziesz, będą w najlepszym razie mroczne.

Przejdź głębiej na obu osiach i zastanów się nad specyficznymi wzorcami projektowymi i nad specyficznymi cechami języka , a wszystko stanie się jaśniejsze.

Więc np. jakieś konkretne wzorce, np. Visitor, Strategia, polecenie i Observer definitywnie zmienić lub zniknąć, gdy używanie języka z algebraicznymi typami danych i dopasowywaniem wzorców, zamknięcia, Funkcje pierwszej klasy , itd. Niektóre inne wzory z książki GoF nadal "trzymać się", choć.

Ogólnie rzecz biorąc, powiedziałbym, że z czasem konkretne wzorce są eliminowane przez nowe (lub po prostu rosnącą popularność) funkcje językowe. Jest to naturalny bieg projektowania języka; w miarę jak języki stają się bardziej zaawansowane, abstrakcje, które wcześniej można było wywołać tylko w książki z przykładami stają się teraz aplikacjami określonej funkcji językowej lub biblioteki.

(Na bok: oto ostatni blog, który napisałem, który ma inne linki do dalszej dyskusji na temat FP i wzorców projektowych.)

 18
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-29 23:15:45

Prezentacja Norviga nawiązuje do analizy wszystkich wzorców GoF, którą zrobili, i mówią, że 16 z 23 wzorców miało prostsze implementacje w językach funkcyjnych lub po prostu były częścią języka. Prawdopodobnie więc przynajmniej siedem z nich albo było a) równie skomplikowanych, albo b) nieobecnych w języku. Niestety dla nas nie są one wymienione!

Myślę, że jest jasne, że większość "kreacyjnych " lub" strukturalnych " wzorców w GoF to tylko sztuczki, aby uzyskać prymitywne systemy typu w Javie lub C++, aby robić to, co chcesz. Ale reszta jest warta rozważenia, bez względu na to, w jakim języku programujesz.

Jeden może być prototypem; chociaż jest to podstawowe pojęcie JavaScript, musi być zaimplementowany od podstaw w innych językach.

Jednym z moich ulubionych wzorców jest NULL Object pattern: reprezentują brak czegoś jako obiektu, który nie robi odpowiedniego rodzaju niczego. Może to być łatwiejsze do modelowania w języku funkcjonalnym. Jednak prawdziwym osiągnięciem jest zmiana perspektywy.

 15
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-19 22:41:28

Powiedziałbym, że jeśli masz Język taki jak Lisp z obsługą makr, możesz zbudować własne abstrakcje specyficzne dla domeny, abstrakcje, które często są znacznie lepsze niż ogólne rozwiązania idiomu.

 15
Author: Anders Rune Jensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-22 00:09:18

I nawet rozwiązania wzorców projektowych oo są specyficzne dla języka. Wzorce projektowe to rozwiązania typowych problemów, których język programowania nie rozwiązuje za Ciebie. W Javie wzór Singletona rozwiązuje problem "jednego z czegoś" (uproszczony). W Scali oprócz klasy masz konstrukcję najwyższego poziomu o nazwie Object. Jest leniwie utworzony i jest tylko jeden. Nie musisz używać wzoru Singletona, aby uzyskać Singleton. To część języka.

 9
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 18:02:04

Jak mówili inni, istnieją wzorce specyficzne dla programowania funkcyjnego. Myślę, że kwestia pozbycia się wzorców projektowych to nie tyle kwestia przejścia na funkcjonalność, co kwestia cech języka .

Zobacz, jak Scala radzi sobie z "wzorcem Singletona": po prostu deklarujesz obiekt zamiast klasy. Inna funkcja, dopasowanie wzorca, pomaga uniknąć clunkiness wzorca odwiedzającego. Zobacz porównanie proszę.: http://andymaleh.blogspot.com/2008/04/scalas-pattern-matching-visitor-pattern.html

A Scala, podobnie jak F#, jest fuzją OO-functional. Nie wiem jak F # ale pewnie ma takie funkcje.

Zamknięcia są obecne w języku funkcjonalnym, ale nie muszą być ograniczone do nich. Pomagają przy wzorze delegatora.

Jeszcze jedno spostrzeżenie. Ten fragment kodu implementuje wzorzec: jest taki klasyczny i tak żywiołowy, że zazwyczaj nie myślimy tego jako "wzór", ale na pewno jest:
for(int i = 0; i < myList.size(); i++) { doWhatever(myList.get(i)); }

Języki imperatywne, takie jak Java i C#, przyjęły coś, co jest zasadniczo konstrukcją funkcjonalną, aby sobie z tym poradzić: "foreach".

 8
Author: Germán,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-29 21:43:53

Wzorce są sposobami rozwiązywania podobnych problemów, które są wielokrotnie widziane, a następnie opisywane i dokumentowane. Tak więc nie, FP nie zastąpi wzorców; jednak FP może tworzyć nowe wzorce i sprawić, że niektóre obecne wzorce "najlepszych praktyk" staną się "przestarzałe".

 8
Author: Edwin Buck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-26 02:10:48

Wzorce projektowe GoF są recepturami obejścia kodu dla języków OO, które są potomkami Simula 67, takich jak Java i C++.

Większość "chorób" leczonych wzorcami projektowymi jest spowodowana przez:

  • klasy typowane statycznie, które określają obiekty, ale same nie są obiektami;
  • Ograniczenie do pojedynczej wysyłki (do wybrania metody używany jest tylko lewy argument, pozostałe argumenty są traktowane tylko jako typy statyczne: jeśli mają typy dynamiczne, to do góry do metody uporządkowania tego za pomocą podejść ad-hoc);
  • rozróżnienie między regularnymi wywołaniami funkcji a obiektowymi wywołaniami funkcji, co oznacza, że funkcje obiektowe nie mogą być przekazywane jako argumenty funkcyjne, w których oczekuje się regularnych funkcji i odwrotnie; oraz
  • rozróżnienie między "typami bazowymi" i "typami klasowymi".

Nie ma ani jednego z tych wzorców projektowych, który nie zniknie w systemie obiektów Common Lisp, mimo że rozwiązanie jest skonstruowany zasadniczo w taki sam sposób, jak w odpowiednim wzorze projektowym. (Co więcej, ten system obiektowy wyprzedza księgę GoF o ponad dekadę. Common Lisp stał się standardem ANSI w tym samym roku, w którym ta książka została po raz pierwszy opublikowana.)

Jeśli chodzi o programowanie funkcyjne, to od tego, czy dany język programowania funkcyjnego ma jakiś system obiektowy, zależy czy jest on wzorowany na systemach obiektowych, które korzystają z wzorców. Ten typ orientacji obiektowej nie miesza się dobrze z programowaniem funkcyjnym, ponieważ mutacja stanu znajduje się na pierwszym planie.

Budowa i dostęp bez mutacji są kompatybilne z programowaniem funkcjonalnym, a więc mogą mieć zastosowanie wzory, które mają związek z abstrakcyjnym dostępem lub konstrukcją: wzory takie jak Fabryka, Fasada, Proxy, dekorator, gość.

Z drugiej strony wzorce zachowań, takie jak stan i strategia, prawdopodobnie nie bezpośrednio Zastosuj w funkcjonalnym OOP, ponieważ mutacja stanu jest ich rdzeniem. Nie oznacza to, że nie mają zastosowania; być może w jakiś sposób stosują się w połączeniu z dowolnymi sztuczkami dostępnymi do symulacji stanu zmiennego.

 8
Author: Kaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-16 01:42:33

Chciałbym podłączyć kilka doskonałych, ale nieco gęstych artykułów Jeremy 'ego Gibbonsa:" wzorce projektowe jako typy danych wyższego rzędu-programy generyczne "i" istota wzorca iteratora " (oba dostępne tutaj: http://www.comlab.ox.ac.uk/jeremy.gibbons/publications/).

Oba te opisują, w jaki sposób idiomatyczne konstrukcje funkcjonalne obejmują teren, który jest objęty określonymi wzorami projektowymi w innych (obiektowych) Ustawieniach.

 7
Author: sclv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-22 02:51:29

Nie można prowadzić tej dyskusji bez poruszania systemów typów.

Główne cechy programowania funkcyjnego obejmują funkcje jako wartości pierwszej klasy, Curry, niezmienne wartości itp. Nie wydaje mi się oczywiste, że wzorce projektowe oo zbliżają się do żadnej z tych funkcji.

To dlatego, że te funkcje nie rozwiązują tych samych problemów, które robi OOP... są alternatywą dla programowania imperatywnego. Odpowiedź FP na OOP leży w systemach typu ML i Haskell... w szczególności typy sum, abstrakcyjne typy danych, Moduły ML, typy Haskell.

Ale oczywiście nadal istnieją wzorce projektowe, które nie są rozwiązywane przez języki FP. Co to jest FP odpowiednik Singletona? (Pomijając przez chwilę, że singletony są ogólnie okropnym wzorem w użyciu)

Pierwszą rzeczą, jaką robią typeklasy, jest wyeliminowanie potrzeby singletonów.

Możesz przejrzeć listę 23 i wyeliminować więcej, ale nie mam czasu do teraz.

 6
Author: jganetsk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-30 22:20:22

Myślę, że tylko dwa wzorce projektowe GoF mają na celu wprowadzenie logiki programowania funkcyjnego do naturalnego języka OO. Myślę o strategii i dowodzeniu. Niektóre inne wzorce projektowe GoF mogą być modyfikowane przez programowanie funkcjonalne w celu uproszczenia projektu i zachowania celu.

 4
Author: jonsca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 10:30:52