Найбільша "поступальна проблема", ймовірно, буде переходити від методології Java / OOP до парадигми Clojure / функціонального програмування.
Зокрема, замість того, щоб змінювати стан об'єктів, що змінюються, об'єкти, "спосіб Clojure" - це чітко відокремити стан, що змінюється, та розробити чисті (без побічних ефектів) функції. Ви, напевно, все це вже знаєте :-)
У будь-якому випадку ця філософія має тенденцію вести до чогось стилю розвитку "знизу вгору", де ви орієнтуєтеся на початкові зусилля над створенням правильного набору інструментів для вирішення своєї проблеми, а потім, нарешті, з'єднайте їх у кінці. Це може виглядати приблизно так
Визначте основні структури даних та перетворіть їх на незмінні карти Clojure або записуйте записи. Не бійтеся вкладати безліч незмінних карт - вони дуже ефективні завдяки стійким структурам даних Clojure. Варто переглянути це відео, щоб дізнатись більше.
Розробіть невеликі бібліотеки з чистими, орієнтованими на ділову логіку функціями, які працюють на цих незмінних структурах (наприклад, "додати товар у кошик"). Вам не потрібно робити все це одночасно, оскільки їх легко додати пізніше, але це допомагає зробити кілька на ранніх етапах, щоб полегшити тестування та довести, що ваші структури даних працюють ... Точка ви можете почати писати корисні речі інтерактивно в REPL
Окремо розробіть підпрограми доступу до даних, які можуть зберігати ці структури до / з бази даних або мережі або застарілий код Java за потребою. Причина тримати це дуже окремо - це те, що ви не хочете, щоб логіка стійкості була пов'язана з вашими функціями "бізнес-логіки". Ви можете подивитися на це ClojureQL , хоча це також досить просто, щоб обернути будь-який код збереження Java, який вам подобається.
Напишіть одиничні тести (наприклад, з clojure.test ), які охоплюють усе вище. Це особливо важливо для такої динамічної мови, як Clojure, оскільки: а) у вас немає стільки захисної сітки від перевірки статичного типу, і б) це допомагає бути впевненим, що ваші конструкції нижчого рівня працюють добре, перш ніж ви надмірно будуєте зверху
Вирішіть, як ви хочете використовувати еталонні типи Clojure (vars, refs, агенти та атоми) для управління кожною частиною, що змінюється станом рівня програми. Всі вони працюють аналогічно, але мають різну семантику транзакцій / одночасності залежно від того, що ви намагаєтесь зробити. Посилання, мабуть, будуть вашим вибором за замовчуванням - вони дозволять вам реалізувати "звичайну" поведінку транзакцій STM, обертаючи будь-який код у блок (dosync ...).
Виберіть правильний загальний веб - фреймворк - Clojure має досить багато вже , але я настійно рекомендую кільце - подивитися відмінне відео « Одне Кільце , щоб зв'язати їх » плюс або Fleet або Enlive або гикавка в залежності від вашої філософії шаблонною. Потім використовуйте це для написання презентаційного шару (з такими функціями, як "перекласти цей кошик у відповідний фрагмент HTML")
Нарешті, напишіть свою заявку, використовуючи вищевказані інструменти. Якщо ви виконали вищезазначені кроки належним чином, то це насправді буде легким бітом, оскільки ви зможете створити всю програму за допомогою відповідного складу різних компонентів з дуже малою котловою плитою.
Це приблизно та послідовність, яку я б атакував на проблему, оскільки вона в цілому представляє порядок залежностей у вашому коді, а значить, підходить для розробки "знизу вгору". Хоча, звичайно, у хорошому гнучкому / ітераційному стилі, ви, мабуть, виявите себе, що рано просуваєтесь до демонструваного кінцевого продукту, а потім досить часто переходите до попередніх кроків, щоб розширити функціональність або рефакторинг за необхідності.
ps Якщо ви дотримуєтесь вищезазначеного підходу, я був би захоплений, почувши, скільки рядків Clojure потрібно, щоб відповідати функціональності 50 000 рядків Java
Оновлення : оскільки ця публікація спочатку була написана, кілька додаткових інструментів / бібліотек з'явилися в категорії "повинні перевірити":
- Noir - веб-рамка, яка будується поверх Ring.
- Корма - дуже приємний DSL для доступу до баз даних SQL.