Java для перезаписи Clojure
моя компания только что попросила меня переписать большое (50 000 отдельных строк кода) приложение Java (веб-приложение с использованием JSP и сервлетов) в Clojure. У кого-нибудь еще есть советы о том, что я должен остерегаться?
пожалуйста, имейте в виду, что я знаю как Java, так и Clojure довольно хорошо.
обновление
Я сделал рерайт и он пошел в производство. Это довольно странно, поскольку переписывание закончилось так быстро, что это было сделано примерно за 6 недель. Потому что много функциональности не было нужно еще это закончилось больше как 3000 строк Clojure.
Я слышал, что они довольны системой и делают именно то, что они хотели. Единственным недостатком является то, что парень, поддерживающий систему, должен был изучить Clojure с нуля, и он был втянут в нее ногами и криками. Но на днях он мне позвонил и сказал, что теперь любит шепелявить.. смешно :)
кроме того, я должен дать хорошую упомянуть фреймворк Vaadin. Возможно, используя Ваадин учитывалось столько же сэкономленного времени и краткости кода, сколько и Clojure.. Vaadin по-прежнему является лучшим веб-фреймворком, который я когда-либо использовал, хотя теперь я изучаю ClojureScript в гневе! (Обратите внимание, что и Vaadin, и ClojureScript используют GUI-фреймворки Google под капотом.)
3 ответа:
самой большой "трансляционной проблемой", вероятно, будет переход от методологии Java / ООП к парадигме Clojure / функционального программирования.
в частности, вместо того, чтобы иметь изменяемое состояние внутри объектов, "способ Clojure" состоит в том, чтобы четко отделить изменяемое состояние и развить чистые (свободные от побочных эффектов) функции. Вы, наверное, все это уже знаете: -)
во всяком случае, эта философия имеет тенденцию вести к чему-то вроде стиля развития" снизу вверх", где вы фокусируете начальные усилия по созданию правильного набора инструментов для решения вашей проблемы, а затем, наконец, подключить их вместе в конце. Это может выглядеть примерно так
Определите ключевые структуры данных и преобразуйте их в неизменяемые определения карт или записей Clojure. Не бойтесь вложить много неизменяемых карт-они очень эффективны благодаря постоянным структурам данных Clojure. Стоит посмотреть видео учиться больше.
разработка небольших библиотек чистых, ориентированных на бизнес-логику функций, которые работают с этими неизменяемыми структурами (например, "добавить элемент в корзину"). Вам не нужно делать все это сразу, так как это легко, чтобы добавить больше позже, но это помогает не на ранней стадии, чтобы облегчить тестирование и доказать, что ваши структуры данных работают..... в любом случае на этом этапе вы можете начать писать полезные вещи в интерактивном режиме REPL
отдельно разработать процедуры доступа к данным, которые могут сохранять эти структуры в/из базы данных или сети или устаревшего кода Java по мере необходимости. Причина держать это очень отдельно заключается в том, что вы не хотите, чтобы логика персистентности была связана с вашими функциями "бизнес-логики". Вы можете посмотреть на ClojureQL для этого, хотя это также довольно легко обернуть любой код сохранения Java, который вам нравится.
написать модульные тесты (например с clojure.тест), которые охватывают все выше. Это особенно важно в динамическом языке, таком как Clojure, поскольку a) у вас не так много защитной сетки от статической проверки типа и b) это помогает быть уверенным, что ваши конструкции нижнего уровня работают хорошо, прежде чем вы построите слишком много поверх них
решите, как вы хотите использовать ссылочные типы Clojure (vars, refs, агенты и атомы) для управления каждым изменяемым состоянием уровня приложения. Они все работайте аналогичным образом, но имейте различную семантику транзакций/параллелизма в зависимости от того, что вы пытаетесь сделать. Ссылки, вероятно, будут вашим выбором по умолчанию - они позволяют реализовать "нормальное" транзакционное поведение STM, обернув любой код в (dosync ...) блок.
Выберите правильный общий веб-фреймворк-Clojure уже имеет довольно много, но я настоятельно рекомендую Ring-смотрите это отличное видео"Одно Кольцо, Чтобы Связать Их" плюс либо флота или Enlive или икота в зависимости от вашей философии шаблонов. Затем используйте это, чтобы написать свой слой презентации (с такими функциями, как "перевести эту корзину покупок в соответствующий фрагмент HTML")
наконец, напишите свое приложение, используя вышеуказанные инструменты. Если вы сделали вышеуказанные шаги правильно, то это будет на самом деле легкий бит, потому что вы сможете построить все приложение с помощью соответствующий состав различных компонентов с очень небольшим шаблоном.
Это примерно та последовательность, в которой я бы атаковал проблему, поскольку она в целом представляет порядок зависимостей в вашем коде и, следовательно, подходит для разработки "снизу вверх". Хотя, конечно, в хорошем гибком / итеративном стиле вы, вероятно, обнаружите, что вы продвигаетесь вперед к демонстрационному конечному продукту, а затем довольно часто возвращаетесь к более ранним шагам, чтобы расширить функциональность или рефакторинг по мере необходимости.
p. s. Если вы следуете вышеуказанному подходу, я был бы очарован услышать, сколько строк Clojure требуется, чтобы соответствовать функциональности 50 000 строк Java
обновление: поскольку этот пост был первоначально написан, появилось несколько дополнительных инструментов/библиотек, которые находятся в категории "должен проверить":
какие аспекты Java включает в себя ваш текущий проект? Ведение журнала, транзакции базы данных, декларативные транзакции/EJB, веб-слой (вы упомянули JSP, сервлеты) и т. д. Я заметил, что эко-система Clojure имеет различные микро-фреймворки и библиотеки с целью выполнить одну задачу и сделать это хорошо. Я бы предложил оценить библиотеки на основе вашей потребности (и будет ли она масштабироваться в крупных проектах) и принять обоснованное решение. (Отказ от ответственности: я являюсь автором http://code.google.com/p/bitumenframework/) Еще одна вещь, которую следует отметить, - это процесс сборки.Если вам нужна сложная настройка (dev, тестирование, постановка, prod), вам, возможно, придется разделить проект на модули и создать сценарий процесса сборки для удобства.