10

Mamy bardzo fajną książkę GoF (Wzorce projektowe: elementy oprogramowania wielokrotnego użytku) na temat wzorców w programowaniu obiektowym oraz wiele artykułów i zasobów w sieci na ten temat Przedmiot.Wzory funkcjonalnego, dynamicznego i aspektowego programowania

Czy są jakieś książki (artykuły, zasoby) dotyczące wzorców (najlepszych praktyk) do programowania funkcjonalnego?

Do programowania dynamicznego w językach takich jak Python i Ruby?

Dla AOP?

Odpowiedz

14

Podobne pytanie zadano przed: "Does functional programming replace GoF design patterns", z wielkimi odpowiedziami.

Ekwiwalent "wzorców projektowych" jest bardzo mało precyzyjny w DF. Ogólnie, za każdym razem, gdy widzisz "wzór" w swoim kodzie, powinieneś stworzyć coś, aby pokryć wszystkie swoje zastosowania w jednolity sposób. Często będzie to funkcja wyższego rzędu.

Na przykład, następujący kod C

for (int i = 0; i < n; i++) 
    if (a[i] == 42) 
    return true; 
return false; 

można traktować jakiegoś podstawowego „wzorzec projektowania” - sprawdzenie, czy istnieje jakiś specjalny element na liście.Ten fragment może pojawić się wiele razy w kodzie w różnych warunkach. W DF po prostu wielokrotnie korzystasz z funkcji wyższego rzędu. To już nie jest "wzór".

Programowanie funkcjonalne ma swoje własne praktyki, ale znacznie różnią się one od "wzorców projektowych" w OOP. Obejmują one wykorzystanie polimorfizmu, listy, funkcje wyższego rzędu, niezmienność/czystość, lenistwo [nie wszystkie są niezbędne lub specyficzne dla FP] ... Zobacz także "what are core concepts of FP". Również wpisać klas (Haskell), moduły i funktory (SML), continuations, monads, zippers, finger trees, monoids, arrows, applicative functors, monad transformers wielu purely functional data structures (book) itd Functional pearls wspomniany już przez Randall Schulz, tworzą bardzo bogaty zasoby DF w najlepszym wydaniu.

Aby nauczyć się pisać kod idiomatyczny, każda książka/zasób w funkcjonalnym języku programowania będzie wystarczająca dla IMHO (na przykład: RWH i LYAH); Różnice między myśleniem imperatywnym a funkcjonalnym są tam zawsze wyjaśniane.

W językach dynamicznych link Jeffa Fostera to dobra kolekcja; here to bardzo sprytne użycie funkcji zapamiętywania w JavaScript, które można uznać za "wzorzec projektowy".

2
+1

Czy jestem jedynym, który ma problem z używaniem "programowania dynamicznego" do opisywania programowania w językach dynamicznych? Termin jest już zajęty. To jak ludzie .NET używający "silnego pisania", gdy mają na myśli "statyczne pisanie". – orip

+0

^Nie. Bardzo mi to przeszkadza. – Sneakyness

1

Czy perły funkcjonalne (jeden z) nie są kanonicznymi wzorami projektowymi do programowania funkcjonalnego?

6

Lista wzorców projektowych opisanych w GoF jest napisana dla języków takich jak C++ i Java. Czasami traktuje się ją jako listę rozwiązań, które sprawiają, że sztywne języki stają się bardziej dynamiczne. Na przykład wzorzec Odwiedzający nie jest naprawdę potrzebny w Ruby, ponieważ można po prostu zmienić funkcje dodawania członków do klasy w środowisku wykonawczym. Wzór Decorator jest przestarzały, jeśli możesz użyć mixins.

Z doświadczenia wiem, że kiedy wdrażam rozwiązanie w C++, spędzam większość czasu na pisaniu kodu rusztowania. Zaczynam od stworzenia platformy, która pozwala mi myśleć w domenie programowej mojej aplikacji. Wzory projektowe prawdopodobnie zostały opracowane jako sposób kategoryzacji różnych rodzajów rusztowań.

Powinienem wspomnieć, że kiedy programuję w Ruby, nie mam zbyt wiele kodu pomocniczego. Po prostu nie ma takiej potrzeby.

Moja teoria mówi, że inne języki nie podkreślają koncepcji wzorców projektowych tylko dlatego, że ich podstawowe konstrukcje językowe są wystarczające. W obronie Javy i C++: może dlatego, że języki funkcjonalne i AOP są często używane w bardziej specyficznych domenach lub niszach problemów, podczas gdy Java i C++ są używane do wszystkiego.

A teraz coś innego. Jeśli zaczynasz się nudzić projektem OO i chcesz się czegoś nowego nauczyć, być może zainteresuje Cię książka Elements of Programming napisana przez Stepanov. W tej książce wyjaśnia, w jaki sposób można podchodzić do programowania z matematycznego punktu widzenia. Aby wyświetlić podgląd, sprawdź jego Class notes dla Adobe (znaleziono między innymi na this page). Możesz być także zainteresowany Adobe's Collected Papers.

+0

Częściowo Zgadzam się z Państwem. Na przykład, języki funkcjonalne mają zestaw podobnych cech, aby poradzić sobie z typowymi zadaniami w terenie - rozważ monady/przepływy pracy lub dopasowywanie wzorców lub potokowanie. Na przykład, taki dynamiczny i elastyczny język, jak Python przekazuje wzór Decorator, mimo że jest wbudowany w język. –

0

Osobiście mój najważniejszy wzór dla języków dynamicznych - testy pisania. Jest to nawet ważniejsze niż w językach statycznie napisanych.