Где провести линию между Clojure и Java?
У меня есть интересный архитектурный вопрос относительно приложения, которое я разрабатываю, используя как Clojure, так и Java. Приложение включает в себя множество интенсивных параллельных задач обработки данных, которые необходимо организовать.
Здесь обоснование для смешивания как Clojure, так и Java:
- Java требуется для небольшого ЦП с интенсивным числовым кодом, где мне нужно оптимизировать алгоритмы для работы как можно быстрее на JVM. Clojure пока не может этого достичь, и такой код не будет очень идиоматичным в Clojure, потому что для повышения производительности алгоритмы требуют много изменяемых данных.
- Clojure - это (IMHO) гораздо лучше для организации общего потока приложения, с его превосходной поддержкой функционального программирования, интерактивного динамического развития в функциях REPL и concurrency.
Учитывая, что я использую оба языка - какую логику или принципы следует применять для определения разделительной линии между ними? В частности, меня интересует, как разработать API/интерфейс, который будет на правильном уровне, чтобы использовать преимущества сильных сторон обоих языков.
Ответы
Ответ 1
Не комментируя свое восприятие относительных преимуществ Java и Clojure и предполагая, что вы сделали хотя бы некоторый микро-бенчмаркинг, чтобы подтвердить, что предположение имеет некоторый шанс быть правильным, тогда правильный подход, казалось бы, оставить Java только для частей, требующих оптимизации.
Классы, ответственные за числовой код и вычисление, должны быть написаны на Java, а все остальное в Clojure. Я бы даже взял более агрессивный подход и просто разработал классы, чтобы быть отличным, чтобы они могли быть написаны на Java, но на самом деле записывать их в Clojure и переписывать их в Java, если производительность оказывается проблемой.
Ответ 2
Clojure помогает разработчикам получить большую часть своей части в простом функциональном стиле и изолировать мутационную работу в ограниченных областях.
Я бы применил те же самые рекомендации здесь: изолируйте код Java как можно больше, так как вы будете делать столько же своего кода clojure в "чистом функциональном стиле". Таким образом, остров java будет как можно меньше, учитывая ваши ограничения, и доступ к острову java будет проходить через небольшой набор функций clojure.
Не уверен, что это очень помогает, но в любом случае!