Презентация: Groovy – другой взгляд на Java

17 March 2008, 18:35 | Vadim Voituk

Эта презентация должна была быть показана на конференции по динамическим языкам программирования Exception #7

Слайд 1: Первый слайд

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

Подозреваю что публика тут собралась сверх «продвинутая», потому хотелось бы провести небольшой блиц-опрос.
– Поднимите пожалуйста руки те, кто знает что есть такой язык программиования Groovy и что он выполняется на платформе JVM ?

– А кто из вас хоть раз скачал, установил и написал HelloWorld программу с его использованием?
(если рук будет много)
А кто более-или менее регулярно использует?
TODO: Скорректировать доклад согласно обознанности слушателя.

– Спасибо

Те, кто рук не поднимал, не послушав меня, рискуют быть «не при делах» на следующем докладе “Разработка Веб-приложений с использованием Grails”

Слайд 2 : Groovy – это…

Итак, что же такое Groovy?

В первую очередь это, конечно же, динамический язык программирования.
Первая версия Groovy была создана ещё в 2003 году, но действительно популярность он набрал за 2006-2007 года.

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

Основной подход Groovy – меньше «скучного» оформительского кода – больше простых, читаемых и элегантных решений. Потому в основу его синтаксиса были собраны положительный особенности «удачных» динамических языков.

И как результат выше сказанного – Groovy дает повышение производительности разработчиков, упрощение тестирования и написания тестового кода, и что самое главное – это сохранение инвестиций в Java -платформу.
Тоесть вам не нужно «выбросить» все что вы делали до сегодняшнего дня, и начать все переписывать на Groovy.

Слайд 3 : Пример Java-код

Напишем достаточно простой Java-код, который создает список имен, а потом выводит из него все, которые имеют длину 4 символа и меньше. Такой себе типичный пример из учебника.
Уже вижу ехидные улыбки разработчиков на Ruby & Python которые могут это написать в 2 -3 строки :)
Как видно такой код достаточно проблематично уместить в один слайд презентации.
Потому немного перепишем его, немного используя возможности Java5.

Слайд 4 : Пример Java-код

Получится что-то вроде такого. Пауза…

Теперь ключевой вопрос: а за счет чего нам удалось так сжать этот код?

А все достаточно банально
1. Поддержка массивов на уровне синтаксиса языка (первая строка )
2. Простые возможности итерирования по коллекциям

По сути изменилось мало, но писать и читать приходится меньше.
Groovy в этом смысле пошел ещё дальше.

Слайд 5 : Пример Groovy-код и результат

Имеем всего несколько строк кода, которые по делают все тоже.
Думаю приведенный код больше понятен Python или Ruby программистам, но в принципе не вдаваясь в подробности, суть должна быть ясна всем.
В отличии от Java, который на уровне синтаксиса языка поддерживает только String, Groovy же поддерживает достаточно много типов.
Например коллекции – первая строка, замыкания – вторая и четвертая строка

Слайд 6: Ещё возможности

  1. Огромное количесто уже написаного Java-кода (библиотеки, фреймворки, технологии, …)
    Первый плюс Groovy – это мощь JRE, которая стоит за ним
    Бинарная совместимость с Java. Тоесть любой код написанный на Java может быть использован в Groovy коде и наоборот
    В результате имеем огромное количество библиотек, классов, фреймворков, доступных из Groovy точно так же как и Groovy доступен в них
    Примеры: JasperReports, Struts, …
  2. Динамическая типизация, замыкания, билдеры GroovyBeans и другой syntax-sugar …
    Что бы там не говорили, что динамическая типизация зло, и провоцирует “забивать” на архитектурные решения, часто она становится той “silver bullet”, которая позволяет существенно сократить сроки бюджеты разработки.
    Groovy – динамичен, причем весь его динамизм происходит в Realtime
    Что же касается описанных здесь замыканий, билдеров, и тому подобных прелестей жизни – все это уже увидим на примерах
  3. Метапрограммирование – основа реализации динамической природы Groovy на платформе JVM, которя сама по себе имеет статичную типизаци..
    Что такое Метапрограммирование и метаклассы – мы только что видели в мастер-классе Андрея Светлова – так вот я уверен что Groovy тоже так может %)
  4. Те же механизмы и инструменты поддержки процесса разрабоки
    Groovy поддерживается всеми средами, утилитами, build-framework-ами, к которым уже так привыкли разарботчики (конечно же с применением соответствующих плагинов).
    Исключением является наверное только GroovyDoc – аналог JavaDoc.
  5. Grails – наш ответ RoR подходу
    Про Grails ничего говорить не буду, о нем мы узнаем более подробно в следующем докладе.
  6. Прост в изучении и понимании
    Тут наверное достаточно просто сказать что Groovy в освоении даже проще чем VisualBasic :)
    А для Java разработчика Groovy выглядит почти как оригинальная Java.
    Если будет интерестно, во время перерыва расскажу пару Success-story о простоте Groovy.
  7. Что ещё немаловажно, так это то, что Groovy – это не скриптовый интепретируемый язык, какими являются JPython, JRuby, BeanShell.
    При выполнении Groovy-код компилируется в JVM баткод, и только после этого исполняется.

Демонстрацию возможностей Groovy проведу на примерах:

Вроде рассказал о том, какой белый и пушистый Groovy – уже рассказал, покажу на примере его основные концепции

Слайд 7: Основы синтаксиса

Динамическая и опционально статическая типизация
Тоесть мы можем указывать тип обьекта, а можем не указывать. При этом любые переменные необходимо перед обьявлять. Для нетипизированных используется ключевое слово языка “ def ”

Втсроенный синтаксис для списков, хешей, массивов, beans .
Выглядит это приблизительно так как в JavaScript.
Кстати аналогично JavaScript можно получать доступ к свойствам обьекта:
Можно через «точку» а можно через оператор квадратный скобки :)

Замыкания
В Groovy очень похожи на анонимные функции в JavaScript

В Groovy также возможна Перегрузка операторов .
Происходит это просто путем переопределения метода с магическим именем.
Например метода plus(). Если не ошибаюсь, то в Python это происходит аналогичным образом.

Слайд 8: Расширенные языковые возможности

Все синтаксические «примочки» о каких мы поговорили только что, достаточно популярны во всех динамических языках.
Те же, о каких я расскажу дальше – достаточно специфичны для Groovy.

Оператор safe navigation – заменяет собой череду проверок обьекта на null, и вызов методов
Приведенная тут цепочка вызовов никогда не вызовет NullPointerException

Elvis operator – это наследник тернарного оператора. Как он работает – видно на примере

Категории и Expando – дают возможность расширить любой класс, или перехватить любой метод в блоке кода. Работает это путем изменения метакласса

Template Engine – в Groovy встроен простой Template Engine, очень похожий на Velocity.
Очень удобно если нужно сгенерировать Java или Groovy код по шаблону.

Карринг – понятие прийшло из функционального программирования.
Позволяет в функции с несколькими параметрами «зафиксировать» один из параметров, тем самым получить уже другую функцию, но с меньшим числом параметров.
Конечно же в терминах программирования функциями являются методы или замыкания

Alias -иснг – В Groovy на любую языковыю конструкцию (класс, обьект, метод, …) можно создать alias
Бывает очень удобно использовать в import-ах при длинных именах классов.

Duck – typing – возможность утверждать что обьект имеет определенный тип не на основе наличия в сигнатуре интерфейса, который он имплементирует, а по наличию реализованных методов.
По сути и это есть более правильный термин для описания типизации в Groovy, чем просто «динамическая типизация»

Слайд 7: GDK – JDK на стероидах

Все чего вам не хватало в стандартнык классах JDK – все это есть в Groovy Development Kit
А всего, чего нет в нем – можете добавить сами.
Причем можно например добавить метод в final класс, например String

Слайд 8: Groovy Builder-ы – Пример – Код

Хочется сразу отметить что реализация популярных Design Patterns, на Groovy кодируется достаточно просто и красиво.
Но так как Groovy реализует паттерны Builder и Composition – наверное не может ни один язык!
В Groovy есть специальная сущность Builder – которая позволяет строить сложныее иерархические структуры путем вложения блоков кода один в другой. (уууу… сказал так так сказал)

Сразу покажу пример как с помощью Groovy MarkupBuilder можно можно сформировать Xml.
Обратите внимание на то, что внутри иерархической структуры я могу писать абсолютно любой Groovy-код. Cмотреть там где выбелено 10. times {}
И вот что получим в результате:

Слайд 9: Groovy Builder-ы – Пример – Результат

Также, поскольку я нигде, кроме первой строки не указывал что на выходе будет XML, путем замены
MarkupBuilder на какой нибудь JSONBuilder – можем получить эту же структуру в JSON-представлении.

Слайд 10: Groovy Builder-ы – их есть…

Вообще билдеров в Groovy достаточно много, из них в стандартной поставке только штук 7-8, если не больше.
Примеры: XHTML, JSON, XML, ANT, Swing, SWT, и даже Hibernate Criteria Builder-ы

Слайд 11: Что ещё может Groovy?

GPath – это возможность использовать XPath-выражения для навигации по композициям обьектов.
Очень удобно выполнять на результате парсинга XML – получается такая себе native-поддержка XML на уровне языка. Почти так же как ранее хотели сделать в Java 7.
Наверное эту возможность стоило отнести к расширенным возможностям синтаксиса языка.

Extended Xml processing – то о чем я только что говорил. Работать с XML в Groovy – это удовольствие.
Лично я когда-то начал использьзовать Groovy только из-за того, что надоело писать код для JDOM и xml4j

Groovy SQL – это более абстрактное расширение интерфейсов JDBC – существенно сокращает количество кода необходимого для полноценной работы с SQL-базами данных.

Встроенный Ant – именно таки есть, в Groovy-встроен Ant c небольшим подмножеством TASK-ов.
Это позволяет прямо из Groovy-кода создать и выполнить екземпляр любого TASK-а.
Самый простой пример – как из Groovy отправить почтовое сообщение?
Решение – создаем экземпляр Ant и вызываем на нем метод mail().

Grapplet – эта эксперементальная возможность появилась совсем недавно усилиями одного разработчика из Oracle.
Она позволяет использовать выполнять Groovy-код прямо в браузере. Вместо JavaScript.
Правда для этого на страницу нужно включить небольшой Applet.

Groovlet , GSP , RESTlet – будут интересны тем, кто разрабатывает web-приложения.
Они реализуют возможность исполнять Groovy-код в рамках Servlet-ов, JSP, RESTLet-ов
Также web-developer-ам стоит взлянуть на более комплексный Grails Framework – там уже все придумано до вас :)

XML – RPC & GroovyWS & Gdata & Jabber RPC – Поддержка WebServices - Самая моя нелюбимая часть разработки приложений.
Знали бы вы, кколько в свое время сил, я тратил на самый простой SOAP-вызов, или на самый элементарный SOAP-сервер. Теперь все это можно делать в 3-4 строки кода – почти как в Java6.

GroovyMock & JUnit & TestNG – полноценная поддержка тестирования и test-framework-ов как модульных так и функциональных.
Стоит сразу заметить что изначально Groovy был создан для написания небольших тестов, и только потом уже развился в универсальный инструмент

Поддержка JSR 223: Scripting for the Java Platform – позволяет стандартизированным оьразом интегрировать Groovy в Java приложение в качестве ScriptEngine.

С помощью Groovy Scriptom Groovy можно использовать для написаний Windows Scripts.
Например для макроосов для Microsoft Office или Microsoft Outlook.

Слайд 12: Инструментальная поддержка

Вроде как прошли те времена когда люди писали код в Notepad-е.
Так вот Groovy поддерживается большинством современных IDE и Редакторов
(зачитать со слайда)

Слайд 13: Идеологическая поддержка

Зачитывать навзания компаний, думаю будет лишним.
Единственное, о чем стоит расскахать – это о компани G2One
Она была создана всего около полугода назад и пока состоит из 3х (или 4х) основателей среди которых Project Manager проекта Groovy, идиолог и главный разработчик Grails, ….
Все они до того занимали руководящие технические должности в компаниях с мировым именем JetBrains, Oracle. Это такой себе Zend для PHP – жить не мешает, но ещё и деньги зарабатывает.
Как видно Groovy давно перестал быть поделкой-на-коленке и стал ещё одним взрослым инструментом разработчика.
С выходом версии 1.5 было внесено очень много изменений связанных с поддержкой возможностей

Слайд 14 :Чем завершить?

Долго думал чем закончить этот краткий экскурс не придумал ничего кроме как немного перефразировав, процитировать одного моего друга :
То, что я делал на Java за 3 часа, с Groovy я делаю пол-часа, а потом 2.5 часа любуюсь и думаю как это сделать ещё элегатнее и красивее (c)
От себя добавлю лишь то, что разработка на Groovy – лично меня вводит в такую уже было забытую программерскую эйфорию от написания кода.

Спасибо за внимание.
Вопросы?

Слайд: Вопросы?

Комментариев: 4

4 Responses to “Презентация: Groovy – другой взгляд на Java”

Комментарии:

  1. koder

    если только по делу то

    > Что ещё немаловажно, так это то, что Groovy – это не
    > скриптовый интепретируемый язык, какими являются JPython,
    > JRuby, BeanShell.
    > При выполнении Groovy-код компилируется в JVM баткод, и
    > только после этого исполняется.

    JPython давно умер, по его поводу сказать ничего не могу, а
    вот его наследник – Jython точно так-же компилируется в JVM byte-code и ровно так-же интегрируется с Java, как и Groovy.

    > – так вот я уверен что Groovy тоже так может
    Много в чем можно быть уверенным, хотелось бы примеров )).

  2. Vadim Voituk

    Спасибо, будем знать.

  3. stokito

    Большое спасибо, отличная презентация!
    Также я рекомендую отличный доклад «Быть в 10 раз эффективнее благодаря Groovy» Евгения Компаниеца http://jeeconf.com/program/groovy/

Leave a Reply