Самая большая «проблема перевода», вероятно, будет переходить от методологии Java / OOP к парадигме Clojure / функционального программирования.
В частности, вместо того, чтобы иметь изменяемое состояние внутри объектов, «способ Clojure» заключается в четком выделении изменяемого состояния и разработке чистых (без побочных эффектов) функций. Вы, наверное, уже все это знаете: -)
В любом случае, эта философия ведет к чему-то вроде «восходящего» стиля разработки, где вы сосредотачиваете первоначальные усилия на создании правильного набора инструментов для решения вашей проблемы, а затем, наконец, соединяете их вместе в конце. Это может выглядеть примерно так
Определите ключевые структуры данных и преобразуйте их в неизменяемую карту Clojure или определения записей. Не бойтесь вкладывать много неизменных карт - они очень эффективны благодаря постоянным структурам данных Clojure. Стоит посмотреть это видео , чтобы узнать больше.
Разработка небольших библиотек чистых, ориентированных на бизнес-логику функций, которые работают с этими неизменными структурами (например, «добавить товар в корзину»). Вам не нужно делать все это сразу, так как позже легко добавить больше, но это помогает сделать несколько шагов на ранних этапах, чтобы упростить тестирование и доказать, что ваши структуры данных работают ..... в любом случае Вы можете начать писать полезные материалы в интерактивном режиме на REPL
Отдельно разрабатывать подпрограммы доступа к данным, которые могут сохранять эти структуры в / из базы данных, сети или устаревшего Java-кода по мере необходимости. Причина для того, чтобы держать это в стороне, заключается в том, что вы не хотите, чтобы логика постоянства была связана с вашими функциями «бизнес-логики». Возможно, вы захотите посмотреть на это ClojureQL , хотя также довольно легко обернуть любой код персистентности Java, который вам нравится.
Напишите модульные тесты (например, с clojure.test ), которые охватывают все вышеперечисленное. Это особенно важно в динамическом языке, таком как Clojure, поскольку а) у вас не так много средств защиты от статической проверки типов и б) это помогает убедиться, что ваши низкоуровневые конструкции работают хорошо, прежде чем вы будете слишком много строить на вершина их
Решите, как вы хотите использовать ссылочные типы Clojure (переменные, ссылки, агенты и атомы) для управления изменяемым состоянием каждой части приложения на уровне приложения. Все они работают одинаково, но имеют различную семантику транзакций / параллелизма в зависимости от того, что вы пытаетесь сделать. Ссылки, вероятно, будут вашим выбором по умолчанию - они позволяют вам реализовать «нормальное» транзакционное поведение STM, заключая любой код в блок (dosync ...).
Выберите правильный общий веб-фреймворк - у Clojure уже немало, но я настоятельно рекомендую Ring - посмотрите это отличное видео " One Ring To Bind Them " плюс либо Fleet или Оживление или Икота в зависимости от вашей философии шаблонов. Затем используйте это, чтобы написать свой уровень представления (с такими функциями, как «перевести эту корзину в соответствующий фрагмент HTML»)
Наконец, напишите ваше приложение, используя вышеуказанные инструменты. Если вы выполнили вышеупомянутые шаги правильно, то это будет на самом деле легко, потому что вы сможете построить все приложение с помощью соответствующего состава различных компонентов с очень малым количеством шаблонов.
Это примерно та последовательность, с которой я бы столкнулся с проблемой, так как она в широком смысле представляет порядок зависимостей в вашем коде и, следовательно, подходит для разработки "снизу вверх". Хотя, конечно, в хорошем гибком / итеративном стиле вы, вероятно, рано переходите к демонстрационному конечному продукту, а затем довольно часто возвращаетесь к более ранним шагам для расширения функциональности или рефакторинга по мере необходимости.
p.s. Если вы будете следовать вышеописанному подходу, я был бы рад услышать, сколько строк Clojure требуется для соответствия функциональности 50 000 строк Java
Обновление : с тех пор, как этот пост был изначально написан, появилось несколько дополнительных инструментов / библиотек, которые относятся к категории "необходимо проверить":
- Noir - веб-фреймворк, основанный на кольце.
- Korma - очень хороший DSL для доступа к базам данных SQL.