Ponieważ język maszynowy (np. 0110101000110101
) Języki komputerowe ewoluowały w kierunku wyższych form abstrakcji, ogólnie ułatwiając zrozumienie kodu, gdy dotyczy on problemu. Asembler był abstrakcją nad kodem maszynowym, C był abstrakcją nad asemblerem itp.
Projektowanie obiektowe wydaje się bardzo dobrze pozwalać modelować problem pod względem obiektów, np. Problem systemu rejestracji na studia można modelować za pomocą Course
klasy, Student
klasy itp. Następnie, pisząc rozwiązanie w języku OO mamy podobne klasy, które przyjmują obowiązki i co na ogół jest pomocne przy projektowaniu, szczególnie do modularyzacji kodu. Jeśli dam ten problem 10 niezależnym zespołom, które rozwiążą go metodą OO, ogólnie 10 rozwiązań będzie miało wspólne klasy związane z problemem. Różnic może być wiele, kiedy zaczniesz się łączyć i interakcji tych klas, więc nie ma czegoś takiego jak „zerowa luka reprezentacyjna”.
Moje doświadczenie z programowaniem funkcjonalnym jest bardzo ograniczone (bez użycia w świecie rzeczywistym, tylko programy typu Hello World). Nie widzę, w jaki sposób takie języki pozwalają na łatwe mapowanie rozwiązań FP na problemy (z małą luką reprezentacyjną), tak jak robią to języki OO.
Rozumiem zalety FP w odniesieniu do programowania współbieżnego. Ale czy czegoś mi brakuje, czy FP nie polega na zmniejszeniu luki reprezentacyjnej (ułatwienie zrozumienia rozwiązań)?
Innym sposobem na zadanie tego pytania: czy kod FP 10 różnych zespołów rozwiązujących ten sam rzeczywisty problem ma wiele wspólnego?
Z Wikipedii na temat Abstrakcji (informatyka) (moje wyróżnienie):
Funkcjonalne języki programowania zwykle wykazują abstrakcje związane z funkcjami , takie jak abstrakcje lambda (przekształcenie terminu w funkcję jakiejś zmiennej), funkcje wyższego rzędu (parametry to funkcje), abstrakcja w nawiasie (przekształcenie terminu w funkcję zmiennej).
Luka reprezentacyjna mogłaby zostać potencjalnie zwiększona, ponieważ [niektórych] problemów w świecie rzeczywistym nie da się łatwo modelować za pomocą takich abstrakcji.
Innym sposobem, w jaki widzę zmniejszającą się lukę reprezentacyjną, jest prześledzenie elementów rozwiązania z powrotem do problemu. 0
„S i 1
s w kodzie maszynowym jest bardzo trudny do prześledzenia, podczas gdy Student
klasa jest łatwa do prześledzenia. Nie wszystkie klasy OO łatwo śledzą obszar problemów, ale wiele z nich.
Czy abstrakcje FP nie zawsze wymagają wyjaśnienia, aby dowiedzieć się, którą część problematycznej przestrzeni rozwiązują (oprócz problemów matematycznych )?OK - jestem dobry z tej strony. Po przeanalizowaniu wielu innych przykładów widzę, jak abstrakcje FP są bardzo jasne dla części problemu wyrażonej w przetwarzaniu danych.
Akceptowana odpowiedź na powiązane pytanie Czy można używać UML do modelowania programu funkcjonalnego? - mówi „Funkcjonalni programiści nie mają większego zastosowania do tworzenia diagramów”. Naprawdę nie dbam o to, czy jest to UML, ale zastanawiam się, czy abstrakty FP są łatwe do zrozumienia / komunikacji, jeśli nie ma powszechnie używanych diagramów (zakładając, że ta odpowiedź jest poprawna). Ponownie, mój poziom wykorzystania / zrozumienia FP jest trywialny, więc nie rozumiem potrzeby schematów na prostych programach FP.
Projekt OO ma poziomy abstrakcji dla funkcji / klasy / pakietu, z enkapsulacją (kontrola dostępu, ukrywanie informacji), co ułatwia zarządzanie złożonością. Są to elementy, które pozwalają łatwiej przejść od problemu do rozwiązania i wrócić.
Wiele odpowiedzi mówi o tym, jak analizy i projektowanie są wykonywane w FP w sposób analogiczny do OO, ale jak dotąd nikt nie przytacza niczego wysokiego poziomu (Paul zacytował kilka interesujących rzeczy, ale jest niski poziom). Wczoraj dużo ćwiczyłem w Google i znalazłem ciekawą dyskusję. Poniżej pochodzi z Refactoring Functional Programs autorstwa Simona Thompsona (2004) (wyróżnienie moje)
Przy projektowaniu systemu obiektowego przyjmuje się za pewnik, że projekt poprzedzi programowanie. Projekty będą pisane przy użyciu systemu takiego jak UML, który jest obsługiwany w narzędziach takich jak Eclipse. Początkujący programiści mogą nauczyć się projektowania wizualnego przy użyciu systemów takich jak BlueJ. Prace nad podobną metodologią programowania funkcjonalnego opisano w FAD: Analiza i projektowanie funkcjonalne , ale niewiele jest innych prac. Przyczyn może być wiele.
Istniejące programy funkcjonalne mają skalę, która nie wymaga projektowania. Wiele programów funkcjonalnych jest niewielkich, ale inne, takie jak Glasgow Haskell Compiler, są znaczne.
Programy funkcjonalne bezpośrednio modelują domenę aplikacji, przez co projektowanie nie ma znaczenia. Podczas gdy języki funkcjonalne zapewniają wiele potężnych abstrakcji, trudno argumentować, że zapewniają one wszystkie abstrakcje potrzebne do modelowania świata rzeczywistego.
Programy funkcjonalne są budowane jako ewoluująca seria prototypów.
W cytowanej powyżej rozprawie doktorskiej korzyści wynikające z zastosowania metodologii analizy i projektowania (ADM) są przedstawione niezależnie od paradygmatów. Podano jednak argument, że ADM powinny być zgodne z paradygmatem implementacji. Oznacza to, że OOADM działa najlepiej w programowaniu OO i nie jest dobrze stosowany w innym paradygmacie, takim jak FP. Oto świetny cytat, który, jak myślę, parafrazuje to, co nazywam luką reprezentacyjną:
można długo spierać się o to, który paradygmat zapewnia najlepsze wsparcie dla rozwoju oprogramowania, ale osiąga się najbardziej naturalny, wydajny i skuteczny pakiet programistyczny, gdy pozostaje się w obrębie jednego paradygmatu, od opisu problemu do wdrożenia i dostarczenia.
Oto zestaw diagramów zaproponowanych przez FAD:
- diagramy zależności funkcji przedstawiające funkcję z tymi, których używa w swojej implementacji;
- diagram zależności typów, który zapewnia tę samą usługę dla typów; i,
- diagramy zależności modułów, które przedstawiają widoki architektury modułu systemu.
W sekcji 5.1 pracy FAD znajduje się studium przypadku, które jest systemem do automatyzacji produkcji danych związanych z ligą piłki nożnej. Wymagania są w 100% funkcjonalne, np. Wprowadzanie wyników piłki nożnej, tworzenie tabel ligowych, tabel wyników, tabel obecności, przenoszenie graczy między drużynami, aktualizowanie danych po nowych wynikach itp. Nie udokumentowano, jak FAD działa w celu rozwiązania niefunkcjonalnych wymagań , oprócz stwierdzenia, że „nowa funkcjonalność powinna być dozwolona przy minimalnym koszcie”, co jest prawie niemożliwe do przetestowania.
Niestety, oprócz FAD, nie widzę żadnych współczesnych odniesień do języków modelowania (wizualnych), które byłyby proponowane dla FP. UML to kolejny paradygmat, więc powinniśmy o tym zapomnieć.