Java переписать на Clojure - PullRequest
       8

Java переписать на Clojure

96 голосов
/ 08 марта 2011

Моя компания только что попросила меня переписать большое (50 000 отдельных строк кода) Java-приложение (веб-приложение, использующее JSP и сервлеты) в Clojure. Кто-нибудь еще получил советы о том, что я должен остерегаться?

Пожалуйста, помните, что я достаточно хорошо знаю и Java, и Clojure.

Обновление

Я переписал, и он пошел в производство. Это довольно странно, поскольку перезапись закончилась настолько быстро, что это было сделано примерно за 6 недель. Поскольку многие функциональные возможности не были необходимы, в конечном итоге это больше напоминало 3000 строк Clojure.

Я слышал, что они довольны системой, и она делает именно то, что хотела. Единственным недостатком является то, что парень, обслуживающий систему, должен был выучить Clojure с нуля, и его втянули в нее ногами и криками. Мне позвонили на днях и сказали, что теперь он любит Лисп .. забавно :)

Кроме того, я должен упомянуть Ваадина. Использование Vaadin, вероятно, объясняло большую часть сэкономленного времени и нехватку кода, как это сделала Clojure. Vaadin по-прежнему является лучшим веб-фреймворком, который я когда-либо использовал, хотя сейчас я изучаю ClojureScript в гневе! (Обратите внимание, что как Vaadin, так и ClojureScript используют встроенные графические структуры Google под капотом.)

Ответы [ 3 ]

81 голосов
/ 08 марта 2011

Самая большая «проблема перевода», вероятно, будет переходить от методологии Java / OOP к парадигме Clojure / функционального программирования.

В частности, вместо того, чтобы иметь изменяемое состояние внутри объектов, «способ Clojure» заключается в четком выделении изменяемого состояния и разработке чистых (без побочных эффектов) функций. Вы, наверное, уже все это знаете: -)

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

  1. Определите ключевые структуры данных и преобразуйте их в неизменяемую карту Clojure или определения записей. Не бойтесь вкладывать много неизменных карт - они очень эффективны благодаря постоянным структурам данных Clojure. Стоит посмотреть это видео , чтобы узнать больше.

  2. Разработка небольших библиотек чистых, ориентированных на бизнес-логику функций, которые работают с этими неизменными структурами (например, «добавить товар в корзину»). Вам не нужно делать все это сразу, так как позже легко добавить больше, но это помогает сделать несколько шагов на ранних этапах, чтобы упростить тестирование и доказать, что ваши структуры данных работают ..... в любом случае Вы можете начать писать полезные материалы в интерактивном режиме на REPL

  3. Отдельно разрабатывать подпрограммы доступа к данным, которые могут сохранять эти структуры в / из базы данных, сети или устаревшего Java-кода по мере необходимости. Причина для того, чтобы держать это в стороне, заключается в том, что вы не хотите, чтобы логика постоянства была связана с вашими функциями «бизнес-логики». Возможно, вы захотите посмотреть на это ClojureQL , хотя также довольно легко обернуть любой код персистентности Java, который вам нравится.

  4. Напишите модульные тесты (например, с clojure.test ), которые охватывают все вышеперечисленное. Это особенно важно в динамическом языке, таком как Clojure, поскольку а) у вас не так много средств защиты от статической проверки типов и б) это помогает убедиться, что ваши низкоуровневые конструкции работают хорошо, прежде чем вы будете слишком много строить на вершина их

  5. Решите, как вы хотите использовать ссылочные типы Clojure (переменные, ссылки, агенты и атомы) для управления изменяемым состоянием каждой части приложения на уровне приложения. Все они работают одинаково, но имеют различную семантику транзакций / параллелизма в зависимости от того, что вы пытаетесь сделать. Ссылки, вероятно, будут вашим выбором по умолчанию - они позволяют вам реализовать «нормальное» транзакционное поведение STM, заключая любой код в блок (dosync ...).

  6. Выберите правильный общий веб-фреймворк - у Clojure уже немало, но я настоятельно рекомендую Ring - посмотрите это отличное видео " One Ring To Bind Them " плюс либо Fleet или Оживление или Икота в зависимости от вашей философии шаблонов. Затем используйте это, чтобы написать свой уровень представления (с такими функциями, как «перевести эту корзину в соответствующий фрагмент HTML»)

  7. Наконец, напишите ваше приложение, используя вышеуказанные инструменты. Если вы выполнили вышеупомянутые шаги правильно, то это будет на самом деле легко, потому что вы сможете построить все приложение с помощью соответствующего состава различных компонентов с очень малым количеством шаблонов.

Это примерно та последовательность, с которой я бы столкнулся с проблемой, так как она в широком смысле представляет порядок зависимостей в вашем коде и, следовательно, подходит для разработки "снизу вверх". Хотя, конечно, в хорошем гибком / итеративном стиле вы, вероятно, рано переходите к демонстрационному конечному продукту, а затем довольно часто возвращаетесь к более ранним шагам для расширения функциональности или рефакторинга по мере необходимости.

p.s. Если вы будете следовать вышеописанному подходу, я был бы рад услышать, сколько строк Clojure требуется для соответствия функциональности 50 000 строк Java

Обновление : с тех пор, как этот пост был изначально написан, появилось несколько дополнительных инструментов / библиотек, которые относятся к категории "необходимо проверить":

  • Noir - веб-фреймворк, основанный на кольце.
  • Korma - очень хороший DSL для доступа к базам данных SQL.
5 голосов
/ 08 марта 2011

Какие аспекты Java включает ваш текущий проект? Ведение журнала, транзакции базы данных, декларативные транзакции / EJB, веб-слой (вы упомянули JSP, сервлеты) и т. Д. Я заметил, что в экосистеме Clojure есть различные микро-фреймворки и библиотеки с целью выполнить одну задачу и выполнить ее хорошо. Я бы посоветовал оценить библиотеки в зависимости от ваших потребностей (и от того, будет ли они масштабироваться в больших проектах) и принять обоснованное решение. (Отказ от ответственности: я являюсь автором bitumenframework ) Еще одна вещь, которую стоит отметить, это процесс сборки - если вам нужна сложная настройка (dev, testing, staging, prod), вам, возможно, придется разделить проект на модули и запрограммируйте процесс сборки для простоты.

4 голосов
/ 08 марта 2011

Я обнаружил, что самое сложное - думать о базе данных.Проведите несколько тестов, чтобы найти нужные инструменты, которые вы хотите использовать там.

...