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

если только по делу то
> Что ещё немаловажно, так это то, что Groovy – это не
> скриптовый интепретируемый язык, какими являются JPython,
> JRuby, BeanShell.
> При выполнении Groovy-код компилируется в JVM баткод, и
> только после этого исполняется.
JPython давно умер, по его поводу сказать ничего не могу, а
вот его наследник – Jython точно так-же компилируется в JVM byte-code и ровно так-же интегрируется с Java, как и Groovy.
> – так вот я уверен что Groovy тоже так может
Много в чем можно быть уверенным, хотелось бы примеров )).
Спасибо, будем знать.
Большое спасибо, отличная презентация!
Также я рекомендую отличный доклад «Быть в 10 раз эффективнее благодаря Groovy» Евгения Компаниеца http://jeeconf.com/program/groovy/