Поскольку машинный язык (например, 0110101000110101
) компьютерные языки, как правило, эволюционировали до более высоких форм абстракции, обычно облегчая понимание кода при его применении к проблеме. Ассемблер был абстракцией над машинным кодом, C был абстракцией над ассемблером и т. Д.
Кажется, что объектно-ориентированный дизайн очень хорошо позволяет нам моделировать проблему с точки зрения объектов, например, проблема системы регистрации университетских курсов может быть смоделирована с помощью Course
класса, Student
класса и т. Д. Затем, когда мы пишем решение в ОО-языке у нас есть схожие классы, которые получают обязанности, и это, как правило, полезно для проектирования, особенно для модульности кода. Если я передам эту проблему 10 независимым командам, которые решают ее методом ОО, обычно у 10 решений будут общие классы, относящиеся к проблеме. Когда вы начинаете связываться и взаимодействовать с этими классами, может быть много различий, поэтому не существует такого понятия, как «нулевой разрыв представления».
Мой опыт работы с функциональным программированием очень ограничен (нет реального использования, только программы типа Hello World). Я не вижу, как такие языки позволяют легко сопоставлять решения FP с проблемами (с небольшим разрывом представления), как это делают языки OO.
Я понимаю преимущества FP по сравнению с параллельным программированием. Но я что-то упускаю или FP не об уменьшении репрезентативного разрыва (облегчения понимания решений)?
Еще один способ задать вопрос: будет ли много общего у кода FP 10 различных команд, решающих одну и ту же реальную проблему?
Из Википедии по абстракции (информатика) (выделено мое):
Языки функционального программирования обычно демонстрируют абстракции, связанные с функциями , такие как лямбда-абстракции (превращение члена в функцию некоторой переменной), функции высшего порядка (параметры являются функциями), абстракция скобки (превращение члена в функцию переменной).
Пробел в представлении может быть потенциально увеличен, потому что [некоторые] реальные проблемы не легко моделируются с помощью таких абстракций.
Еще один способ уменьшить разрыв в представлении состоит в том, чтобы проследить элементы решения до проблемы. Буквы 0
's' и 's' 1
в машинном коде очень сложно отследить, тогда как Student
класс легко отследить. Не все ОО-классы легко отслеживаются в проблемном пространстве, но многие делают.
Разве абстракции FP всегда нуждаются в объяснении, чтобы выяснить, какую часть пространства задач они решают (кроме математических задач)?ОК - у меня все хорошо. Посмотрев еще много примеров, я вижу, как абстракции FP очень понятны для частей проблемы, которые выражаются в обработке данных.
Принятый ответ на связанный вопрос Можно ли использовать UML для моделирования функциональной программы? - говорит: «Функциональные программисты не очень часто используют диаграммы». Мне действительно все равно, если это UML, но это заставляет меня задуматься о том, чтобы абстракции FP были просты для понимания / общения, если нет широко используемых диаграмм (при условии, что этот ответ правильный). Опять же, мой уровень использования / понимания FP тривиален, поэтому я не понимаю необходимости диаграмм в простых программах FP.
У ОО-дизайна есть уровни абстракции на уровне функций / классов / пакетов с инкапсуляцией (контроль доступа, скрытие информации) на каждом, что облегчает управление сложностью. Это элементы, которые позволяют легче перейти от проблемы к решению и обратно.
Многие ответы говорят о том, как анализ и проектирование выполняются в FP способом, аналогичным ОО, но пока никто не цитирует ничего высокого уровня (Пол привел некоторые интересные вещи, но это низкий уровень). Я вчера много гуглял и нашел интересную дискуссию. Следующее - от Рефакторинга Функциональных Программ Саймона Томпсона (2004) (выделено мной)
При проектировании объектно-ориентированной системы считается само собой разумеющимся, что проектирование будет предшествовать программированию. Проекты будут написаны с использованием системы, подобной UML, которая поддерживается такими инструментами, как Eclipse. Начинающие программисты могут хорошо изучить подход визуального дизайна, используя такие системы, как BlueJ. Работа над подобной методологией для функционального программирования описана в FAD: Функциональный анализ и проектирование , но мало другой работы существует. Там может быть несколько причин для этого.
Существующие функциональные программы имеют масштаб, который не требует проектирования. Многие функциональные программы невелики, но другие, такие как компилятор Glasgow Haskell, являются существенными.
Функциональные программы напрямую моделируют область приложения, что делает дизайн неактуальным. Хотя функциональные языки предоставляют множество мощных абстракций, трудно утверждать, что они предоставляют все и только абстракции, необходимые для моделирования реального мира.
Функциональные программы построены как развивающаяся серия прототипов.
В вышеупомянутой диссертации на получение степени доктора философии преимущества использования анализа и методологии проектирования (ADM) изложены независимо от парадигм. Но выдвигается аргумент, что ADM должны соответствовать парадигме реализации. То есть OOADM лучше всего подходит для программирования OO и плохо применяется к другой парадигме, такой как FP. Вот отличная цитата, которая, я думаю, перефразирует то, что я называю пробелом в представлении:
Можно долго спорить о том, какая парадигма обеспечивает наилучшую поддержку для разработки программного обеспечения, но при этом достигается самый естественный, эффективный и действенный пакет разработки, когда он остается в одной парадигме от описания проблемы до ее реализации и доставки.
Вот набор диаграмм, предложенных FAD:
- диаграммы зависимости функций, которые представляют функцию с теми, которые она использует в своей реализации;
- диаграмма зависимостей типов, которая предоставляет один и тот же сервис для типов; и,
- Диаграммы зависимостей модулей, которые представляют взгляды на модульную архитектуру системы.
В разделе 5.1 тезиса ФАД приведено тематическое исследование, которое представляет собой систему для автоматизации производства данных, относящихся к футбольной (футбольной) лиге. Требования являются на 100% функциональными, например, ввод результатов футбола, создание таблиц лиги, таблиц оценок, таблиц посещаемости, перенос игроков между командами, обновление данных после получения новых результатов и т. Д. Никаких упоминаний о том, как FAD работает для решения нефункциональных требований, не задокументировано Помимо заявления о том, что «новые функциональные возможности должны быть разрешены с минимальными затратами», это практически невозможно протестировать.
К сожалению, кроме FAD, я не вижу никаких современных ссылок на языки моделирования (визуальные), которые предлагаются для FP. UML - это еще одна парадигма, поэтому мы должны забыть об этом.