Оскільки машинна мова (наприклад, 0110101000110101
) комп'ютерні мови, як правило, переросла у вищі форми абстрагування, загалом полегшуючи розуміння коду при застосуванні до проблеми. Assembler - це абстракція над машинним кодом, C - абстракція над асемблером тощо.
Об'єктно-орієнтований дизайн здається дуже хорошим, що дозволяє нам моделювати проблему з точки зору об'єктів, наприклад, проблема системи реєстрації університетських курсів може моделюватися з Course
класом, Student
класом тощо. Потім, коли ми пишемо рішення мовою ОО, ми маємо подібні класи, які несуть відповідальність, і це, як правило, корисно для проектування, особливо для модуляції коду. Якщо я даю цю проблему 10 незалежним командам, які вирішують її методом ОО, загалом 10 рішень матимуть спільні класи, що стосуються проблеми. Коли ви починаєте зв'язуватися та взаємодіяти між цими класами, може виникнути велика різниця, тому немає такого поняття, як "нульовий розрив у репрезентації".
Мій досвід функціонального програмування дуже обмежений (використання в реальному світі не використовується, лише програми типу Hello World). Я не бачу, як такі мови дозволяють легко відображати рішення FP для проблем (з низьким представницьким розривом), як це роблять мови OO.
Я розумію переваги FP щодо одночасного програмування. Але я щось пропускаю, чи FP не про зменшення представницького розриву (полегшення розуміння рішень)?
Ще один спосіб запитати це: чи має FP-код 10 різних команд, що вирішують ту саму проблему в реальному світі, багато спільного?
З Вікіпедії з абстракції (інформатика) (моє наголос):
Мови функціонального програмування зазвичай демонструють абстракції, пов'язані з функціями , такими як лямбда-абстракції (перетворення терміна у функцію якоїсь змінної), функції вищого порядку (параметри - функції), дужки абстракції (перетворення терміна у функцію змінної).
Представницький розрив може бути потенційно збільшений, оскільки [деякі] проблеми в реальному світі не моделюються легко за допомогою таких абстракцій.
Інший спосіб, який я бачу, зменшується представницький розрив, - це відшукати елементи рішення до проблеми. У машинному коді 0
'і 1
s ' дуже важко відстежити, тоді як Student
клас легко простежити назад. Не всі класи OO легко простежують проблемний простір, але багато хто робить.
Чи не потрібно абстракціям ПЗ завжди пояснювати, щоб з’ясувати, яку частину проблемного простору вони вирішують (крім математичних задач)?Гаразд - я добре в цій частині. Переглянувши ще багато прикладів, я бачу, як абстракції FP дуже зрозумілі для частини проблеми, яка виражається при обробці даних.
Прийнята відповідь на пов’язане питання Чи можна використовувати UML для моделювання функціональної програми? - говорить: "Функціональні програмісти не мають великої користі для діаграм". Мені справді все одно, чи це UML, але це змушує мене замислитись про те, як абстракції FP легко зрозуміти / спілкуватися, якщо немає діаграм, які широко використовуються (якщо вважати, що ця відповідь є правильною). Знову ж таки, мій рівень використання / розуміння ПС є тривіальним, тому я не розумію потреби в діаграмах для простих програм FP.
Проект OO має рівні функцій / класів / пакетів абстракції, з інкапсуляцією (контроль доступу, приховування інформації) на кожному, що полегшує управління складністю. Це елементи, які дозволяють простіше перейти від проблеми до рішення та назад.
Багато відповідей говорять про те, як аналіз і проектування робляться в ПП аналогічно OO, але поки що ніхто не цитує нічого високого рівня (Паул цитував якісь цікаві речі, але це низький рівень). Я вчора багато зробив Google, і знайшов цікаву дискусію. Далі - з функціональних програм Refactoring від Simon Thompson (2004 )
При проектуванні об'єктно-орієнтованої системи, це само собою зрозуміло, що дизайн буде передувати програмуванню. Дизайн буде написано за допомогою системи типу UML, яка підтримується в таких інструментах, як Eclipse. Починаючі програмісти цілком можуть вивчити підхід до візуального дизайну за допомогою таких систем, як BlueJ. Про роботу над аналогічною методологією функціонального програмування повідомляється у FAD: Функціональний аналіз та проектування , але мало інших робіт існує. Для цього може бути ряд причин.
Існуючі функціональні програми мають масштаб, який не потребує розробки. Багато функціональних програм є невеликими, але інші, наприклад, Glasgow Haskell Compiler, є суттєвими.
Функціональні програми безпосередньо моделюють область додатків, тим самим робить дизайн нерелевантним. Хоча функціональні мови надають різноманітні потужні абстракції, важко стверджувати, що вони забезпечують усі, і лише абстракції, необхідні для моделювання реального світу.
Функціональні програми будуються як розвивається серія прототипів.
У цитованій кандидатській дисертації переваги використання методів аналізу та проектування (ADM) окреслені незалежно від парадигм. Але зроблено аргумент, що ADM повинні узгоджуватися з парадигмою реалізації. Тобто OOADM найкраще працює для програмування OO і недостатньо застосовується до іншої парадигми, такої як FP. Ось чудова цитата, на яку я думаю, перефразовуючи те, що я називаю представницьким розривом:
можна довго сперечатися щодо того, яка парадигма забезпечує найкращу підтримку для розробки програмного забезпечення, але можна досягти найбільш природного, ефективного та найефективнішого пакета розробок, коли залишається в межах однієї парадигми від опису проблеми до впровадження та доставки.
Ось набір діаграм, запропонованих FAD:
- діаграми залежності функцій, які представляють функцію з тими, які вона використовує для своєї реалізації;
- діаграма залежності типу, яка забезпечує однакову послугу для типів; і,
- діаграми залежності модулів, які представляють представлення архітектури модуля системи.
У розділі 5.1 дисертації FAD є тематичне дослідження, яке є системою автоматизації виробництва даних, що стосуються футбольної (футбольної) ліги. Вимоги є на 100% функціональними, наприклад, введення футбольних результатів, виготовлення таблиць ліг, таблиць заліку, таблиць відвідуваності, передачі гравців між командами, оновлення даних після нових результатів тощо. Не згадується, як FAD працює на вирішення нефункціональних вимог. окрім того, що "нову функціональність слід дозволити за мінімальних витрат", що майже неможливо перевірити.
На жаль, окрім FAD, я не бачу жодних сучасних посилань на мови моделювання (візуальні), які пропонуються для FP. UML - це ще одна парадигма, тому ми повинні забути про це.