Софт-Портал

Groovy язык программирования

Рейтинг: 5.0/5.0 (387 проголосовавших)

Категория: Windows

Описание

Почему Groovy один из лучших языков программирования - BaRoN blog

Почему Groovy один из лучших языков программирования

Моё первое знакомство с Groovy было не вполне удачным. Так, обнаружилась достаточно невысокая производительность, тормоза при использовании статической типизации, и отсутствие масштабных плюсов по сравнению с Java. В тот момент единственное, что я был готов отдать на откуп Groovy, была отладочная консоль сервера. Например, у нас в сервере используется JavaScript от Mozilla (Rhino), ещё с тех пор, когда его не было в JRE.

Однако позднее пришлось «допиливать» проект, написанный на Groovy с использованием фреймворка Grails, и тогда в этот язык я влюбился.

Я могу часами (ну ладно, не часами — минутами) придумывать, как сделать рефакторинг Java кода, чтобы он стал более читаемым, более производительным, более грамотно организованным. Но на Groovy можно зайти ещё дальше. В сети есть интересный пример, как программу на Java (конечно же, являющуюся и валидной программой на Groovy), можно переписать.

Кстати, самое первое и очень важное преимущество Groovy заключается в том, что программа на Java — это программа на Groovy. Вовсе необязательно переписывать код! То, что все библиотеки Java, написанные за последние ?15 лет, можно использовать и в Groovy — и так понятно. Но этот факт тоже не стоит недооценивать. Ну да ладно, вернёмся к рефакторингу:

Для сравнения: та же программа, переписанная на Groovy:

Без сомнения, явская программа могла бы быть покороче и почётче, уже за счёт использования дженериков из 1.5 Java (да-да, сейчас на дворе уже Java 1.7, их правда можно юзать). Но Groovy даёт больше простора, больше возможностей. Добавляя инъекции в существующие классы, можно добиться значительного сокращения времени, затраченного на разработку. Некоторых конструкций, например, очень не хватает в самой Java:

Например, такой eachLine — это круто. Или регэкспы, регэкспы!

Это почти так же удобно, как

Groovy язык программирования:

  • скачать
  • скачать
  • Другие статьи, обзоры программ, новости

    Шесть языков программирования, к которым пора присмотреться

    Шесть языков программирования, к которым пора присмотреться

    Отличительной чертой ИТ-индустрии является быстрый и даже безжалостный темп изменений. Несколько лет назад многих вполне устроило бы хорошее знание всего пары языков программирования. В целом такого количества знаний будет достаточно и в наше время, но тем не менее, когда вы сосредоточитесь на изучении какого-либо одного инструмента работы — будь то платформа, операционная система, язык программирования — вы станете заложником его успеха или неудачи.

    Чтобы не остаться за бортом современных технологий каждый программист должен постоянно учиться, и особенно следить за появлением новых языков программирования, не говоря уже о том, что ему нужно учитывать опыт экспериментаторов.

    В курсе последних тенденций программирования должны быть и ИТ-менеджеры: если требуется команда соискателей, обладающих познаниями в новых областях программирования или рассматривается возможность найма подрядчиков, то стоит уделить некоторое время тому, чтобы узнать, какие языки пользуются популярностью в среде программистов и какая от них может быть польза для вас.

    Издание InformationWeek предлагает ознакомиться с подборкой из шести актуальных языков программирования, которые в ближайшее время из нишевых могут перейти в мейнстрим. Этот перечень был составлен исходя из данных TIOBE Index, оценивающего популярность языков программирования на основе подсчета результатов поисковых запросов, содержащих название языка. Во внимание принимались данные рейтинга популярности языков программирования аналитической фирмы RedMonk, которая анализирует языки программирования, использующиеся в репозиториях GitHub.

    Swift

    Если вы пишите мобильные приложения, которые пользуются всё большей популярностью среди разработчиков, вам наверняка придётся столкнуться с платформой iOS, а значит — со Swift (совсем недавно появился Swift 2). В декабре прошлого года Apple перевела его в разряд открытых проектов, порт для Linux уже готов и к его разработке присоединятся другие компании.

    Но не стоит думать, что с появлением Swift нужно бросать изучение других техник программирования. Согласно TIOBE Index, язык Swift — «рекомендуемый к ознакомлению», но не «доминирующий». После того как Apple объявила о приоритетности Swift, специалисты TIOBE Index ожидали, что язык Objective-C резко начнёт терять популярность, но, как показала практика, программисты пока с осторожностью мигрируют на Swift.

    Противоположной точки зрения придерживается RedMonk. Компания подсчитала, что за IV квартал 2015 г. Swift поднялся в списке с 68 места на 22 — беспрецедентный случай в истории рейтинга. Изучать язык можно с помощью официального руководства и блога Apple, где публикуются последние новости, статьи и мануалы для разработчиков. Objective-C, на смену которому может прийти Swift, разместился на десятой строчке рейтинга RedMonk.

    Go

    Язык Go шесть лет назад разработала Google. Это открытый язык разработки. Его созданием занимался Кен Томпсон, который известен своим вкладом в создание языка программирования Cи и ОС UNIX. Неудивительно, что синтаксис Go перекликается с наследием языка Cи. Фундаментальные структуры Cи, такие как Generic-типы, полиморфизм и ориентация объектов, используются и в Go, что облегчает переход на него Cи-разработчиков.

    Проект изначально разрабатывается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах. В выпуске Go 1.5 инструментарий языка полностью избавлен от кода на Си и не требует для сборки наличие Си-компилятора. Одна из причин, почему Go представляет интерес для программиста — это средство разработки под Docker.

    R

    Это язык программирования и программная среда для статистических вычислений, анализа и визуализации данных. R доступен под лицензией GNU GPL и распространяется в виде исходных кодов. Код был открыт в 1995 г. В нём используется интерфейс командной строки, хотя доступны и несколько графических интерфейсов пользователя, а также средства интеграции в офисные пакеты. Все эти качества делают R популярным выбором для тех, кто работает с большими данными.

    Среди разработчиков R ценится за его способность генерировать диаграммы и графики. Задачи, которые могли бы потребовать несколько сотен строк кода на другом языке, на R могут быть написаны в несколько строк. Это не означает, что R является единственным выбором для работы с большими данными. С написанием приложений Big Data хорошо подходит Python. Означает ли это, что стоить изучать и R, и Python? Ответ да: в связке два эти инструмента неплохо дополняют друг друга.

    TypeScript

    Это творение Microsoft, которое было представлено в 2012 г. и позиционируется как средство разработки веб-приложений, расширяющее возможности JavaScript. Для большинства разработчиков, которые работают с JavaScript, слабым местом этого языка является отсутствие средств объектно-ориентированного программирования, что не позволяет вырваться за рамки написания простых сценариев. И здесь на помощь приходит TypeScript: в качестве отправной точки он предлагает средства статической типизации, дополнительные классы и интерфейсы. Это позволяет масштабировать разработку сложных JavaScript-приложений.

    По сути, TypeScript — это надстройка над JavaScript. То есть любой корректный код на JavaScript также является корректным кодом на TypeScript. Фактически, после компиляции программу на TypeScript можно выполнять в любом современном браузере или использовать совместно с серверной платформой Node.js. Кроме того, TypeScript можно использовать с другими пакетами, такими как JQuery, так что программист получит дополнительный опыт с этими процедурами. Ещё более привлекательным TypeScript делает то, что на нём строится Angular 2. Это Open Source JavaScript-фреймворк, использующий шаблон MVC. Наличие богатого функционала во многом повлияло на то, что он находит свое применение во все большем количестве веб-приложений, являясь на данный момент одним из самых популярных JavaScript-фреймворков.

    Groovy

    Groovy — это гибкий и динамичной язык для виртуальной машины Java (JVM). Он дополняет Java функционалом, привлечённым из таких языков программирования, как Python, Ruby и Smalltalk. Groovy был создан в 2004 г. затем права на него приобрела компания SpringSource (создатель Java-фреймворка Spring). Последняя в итоге была куплена VMware, а руководство развитием Groovy было передано компании Pivotal.

    Однако Pivotal, последние годы поддерживающая разработку Groovy и Grails (программный каркас для создания веб-приложений на Groovy), объявила о прекращении спонсирования этих проектов начиная с 31 марта. Релизы Groovy 2.4 и Grails 3.0 будут последними под крылом Pivotal. Оба проекта стали частью фонда Apache и продолжат развиваться как Open Source-проекты.

    Вы можете использовать Groovy как скриптовый язык, или вы можете рассматривать его как объектно-ориентированный язык, или как надмножество Java. Язык может использоваться в любом Java-проекте, так как код Groovy совместим с Java-кодом. Синтаксис Groove нельзя назвать громоздким, его легко перекомпилировать в кодовую базу Java и обратно.

    Возможности Groovy, отличающие его от Java, включают статическую и динамическую типизацию, встроенный синтаксис для списков, ассоциативных массивов и регулярных выражений, а также перегрузку операций. Groove недавно обновил интерфейс, его популярность начинает расти. За прошлый год он стал четвёртым в TIOBE Index по темпу роста.

    Rust

    Это экспериментальный язык программирования, разрабатываемый Mozilla. Он потребуется для разработчиков, которые решают задачи безопасности системных инфраструктур, скорости обработки данных и распараллеливании процессов вычислений. Rust был создан для движка Servo в 2014 г. Отличительная особенность движка — распараллеливание множества действий, таких как рендеринг и парсинг HTML. (Servo заменяет Gecko, используемый в Firefox). Он портирован Samsung на Android и процессоры ARM.

    По структуре язык Rust напоминает C++, но существенно отличается в некоторых деталях реализации синтаксиса и семантики. Автоматическое управление памятью избавляет разработчика от манипулирования указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, выход за границы буфера и т. п. Rust поддерживает смесь императивных процедурных и объектно-ориентированных методов с такими парадигмами, как функциональное программирование, а также обобщённое программирование. Недавно вышел релиз Rust 1.6.

    Вывод

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

    Компания КРОК предлагает использовать ресурсы Виртуального дата-центра — облака собственной разработки на базе …

    Учитывая сложную экономическую ситуацию, компания КРОК предлагает несколько антикризисных услуг. Они позволяют …

    Сервисные центры ГК «Паладин» осуществляют различные виды обслуживания вычислительной техники Hewlett-Packard …

    Множественный опыт российских и зарубежных компаний показали, что ПО для управления ИТ-услугами помогает упростить …

    Виртуализация десктопов (Virtual Desktop Infrastructure — VDI) — это создание рабочих столов в виртуальной среде …

    Серверные языки: Groovy (обзор)

    Главная Публикации Статьи об Интернете Серверные языки: Groovy (обзор)

    Серверные языки: Groovy (обзор)

    Несмотря на значительную популярность языка программирования Java, не все в нем, как оказалось, устраивает программистов. Иначе как объяснить тот факт, что в 2003 году Джеймс Стречен взялся за реализацию Java-подобного языка Groovy? Более того, новый язык может работать на платформе Java с JVM и генерировать байт-код. Таким образом, Groovy является дополнением к Java, причем Java-программисты могут в своих программах использовать, по желанию, конструкции того или другого языка – как в данном случае удобнее.

    Сам автор перед выходом релиза в 2007 году ушел из проекта, заметив с сожалением, что не знал о существовании более перспективного языка Scala, иначе появление Groovy вообще было бы под вопросом. Тем не менее, альтернативный язык оказался очень удобен во многих случаях: многие его конструкции (в том числе дополненные) позволяли реализовывать проекты более понятно, компактно и прозрачно. Некоторые средства IDE (к примеру, NetBeans 7.0) могут использовать возможности языка прямо из коробки, в других же случаях среду приходится настраивать самостоятельно. Интересно, что компилятор Groovy с легкостью, «как родной», может исполнять и Java-код. В язык были внесены некоторые серьезные дополнения: перегрузка операций, замыкания, новые элементы синтаксиса для регулярных выражений, списков и различных видов массивов. Как вы знаете, в Java существует лишь динамическая типизация, а Groovy добавил в нее статическую. Даже примитивные типы данных стали объектами, будучи завернутыми в интерфейсы классов и метаклассы.

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

    17 апреля 2012,
    1118

    Язык программирования Groovy

    Группа

    Чтобы вступить в группу, Вам необходимо войти .

    Информация

    Описание: Groovy — это гибкий динамический язык программирования для Java Virtual Machine. Этот язык совмещает в себе концепции Smalltalk, Python и Ruby, является скриптовым языком сценариев в окружении Java API. Может использоваться в Web-приложениях Spring, Hibernate и JPA через фреймворк Grails, приспосабливая внешнюю бизнес-логику, языки предметной области (Domain-Specific Languages) и многое другое, чтобы упростить разработку.
    http://groovy.codehaus.org/ Место: Россия

    Другое Действия 35 записей к записям сообщества

    Онлайн школа программирования Acodemy.ru. приглашает
    интересующихся программированием и робототехникой
    учеников и студентов! Более 30000 выпускников школы, более
    3000000 выполненых заданий! Начните обучение уже сегодня, бесплатно!
    http://acodemy.ru/courses/python/introduction/

    Ява-подобные языки программирования на сайте Игоря Гаршина

    Эпоха Интернета: Ява-подобные языки программирования

    Если бы в Java действительно работала сборка мусора, большинство программ бы удаляли сами себя при первом же запуске. (Robert Sewell. программист)

    В 1990-х годах в связи с активным развитием Интернета распространение получили языки, позволяющие создавать сценарии для веб-страниц — главным образом Perl. развившийся из скриптового инструмента для Unix-систем. и Java. Продолжала возрастать также и популярность технологий виртуализации.

    Разделы страницы о Ява-подобных языках программирования.

    • Язык программирования Java
    • Язык программирования Groovy
    • Язык программирования Scala

    Также смотрите страницы о клиентских и серверных средствах веб-программирования.

    Язык программирования Java

    Java — это C++, из которого убрали все пистолеты, ножи и дубинки. (James Gosling. один из создателей Java)

    Ява имеет Си-подобный синтаксис. Считается платформонезависимым и полностью объектно-ориентированным языком.

    На основе языка Java был создан скрипт-язык программирования клиентской части веб-сайта JavaScript (на пару с VBScript ).

    Язык Java зародился как часть проекта создания передового программного обеспечения (ПО) для различных бытовых приборов. Реализация проекта была начата на языке С++, но вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение самого инструмента - языка программирования. Стало очевидным, что необходим платформо-независимый язык программирования, позволяющий создавать программы, которые не приходилось бы компилировать отдельно для каждой архитектуры и можно было бы использовать на различных процессорах под различными операционными системами.

    Язык Java потребовался для создания интерактивных продуктов для сети Internet. Фактически, большинство архитектурных решений, принятых при создании Java, было продиктовано желанием предоставить синтаксис, сходный с Си и Cи++. В Java используются практически идентичные соглашения для объявления переменных, передачи параметров, операторов и для управления потоком выполнением кода. В Java добавлены все хорошие черты C++.

    Три ключевых элемента объединились в технологии языка Java:

    1. Java предоставляет для широкого использования свои апплеты (applets) — небольшие, надежные, динамичные, не зависящие от платформы активные сетевые приложения, встраиваемые в страницы Web. Апплеты Java могут настраиваться и распространяться потребителям с такой же легкостью, как любые документы HTML.
    2. Java высвобождает мощь объектно-ориентированной разработки приложений, сочетая простой и знакомый синтаксис с надежной и удобной в работе средой разработки. Это позволяет широкому кругу программистов быстро создавать новые программы и новые апплеты.
    3. Java предоставляет программисту богатый набор классов объектов для ясного абстрагирования многих системных функций, используемых при работе с окнами, сетью и для ввода-вывода. Ключевая черта этих классов заключается в том, что они обеспечивают создание независимых от используемой платформы абстракций для широкого спектра системных интерфейсов.
    • .
    Язык программирования Groovy

    Groovy — объектно-ориентированный язык программирования, разработанный для платформы Java как дополнение к языку Java с возможностями Python. Ruby и Smalltalk. Groovy использует Java-подобный синтаксис с динамической компиляцией в JVM байт-код и напрямую работает с другим Java кодом и библиотеками. Язык может использоваться в любом Java-проекте или как скриптовый язык. Groovy завершил процесс стандартизации в Java Community Process JSR 241.

    Мультипарадигмальный язык Scala

    Scala — мультипарадигмальный язык программирования, спроектированный кратким и типобезопасным для простого и быстрого создания компонентного программного обеспечения, сочетающий возможности функционального и объектно-ориентированного программирования.

    Первые версии языка созданы в 2003 году коллективом лаборатории методов программирования Федеральной политехнической школы Лозанны под руководством Мартина Одерски. язык реализован для платформ Java и .Net. По мнению Джеймса Стрэчена (англ. James Strachan), создателя языка программирования Groovy, Scala может стать преемником языка Java.

    Scala впитала значительное число концепций и синтаксических соглашений Java и C#. Способ выражения свойств во многом заимствован из Sather. Из Smalltalk взята концепция унифицированной объектной модели. Из BETA пришла идея, что всё, включая классы, должно допускать вложенность. Абстрактные типы в Scala очень похожи на абстрактные типы сигнатур в SML и OCaml. обобщённые в контексте полноценных компонентов. В некотором смысле Scala — это продолжение работы Pizza.

    Тест Groovy

    Тест знаний Groovy Введение в тест Groovy

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

    Тест Groovy проверяет знание основ этого языка программирования.

    Целевая аудитория теста по Groovy

    Так как Groovy содержит некоторые возможности, которые отсутствуют в стандартной Java, перед прохождением теста по Groovy рекомендуется ознакомиться с основами программирования на Java.

    Тест Groovy - Основы будет интересен широкому кругу java-разработчиков, которые используют скриптовые языки для программирования гибкой и настраиваемой бизнес-логики.

    В любом случае, рекомендуем познакомиться с тестом всем, кому интересно программирование на Java.

    Структура теста по Groovy

    Тест Groovy в основном содержит практические вопросы, связанные с программированием на Groovy.

    Вопросы теста можно разделить на следующие тематики:

    • Синтаксис groovy
    • Типы данных
    • Дополнительные возможности groovy
    • Ход выполнения программы
    • Функции в groovy
    • ООП в groovy
    Дальнейшее развитие теста по Groovy

    Основное направление развития теста по Groovy - это добавление новых вопросов по различным темам. Кроме этого, в зависимости от популярности теста, будет произведена реструктуризация теста с разбиением вопросов теста на тематики, а также создание теста по Groovy среднего уровня сложности.

    Будем благодарны сообществу за добавление новых вопросов в тест.

    Ждем Ваших замечаний и предложений.

    Важно: Ниже обсуждается только тест в целом: покрытие тематик, типы вопросов, пути улучшения теста и так далее.

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

    Groovy - скачать бесплатно Groovy для Windows

    Groovy Основная информация о программе

    Groovy является объектно-ориентированным языком программирования, который работает в среде JRE. Язык Groovy использует некоторые свойства Python, Ruby и Haskell, но создан для работы внутри виртуальной машины Java (JVM) и широко интегрируется с Java программами. Благодаря этому языку созданы инструменты контроля качества CodeNarc и GMetrics, swing-ориентированный фреймворк Griffon, системы сбора Gant и Gradle, инструментарий для интеграции с Google App Engine – Gaelyk, система параллельного программирования Gpars, тестовый комплект Spock, MVC веб-фреймворк Grails. Так как Groovy работает в среде JRE, то его основным конкурентом является Java. Разработчики акцентируют на том, что этот язык очень похож на Java, и не требует больших усилий для изучения. Groovy язык динамично направленный, поэтому использовать его стоит там, где нужны динамичные языки.

    Ключевые особенности и функции
    • интеграция с Java ;
    • высокая скорость разработки;
    • динамичный язык программирования;
    • режим статической компиляции;
    • перегрузка операций;
    • замыкания;
    • статическая и динамическая типизация;
    • встроенный синтаксис для регулярных выражений, списков, массивов и ассоциативных массивов.
    Что нового в этой версии?
    • исправлена проблема в GroovyScriptEngine при работе со скриптами базовых классов;
    • исправлена проблема, связанная с созданием компилятором некорректных внутренних классов;
    • исправлена некорректная работа функции disjoint();
    • исправлено исключение при работе с ExpandoMetaClass;
    • исправлена проблема с пустыми списками Intersect;
    • исправлен сбой компонента Grape при загрузке Groovy Extensions;
    • исправлены прочие обнаруженные ошибки.
    Смотреть всю историю изменений

    Функциональное мышление: Часть 2

    Функциональное мышление: Часть 2. Функциональные возможности Groovy

    Метапрограммирование и Functional Java

    В языке Groovy возможности метапрограммирования эффективно соединяются с функциональным программированием. Узнайте, как метапрограммирование позволяет добавлять к типу данных Integer методы, использующие встроенные функциональные возможности Groovy. Также в этой статье рассказывается, как использовать метапрограммирование для "прозрачной" интеграции богатых функциональных возможностей инфраструктуры Functional Java в Groovy.

    В данной статье я продолжу исследование точек пересечения между языком Groovy и функциональным программированием.

    В языке Groovy сочетается несколько парадигм программирования. Так, он поддерживает объектно-ориентированное программирование, метапрограммирование и элементы функционального программирования, которые во многом ортогональны друг другу (см. вкладку « Ортогональность »). Метапрограммирование позволяет добавлять новую функциональность в язык и его базовые библиотеки. Сочетая метапрограммирование и функциональное программирование, можно сделать собственный код более функциональным или усовершенствовать сторонние функциональные библиотеки, чтобы повысить качество их работы в Groovy. Cначала я покажу, как можно использовать Groovy-класс ExpandoMetaClass для усовершенствования существующих классов, а затем - как использовать этот механизм для встраивания в Groovy библиотеки Functional Java.

    Создание "открытых" классов с помощью класса ExpandoMetaClass Ортогональность

    Термин "ортогональность " охватывает множество дисциплин, включая математику и вычислительную технику. В математике ортогональными называются два вектора, расположенные под прямыми углами друг к другу. В вычислительной технике ортогональнымии называют компоненты, не оказывающие влияния друг на друга. Например, функциональное программирование и метапрограммирование в Groovy являются ортогональными концепциями, так как они никак не взаимодействуют между собой. Использование метапрограммирования не запрещает использовать функциональные конструкции, и наоборот. Тот факт, что они являются ортогональными, не означает, что они не могут работать вместе, просто при использовании они не пересекаются между собой.

    Одна из наиболее впечатляющих возможностей Groovy – это «открытые классы» (функциональность, позволяющая «открыть» существующий класс, чтобы улучшить или сократить его функциональность). Этот подход отличается от наследования, при котором класс нового типа наследуется от существующего. Принцип "открытости" классов позволяет открыть такой класс как, например, String (напомню, что класс String является final-классом) и добавить в него новые методы. Библиотеки для unit-тестирования используют данную возможность, чтобы добавлять проверочные методы в класс Object. так что все классы приложения могут использовать эти методы.

    В Groovy есть два подхода для создания "открытых" классов: категории и класс ExpandoMetaClass (см. раздел " Ресурсы "). Для представленного примера подойдет любой из этих подходов, но я выбрал ExpandoMetaClass из-за более простого синтаксиса.

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

    Листинг 1. Законченный пример классификатора чисел на языке Groovy

    Если у вас возникли какие-либо вопросы о реализации методов, используемых в данной версии, обратитесь к предыдущим статьям (в особенности " Связывание и композиция. Часть 2 " и " Функциональные возможности Groovy. Часть 1 "). Для использования методов данного класса я могу вызывать их в "стандартном" функциональном стиле: Classifier.isPerfect(7). Однако с помощью метапрограммирования я могу привязать эти методы непосредственно к классу Integer. что позволит мне напрямую "спросить" число, к какому типу оно относится.

    Чтобы добавить эти методы к классу Integer. я воспользуюсь свойством metaClass данного класса, как показано в листинге 2 (в Groovy это свойство доступно для всех классов).

    Листинг 2. Добавление классифицирующих методов к классу Integer Инициализация методов, основанных на метапрограммировании

    Методы, основанные на метапрограммировании, необходимо добавлять до того момента, как они впервые будут вызваны. Наиболее безопасное место для их инициализации – это инициализирующий static -блок того класса, который будет их использовать (так как static -инициализация гарантированно выполняется раньше всех других инициализирующих блоков). Однако при таком подходе возникнут дополнительные сложности в случае, когда сразу несколько классов должны использовать усовершенствованные методы. В общем случае в приложениях, интенсивно использующих метапрограммирование, создается bootstrap-класс, который берет на себя вопросы загрузки классов и гарантирует, что инициализация произойдет в определенный момент.

    В листинге 2 я добавляю к классу Integer три метода из класса Classifier. и все значения типа Integer в Groovy будут обладать этими методами (в Groovy отсутствуют примитивные типы данных, например, int. так как даже константы в Groovy используют Integer в качестве базового типа). Внутри блока кода, представляющего тело метода, я получаю доступ к предопределенному параметру delegate. который представляет собой значение объекта, вызвавшего метод класса Classifier .

    После того как я проинициализировал мета-методы (см. вкладку " Инициализация методов, основанных на метапрограммировании "), я могу непосредственно вызвать метод числа, чтобы узнать его тип, как показано в листинге 3.

    Листинг 3. Использование метапрограммирования для классификации чисел

    В листинге 3 показано, что новые методы работают как для переменных, так и для констант. После данного примера можно с легкостью добавить в класс Integer метод, возвращающий тип числа, например в виде enum-объекта.

    Добавление новых методов к существующим классам само по себе не очень «функционально», даже если они и вызывают функциональный код. Однако возможность легко добавлять методы позволяет легко встраивать сторонние библиотеки (например, Functional Java), что в свою очередь добавляет значительные функциональные возможности. Я реализовал классификатор чисел, основанный на возможностях Functional Java, во второй статье этого цикла, и воспользуюсь им сейчас, чтобы создать «неиссякаемый» источник совершенных чисел.

    Преобразование типов данных с помощью метапрограммирования

    По сути, Groovy – это один из диалектов Java, так что подключение к нему сторонних библиотек, таких как Functional Java, является тривиальной задачей. Однако я могу ещё лучше интегрировать эти библиотеки с Groovy, если прибегну к помощи метапрограммирования для преобразования различных типов данных, чтобы обеспечить большую «прозрачность» при интеграции. В Groovy имеется встроенный механизм замыканий (на основе класса Closure ). Так как в библиотеке Functional Java замыкания пока отсутствуют (поскольку она основана на синтаксисе Java 5), то её разработчики использовали параметризованные типы и общий класс F. содержащий метод f(). С помощью Groovy-класса ExpandoMetaClass я могу устранить различия между типами «метод» и «замыкание», создав методы, соединяющие их.

    Я хочу усовершенствовать класс Stream из библиотеки Functional Java, предоставляющий абстракцию "бесконечного" списка. Я бы хотел передавать Groovy-замыкания вместо объектов типа F из арсенала Functional Java, поэтому я добавил в класс Stream перегруженный метод, чтобы преобразовать замыкания к методу f() класса F. как показано в листинге 4.

    Листинг 4. Привязка типов данных с помощью класса ExpandoMetaClass

    На первой строке я создаю в классе Stream метод filter(). принимающий на вход замыкание (это параметр с ). На второй, закомментированной, строке делается то же самое, но для добавляемого параметра указывается тип – Closure (это не влияет на выполнение кода в Groovy, но может оказаться предпочтительнее с точки зрения документации). В блоке кода вызывается метод filter(). уже существующий в классе Stream. при этом объект Groovy-типа Closure подставляется вместо класса fj.F из библиотеки Functional Java. Я воспользовался оператором as. доступным в Groovy, чтобы выполнить преобразование типов данных.

    Оператор as преобразует замыкания в определения интерфейсов, позволяя сопоставлять методы замыкания с методами, объявленными в интерфейсе, как показано в листинге 5.

    Листинг 5. Использование оператора as для "облегченного" итерирования

    В листинге 5 я создаю хеш-таблицу, содержащую две пары ключ – значение. Имена элементов являются строками (в Groovy не требуется помещать значения ключей для хеш-таблиц в двойные кавычки, так как они по умолчанию являются строками), а значения элементов содержат блоки кода. Оператор as привязывает эту хеш-таблицу к интерфейсу Iterator. в котором также объявлены методы hasNext() и next(). После выполнения подобного преобразования я могу использовать свою хеш-таблицу как объект типа Iterator (результатом выполнения последней строки в листинге 5 будет true ). В случаях, если мой интерфейс содержит единственный метод или если я хочу привязать все методы интерфейса к одному замыканию, я могу отказаться от хеш-таблицы и использовать оператор as для прямой привязки замыкания к функции. Возвращаясь обратно к первой строке в листинге 4, я привязал замыкание, переданное в качестве параметра, к одному методу класса F. В листинге 4 я также привязываю оба метода getAt(). один из которых принимает на вход число, а другой – объект типа Range. так как объекту filter для работы необходимы оба эти метода.

    Используя усовершенствованный класс Stream. я могу работать с бесконечной последовательностью, как показано в листинге 6.

    Листинг 6. Использование класса Stream. входящего в библиотеку Functional Java, в Groovy-приложении

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

    Бесконечные потоки в Groovy

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

    Для создания "бесконечного" объекта Stream. выдающего совершенные числа, мне потребуется дополнительно привязать к замыканиям Groovy два метода класса Stream. как показано в листинге 7.

    Листинг 7. Привязка двух методов, необходимых для создания «потока» совершенных чисел

    В листинге 7 я создаю преобразующий метод asList(). чтобы облегчить преобразование "потока" библиотеки Functional Java в обычный список. Также я перегружаю метод cons() класса Stream. который отвечает за создание нового списка. При создании бесконечного списка его структура обычно включает в себя первый элемент и замыкание с блоком кода, который при обращении генерирует следующий элемент, в качестве остальной части списка. Чтобы создать в Groovy бесконечный "поток" совершенных чисел, мне необходимо, чтобы инфраструктура Functional Java позволяла использовать Groovy-замыкание в качестве параметра для метода cons() .

    Если воспользоваться оператором as для привязки замыкания к интерфейсу, в котором объявлено несколько методов, это замыкание будет вызываться при вызове любого метода, имеющегося в интерфейсе. Подобная простая привязка подходит для большинства классов Functional Java. Однако для небольшого числа методов используется метод fj.P1. а не fj.F. Иногда в подобных ситуациях всё равно можно использовать простую привязку, так как нижележащие методы не используют других методов класса P1. В случаях, когда требуется большая точность, я могу воспользоваться более сложной привязкой (закомментированный пример её использования представлен в листинге 7 ), для которой необходимо создать хеш-таблицу с методом _1(). привязанным к замыканию. Хотя этот метод и выглядит довольно странно, но это обычный метод класса fj.P1. возвращающий первый элемент.

    После того как я с помощью метапрограммирования привязал новые методы к классу Stream. можно воспользоваться классом Classifier из листинга 1. для создания бесконечного "потока" совершенных чисел, как показано в листинге 8.

    Листинг 8. Бесконечный "поток" совершенных чисел, созданный с помощью Functional Java и Groovy

    Я использую static import для подключения метода cons() из библиотеки Functional Java и своего метода nextPerfectNumberFrom() из класса Classifier. чтобы сократить объём исходного кода. Метод perfectNumbers() возвращает бесконечную последовательность совершенных чисел, используя первое совершенное число после стартового значения в качестве первого элемента последовательности, а замыкание с блоком кода для вычисления совершенного числа в качестве второго элемента. Блок кода внутри замыкания возвращает бесконечную последовательность со следующим совершенным числом в качестве первого элемента, и замыкание опять используется в качестве второго элемента. В тесте я создаю последовательность совершенных чисел, начиная с 1, и извлекаю три следующих совершенных числа, чтобы проверить их совпадение с уже известными значениями.

    Заключение

    Когда разработчики думают о метапрограммировании, они обычно думают только о своём коде, а не о том, как можно улучшить сторонний код. Groovy позволяет мне добавлять новые методы не только к встроенным классам, таким как Integer. но и в сторонние библиотеки, например, Functional Java. Сочетание метапрограммирования и функционального программирования предоставляет огромные возможности при минимальном количестве кода, позволяя "прозрачно" соединять функциональность.

    Хотя я могу вызывать классы Functional Java напрямую из Groovy, многие из компонентов библиотеки сильно уступают по изяществу настоящим замыканиям. Используя метапрограммирование, я могу привязываться к методам Functional Java так, чтобы они могли «понимать» и использовать удобные Groovy-структуры, соединяя тем самым сильные стороны обоих подходов. До тех пор пока в Java не появится встроенный тип «замыкание», разработчикам придется выполнять подобные привязки типов данных, используемых в различных языках (например, на уровне байт-кода Groovy-замыкания значительно отличаются от замыканий, используемых в Scala). После стандартной реализации замыканий в Java эти преобразования можно будет переложить на среду исполнения, и потребность в подобных привязках также исчезнет. Но до этого момента подобная возможность позволит создавать компактный и при этом мощный код.

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

    Ресурсы Научиться
    • Functional thinking: Functional features in Groovy, Part 2. оригинал статьи (EN).
    • The Productive Programmer (Neal Ford, O'Reilly Media, 2008): новая книга Нила Форда, в которой более подробно рассматриваются некоторые вопросы из данной серии статей.
    • Functional Java. инфраструктура Functional Java привносит в язык программирования Java многие возможности функциональных языков.
    • Practically Groovy: Metaprogramming with closures, ExpandoMetaClass, and categories (Скотт Дэвис, developerWorks, июнь 2009 г.) (EN): статья из серии Practically Groovy с дополнительной информацией о метапрограммировании.
    • Language designer's notebook: First, do no harm (Брайан Гетц, developerWorks, июль 2011 г.) (EN): статья, в которой рассматриваются особенности реализации лямбда-выражений или замыканий (lambda expressions - новая функциональность языка, которая разрабатывается для Java SE 8).
    • Посетите магазин книг. посвященных ИТ-технологиям и различным аспектам программирования.
    Получить продукты и технологии
    • Functional Java. загрузите инфраструктуру Functional Java.
    • Загрузите ознакомительные версии продуктов IBM или исследуйте интерактивные демо-версии в IBM SOA Sandbox. чтобы познакомиться с инструментами для разработки приложений и ПО промежуточного уровня семейств DB2®, Lotus®, Rational®, Tivoli® и WebSphere®.