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.
Mógłbyś być bardziej konkretny na temat tego, o co pytasz. Separacja obaw to termin oznaczający 100 różnych rzeczy. – Sami
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