2010-12-14 14 views
19

W jaki sposób Clojure aproach Separation of Concerns? Ponieważ kod to dane, funkcje mogą być przekazywane jako parametry i używane jako zwroty ...W jaki sposób Clojure stosuje oddzielenie problemów?

A ponieważ istnieje zasada "Lepsze 1000 funkcji, które działają na 1 strukturze danych, niż 100 funkcji na 100 strukturach danych" (lub coś w tym stylu).

Mam na myśli, spakuj wszystko na mapie, podaj jako kluczowe słowo kluczowe, i to wszystko? funkcje, skalary, kolekcje, wszystko ...

Idea Rozdzielania Obrażeń realizowana jest w języku Java za pomocą Aspektów (programowanie zorientowane na aspekt) i adnotacji. To jest mój pogląd na tę koncepcję i może być nieco ograniczony, więc nie przyjmuj tego za pewnik.

Jaki jest właściwy sposób (idiomatycznych sposób) do tego zabrać w Clojure, aby uniknąć WTFs z innymi programistami _

+3

Mógłbyś być bardziej konkretny na temat tego, o co pytasz. Separacja obaw to termin oznaczający 100 różnych rzeczy. – Sami

+1

Aspekty to sposób na modyfikację zachowania istniejącego kodu bez dostępu do jego źródła. Clojure i inne Lispy dostarczają czegoś podobnego poprzez zmienne dynamiczne, które są w zasadzie globalne z własnymi stosami. Funkcje najwyższego poziomu (utworzone za pomocą defn) są zmiennymi dynamicznymi i mogą być związane z 'binding'. Składnia 'binding' wygląda podobnie do' let', ale powiązanie jest używane wewnątrz wywołań wewnątrz formularza wiążącego. – Zak

Odpowiedz

60

w języku funkcjonalnym, najlepszym sposobem radzenia sobie z separacji obawy jest konwersja żadnego problemu programowania w zestaw transformacji na strukturze danych. Na przykład, jeśli piszesz aplikację internetową, ogólnym celem jest pobranie żądania i przekształcenie go w odpowiedź, która może być traktowana jako zwykłe przekształcenie danych żądania w dane odpowiedzi. (W nietrywialnej aplikacji internetowej dane początkowe prawdopodobnie obejmowałyby nie tylko żądanie, ale także informacje o sesji i bazie danych) Większość zadań programistycznych można w ten sposób wymyślić.

Każda "troska" byłaby funkcją "rurociągu", która pomaga w przekształceniu. W ten sposób każda funkcja jest całkowicie oddzielona od pozostałych kroków.

Należy zauważyć, że oznacza to, że dane, które podlegają tym przekształceniom, muszą być bogate w swoją strukturę. Zasadniczo chcemy umieścić całą "inteligencję" naszego programu w danych, a nie w kodzie. W skomplikowanym programie funkcjonalnym dane na różnych poziomach mogą być na tyle złożone, że muszą wyglądać jak język programowania - to tutaj zaczyna się idea "języków specyficznych dla danej domeny".

Clojure ma doskonałą obsługę manipulowania złożonych niejednorodną grupę struktur danych, co czyni to mniej kłopotliwe niż się może wydawać (czyli nie jest to uciążliwe w ogóle, jeśli zrobione dobrze)

Ponadto wsparcie Clojure dla leniwych struktur danych pozwala nich pośrednie struktury danych, aby rzeczywiście były (koncepcyjnie) nieskończone, co umożliwia rozłączenie w większości scenariuszy. Zapoznaj się z poniższym artykułem, aby dowiedzieć się, dlaczego posiadanie nieskończonych struktur danych jest tak cenne w tej sytuacji: http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

To podejście "rurociągowe" może zaspokoić 90% potrzeb w zakresie oddzielania problemów. Dla pozostałych 10% można użyć makr Clojure, które na wysokim poziomie można uważać za bardzo potężne narzędzie do programowania aspektowego.

W ten sposób wierzę, że najlepiej można rozdzielić obawy w Clojure- Należy zauważyć, że "przedmioty" lub "aspekty" nie są tak naprawdę potrzebnymi koncepcjami w tym podejściu.

+0

Dobrze powiedziane!Jako dodatkową uwagę, jeśli większość twoich funkcji jest czysta, możesz łatwo przetestować je niezależnie. –

+0

, więc zamiast obiektów (w językach OO) otrzymujesz struktury (w językach funkcjonalnych). Jest to odpowiednia "koncepcja" enkapsulacji (w celu osiągnięcia wysokiej kohezji, niskiego sprzężenia, czarnych skrzynek, modularności)? Czy ma imię? – Belun

+0

dobra lektura, która mówi o podobnym podejściu do potoku (choć w Pythonie): http://www.dabeaz.com/generators/Generators.pdf – szx

Powiązane problemy