Как Clojure подходит к разделению проблем?

Как Clojure подходит к разделению проблем? Поскольку код - это данные, функции можно передавать в качестве параметров и использовать в качестве возвращаемых...

И, поскольку существует этот принцип "Лучше 1000 функций, которые работают на 1 структуре данных, чем 100 функций на 100 структурах данных" (или что-то в этом роде).

Я имею в виду, упаковать все карту, дать ему ключевое слово в качестве ключа, и все? функции, скаляры, коллекции, все...

Идея разделения проблем реализована в Java с помощью аспектов (аспектно-ориентированного программирования) и аннотаций. Это мой взгляд на концепцию и может быть несколько ограниченным, так что не принимайте это как должное.

Как правильно (идиоматически) идти в Clojure, чтобы избежать WTF других программистов _

1 ответ

Решение

На функциональном языке лучший способ справиться с разделением задач - это преобразовать любую проблему программирования в набор преобразований в структуре данных. Например, если вы пишете веб-приложение, общая цель состоит в том, чтобы принять запрос и преобразовать его в ответ, который можно рассматривать как простое преобразование данных запроса в данные ответа. (В нетривиальном веб-приложении начальные данные, вероятно, будут включать не только запрос, но также информацию о сеансе и базе данных). Большинство задач программирования можно рассматривать таким образом.

Каждое "беспокойство" будет функцией в "конвейере", которая помогает сделать возможным преобразование. Таким образом, каждая функция полностью отделена от других шагов.

Обратите внимание, что это означает, что ваши данные в процессе этих преобразований должны быть богатыми по своей структуре. По сути, мы хотим поместить весь "интеллект" нашей программы в данные, а не в код. В сложной функциональной программе данные на разных уровнях могут быть достаточно сложными, так что в этом случае они должны выглядеть как язык программирования сами по себе. Именно здесь вступает в игру идея "предметно-ориентированных языков".

Clojure имеет отличную поддержку для манипулирования сложными гетерогенными структурами данных, что делает это менее громоздким, чем может показаться (то есть это совсем не громоздко, если все сделано правильно)

Кроме того, поддержка Clojure для ленивых структур данных позволяет этим промежуточным структурам данных быть (концептуально) бесконечными по размеру, что делает такое разделение возможным в большинстве сценариев. См. Следующую статью для получения информации о том, почему наличие бесконечных структур данных так ценно в этой ситуации: http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Такой "конвейерный" подход может удовлетворить 90% ваших потребностей в разделении проблем. Для оставшихся 10% вы можете использовать макросы Clojure, которые на высоком уровне можно рассматривать как очень мощный инструмент для аспектно-ориентированного программирования.

Вот как я полагаю, вы можете лучше всего отделить проблемы в Clojure. Обратите внимание, что "объекты" или "аспекты" не являются действительно необходимыми концепциями в этом подходе.

Другие вопросы по тегам