Решил опубликовать эту небольшую статью, содержащую на данном этапе скорее абстрактную идею. Несложно представить, как ее возможно использовать на практике и впоследствии, в зависимости от реакции сообщества, имею желание дополнить ее более конкретными примерами, взятыми из собственных наработок.
Пришла в голову мысль.
Из личного опыта. В универе делали ставку больше на функциональное программирование, но очень модным уже считалось ООП. И очень хотелось научиться ООП в то время, когда учили ФП. И только теперь я осознал, что функциональная парадигма программирования не плохо. ООП так же очень не плохо.
Теперь придерживаюсь идиомы, которую я сформировал за последнее время. Если требуется логика передачи данных и сообщений между различными блоками ядра системы (и всего того, что взаимодействует грубо говоря с машиной, не важно сервером или клиентом) следует использовать функциональный подход, но там, где требуется интерактивность логики с человеком, лучше использовать ООП, говоря с человеком на удобном ему языке пространства объектов и ассоциаций (отношений между этими объектами).
Для web прекрасно подходит Java машина. Там, где требуется интерактивность системы с пользователем, можно использовать Java (частично Groovy и Scala. Groovy особенно интересен тем, что на идейном уровне близок к JS), а где требуется общение между логикой и бд, юзаем Scala и Clojure. Все они прекрасно совместимы с Java и во многих можно писать просто Java код в общих случаях, что можно красиво стыковать через интерфейсы.
К сожалению многим больше знакома идея ООП потому что оно ближе на уровне восприятия к пониманию этого мира человеком, но программисту требуется понимать преимущества разных подходов, в том числе и функционального программирования.
Разгребая горы неприглядного кода, написанного на Java, я пришел к выводу, что некоторые люди пишут так или иначе в стиле ФП, но в Java ФП выглядит довольно громоздко и ненаглядно. Если уж и приходится разрабатывать часть системы на низком уровне, не лучше ли подходит для этого то, что для этого и создано? Эти функциональные блоки легко можно связать с другими блоками (неважно, функциональными или блоками логики в стиле ООП) через интерфейсы.
В общем-то не претендую на гениальность. Думаю, это более-менее очевидные размышления. Однако, мне они помогли. Возможно, помогут кому-то еще.