На функциональном языке лучший способ справиться с разделением задач - это преобразовать любую проблему программирования в набор преобразований в структуре данных.Например, если вы пишете веб-приложение, общая цель состоит в том, чтобы принять запрос и преобразовать его в ответ, который можно рассматривать как простое преобразование данных запроса в данные ответа.(В нетривиальном веб-приложении начальные данные, вероятно, будут включать не только запрос, но также информацию о сеансе и базе данных). Большинство задач программирования можно рассматривать таким образом.
Каждая «проблема» будетфункция в «конвейере», которая помогает сделать возможным преобразование.Таким образом, каждая функция полностью отделена от других шагов.
Обратите внимание, что это означает, что ваши данные, поскольку они подвергаются этим преобразованиям, должны быть богатыми по своей структуре.По сути, мы хотим поместить весь «интеллект» нашей программы в данные, а не в код.В сложной функциональной программе данные на разных уровнях могут быть достаточно сложными, что в свою очередь должно выглядеть как язык программирования сам по себе. Именно здесь вступает в игру идея «предметно-ориентированных языков».
Clojure имеет отличную поддержку для манипулирования сложными гетерогенными структурами данных, что делает его менее громоздким, чем может показаться (т. Е. Совсем не громоздким, если все сделано правильно)
Кроме того, поддержка Clojure для ленивых структур данных позволяет этимпромежуточные структуры данных должны быть (концептуально) бесконечными по размеру, что делает возможным такое разделение в большинстве сценариев.См. Следующую статью для получения информации о том, почему наличие бесконечных структур данных так ценно в этой ситуации: http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
Этот подход "конвейер" может удовлетворить 90% ваших потребностей в разделении проблем.Для оставшихся 10% вы можете использовать макросы Clojure, которые на высоком уровне можно считать очень мощным инструментом для аспектно-ориентированного программирования.
Именно поэтому я считаю, что вы можете наилучшим образом отделить проблемы в Clojure- Обратите внимание, что «объекты» или «аспекты» не являются действительно необходимыми понятиями в этом подходе.