Почему разработчики Java должны дать Grails шанс?

Опубликовано: 2022-03-11

У Java есть экосистема, которая созрела за годы разработки, сделав ее одной из самых надежных платформ. Тем не менее, ему не хватает средств, необходимых для быстрого выполнения работы, особенно для таких вещей, как веб-приложения. Пытаясь избежать разочарований из-за таких проблем, разработчики часто вместо этого выбирают языки реализации и свои современные веб-фреймворки, такие как Ruby с Ruby on Rails, Python с Django и т. д. В отличие от Java, они обеспечивают гораздо более простой способ создания веб-приложения.

Почему разработчики Java должны дать Grails шанс?

Веб-разработчики Java: познакомьтесь с Grails и узнайте, что вы упускали.
Твитнуть

К счастью, для Java-разработчиков, желающих создавать веб-приложения, есть лучший способ, и он использует Grails. В этой статье мы увидим, как Grails с Groovy является жизнеспособной альтернативой в области JVM. Мы рассмотрим несколько примеров, когда Grails привлекает нас, разработчиков Java, и может соблазнить кого-то еще попробовать его.

История

В стартапе, в котором я работал, у нас была точно такая же проблема. У нас было приложение Spring, с которым было очень сложно работать. По мере того, как он становился все больше и больше, мы вскоре обнаружили, что рефакторинг и добавление функциональности занимают у нас гораздо больше времени, чем следовало бы. Сочетание этого с некоторыми другими мотивами привело нас к решению переписать наше основное приложение. Мы также были открыты для изменения или замены существующего стека технологий. Grails казался приемлемым выбором, поскольку он работает на JVM и построен на основе уже известных нам технологий. Он использует язык программирования Groovy, но в то же время позволяет смешивать его с Java. Итак, мы сделали решительный шаг.

Полный вперед

В чем Grails действительно преуспевает, так это в том, что он позволяет легко начать новый проект. Это так же просто, как запустить команду, которая создает структуру проекта со всеми папками, необходимыми для классов, которые вы добавите позже. Добавление классов моделей, контроллеров, сервисов и веб-страниц требует столь же минимальных усилий. Единственное, о чем вам нужно позаботиться, это правильно назвать и разместить вещи. В отличие от Java практически нет стандартного кода, который должен быть там просто потому, что он должен быть. Это частично стало возможным благодаря использованию Spring и Hibernate, которые являются двумя столпами Grails, а также концепции кодирования по соглашению. Для запуска проекта Grails поставляется в комплекте с Apache Tomcat в качестве сервера разработки. Все, что нам нужно сделать, это запустить проект в нашей среде IDE, и сервер будет запущен с развернутым кодом. Кроме того, Grails Object Relational Mapping (GORM) с Hibernate позаботится о создании базы данных для нас. Чтобы использовать существующую базу данных, нам нужно настроить свойства соединения JDBC или просто оставить его по умолчанию, чтобы использовать экземпляр в памяти. Как только сервер с Grails запущен (это требует немного больше времени, чем приложение Spring MVC), мы можем изменить код, и функциональность горячего развертывания сохранит нашу сессию отладки, оснащенную последней версией. Единственными классами, которые не могут быть перезагружены таким образом, являются классы сущностей.

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

В классе Bootstrap мы также можем использовать условия «если», чтобы проверить тип среды (разработка, тестирование, производство и т. д.) и соответствующим образом изменить данные.

Манипулирование данными

Одним из моментов, которые сразу привлекли наше внимание в Grails, была простота работы с данными. Чтение из базы данных — это задача, которую необходимо выполнять снова и снова. И много раз это просто. Например, выборка одного или нескольких объектов, соответствующих определенным критериям, а затем их объединение. Почему бы не использовать для этого динамический поиск? Это способ запроса данных, при котором методы создаются динамически во время выполнения. Все, что вам нужно сделать, это следовать соглашению об именах.

 def users = User.findAllByLastNameLikeOrAgeGreaterThan('Doe%', 30)

Строка над строкой извлечет все объекты User с фамилией, начинающейся с «Doe», или возрастом более 30 лет. Да, не очень сложный случай, но суть вы поняли.

Что, если бы мы захотели дополнительно отфильтровать этот список для тех, у которых свойство «failedLogins» больше 10? А что, если бы мы захотели отсортировать их по дате создания? А что, если бы мы захотели объединить их имена или найти максимальный возраст пользователей?

 users = users.findAll() { it.failedLogins > 10 } users = users.sort { it.dateCreated } def firstNamesString = users.firstName.join(', ') def maximumAge = users.age.max()

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

Иногда я хочу творить по-другому

Динамический конструктор или конструктор именованных аргументов — это функция, которую многие из нас хотели бы иметь в Java. Хорошо определить, какие конструкторы разрешены для определенного класса, но во многих случаях вы просто хотите установить некоторые свойства и получить проклятый экземпляр. Groovy добавляет специальный конструктор для каждого объекта, который в основном принимает элегантность карты в качестве входных данных и устанавливает свойства с записями карты.

 def Person = new Person(name: 'Batman', age: 57)

Этот подход приводит к гораздо более выразительному коду и позволяет избежать необходимости во всем шаблонном коде конструктора.

Кстати, вот несколько примеров удивительности и элегантности карт Groovy:

 def emptyMap = [:] def map = [bread:3, milk:5, butter:2] map['bread'] = 4 map.milk = 6

Это еще один пример того, как код может быть коротким и простым, но мощным. Он показывает, как можно использовать встроенную инициализацию и как можно манипулировать значениями карты аналогично свойствам объекта. Нет необходимости вызывать традиционные методы Java для основных манипуляций, если вы действительно этого не хотите.

Нам нужно больше энергии!

Конечно, не существует фреймворка, который может все, но когда мы заполняем пробелы, мы должны посмотреть, что еще может быть уже доступно, прежде чем пытаться реализовать собственное решение. Чтобы расширить наш арсенал функций на основе Grails, мы можем использовать подключаемые модули Grails. Установка подключаемого модуля выполняется простым добавлением еще одной строки в класс BuildConfig , присутствующий в каждом проекте Grails (снова вступает в силу соглашение о коде!).

 compile ':spring-security-core:2.0-RC4'

Строка выше добавляет ядро ​​​​безопасности Spring в наше приложение, и практически не требуется дополнительной настройки для включения этой функции.

Это похоже на использование зависимостей Maven (на которые вы также можете ссылаться в том же классе конфигурации), но плагины обычно представляют собой более крупные блоки, содержащие всю функциональность.

При этом позвольте мне рассказать вам о случае, с которым нам пришлось иметь дело. Нам нужно было реализовать поиск, охватывающий несколько объектов данных. В Grails есть подключаемый модуль Elasticsearch, который очень прост в использовании. Как упоминалось ранее, нам нужно только сослаться на плагин в файле конфигурации, и все готово. Если мы хотим искать объекты определенного класса, нам просто нужно добавить к этому классу статическое «доступное для поиска» свойство. И если мы хотим, мы можем даже ограничить свойства, которые будут разрешены для поиска.

 class User { static searchable = { only = name } String name Double salary }

Это так мало кода, но под капотом Grails и подключаемый модуль Elasticsearch автоматически индексируют всех пользователей по имени и позволяют нам искать по имени. Фактический поисковый вызов также очень лаконичен:

 User.search("${params.query}")

Если мы не захотим, нам никогда не придется прикасаться к индексу Lucene. Все будет сделано автоматически за нас. У плагина даже есть API для отображения результатов поиска — он может выделить совпадение, найденное внутри искомого текста. Это всего лишь пример того, как плагин может предоставить огромный набор функций, которые могут сделать нас намного более эффективными, избавив нас от необходимости реализовывать их самостоятельно.

Нам все еще нужно больше энергии

Плагины — это здорово, но иногда нам не нужен целый плагин, нам просто нужно что-то дополнительное. Вы помните, когда в последний раз вы хотели иметь дополнительный метод в существующем классе Java, но не хотели (или не могли) расширять/переопределять их? В Groovy вы можете добавлять методы и свойства к существующим классам или даже к их определенным экземплярам. Например, вы можете добавить метод formatting в класс java.util.Date , который отлично подходит, когда вы хотите последовательно форматировать даты и просто не хотите писать статические классы util или определять различные фильтры.

 Date.metaClass.formatDate = { delegate.format("dd.MM.yyyy") }

Что, если вы хотите отсортировать список пользователей по вычисляемому значению, и вам это нужно только в одном случае (т. е. добавление нового метода в класс User будет загрязнять окружающую среду)? Вы можете добавить свойство к каждому из этих экземпляров, а затем просто отсортировать или отфильтровать коллекцию по этому свойству:

 user.metaClass.computedProp = 312 * 32 * 3

Авторы Groovy уже добавили множество улучшений в некоторые основные классы Java, так что нам не нужно этого делать. Ниже приведены некоторые примеры.

Использование «минус» для удаления всех элементов из коллекции, которые присутствуют в другой коллекции.

 assert [1, 2, 3, 4, 4, 5] - [2, 4] == [1, 3, 5]

Дополнительные методы для манипулирования объектами java.util.Date , которые очень часто пригодятся, такие как добавление/вычитание дней из дат или получение/установка определенного поля даты без преобразования его в Calendar или использования дополнительных библиотек.

 def yesterdayAllMyTroublesSeemedSoFarAway = new Date() - 1 def myAwesomeAnniversaryYear = myAwesomeDate[Calendar.YEAR] + 1 myAwesomeDate.set(year: myAwesomeAnniversaryYear, second: 0)

Если вы хотите по-настоящему описательно манипулировать датами, вы можете просто использовать добавленный Groovy класс TimeCategory :

 use (TimeCategory) { println 1.minute.from.now println 10.hours.ago def someDate = new Date() println someDate - 3.months }

Молоток и гвоздь

Тогда есть IDE. GGTS и IntelliJ IDEA на основе Eclipse настроены для работы с Grails. Они понимают структуру проекта (и помогут вам перемещаться по папкам и ресурсам) и имеют ярлыки для наиболее часто используемых команд (например, добавить контроллер, добавить страницу, запустить проект и т. д.). С Grails вы будете выполнять команды (для запуска проекта или настройки новой функциональности подключаемого модуля), и вам потребуются различные конфигурации, которые также входят в состав IDE. Автодополнение кода прекрасно работает на страницах веб-шаблонов Grails, где вы часто будете ссылаться на контроллеры и действия. Существуют и другие IDE, которые можно использовать с Grails, такие как Netbeans, TextMate, Emacs и другие.

Что насчет темной стороны?

Как и во всем в жизни, в Grails тоже есть свои предостережения. Под капотом делается много магии, что часто может быть хорошо, но иногда результат будет не таким, как вы ожидали. Ошибки будут происходить только из-за того, что вы не используете типизацию (да, типы необязательны в Groovy) и недостаточно осторожны. И, возможно, вы не заметите ошибку, пока не станет слишком поздно. Кроме того, очень заманчиво написать остроты, чтобы произвести впечатление на коллег. И тебя. Но эти мощные строки кода могут быть не такими очевидными для ваших коллег. Или даже себе через пару месяцев. Вот почему я думаю, что Grails требует большей дисциплины программирования, чем некоторые из более традиционных фреймворков.

Время - деньги

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

Мои друзья, работающие с Ruby on Rails или Python/Django, давно говорят мне, насколько круты эти технологии. И действительно было глупо думать, сколько времени у меня ушло на Java, чтобы написать код, сохраняющий что-то в базе данных и отображающий это на веб-странице. Grails действительно может быть полезным ответом. Дело не в том, что вы не могли сделать это с помощью чистой Java, Spring MVC и Hibernate. Ты мог бы. Ваше приложение может даже работать немного быстрее. Но с Grails вы сделаете работу быстрее.

Связанный: Почему вам уже нужно перейти на Java 8