В последние годы складывается следующая тенденция развития объектно-ориентированных языков программирования: к ним добавляют все больше и больше элементов, взятых из мира функционального программирования. C# обзавелся поддержкой анонимных функций несколько лет назад, настала пора и Java-разработчикам приобщиться к прекрасному. Поддержка анонимных функций и основанный на их широком использовании новый API Collection Framework'а ждет нас в Java 8. Интернет уже запестрил статьями вида "Как написать свой Hello World на Java 8". Но писать Hello World не интересно, давайте лучше рассмотрим, как можно использовать новые возможности для решения конкретных задач в нашем суровом "Ынтырпрайз" мире.
Показаны сообщения с ярлыком Functional programming. Показать все сообщения
Показаны сообщения с ярлыком Functional programming. Показать все сообщения
вторник, 21 января 2014 г.
вторник, 14 января 2014 г.
DAO на голом JDBC без использования Spring Framework и AOP. Хотите немного функциональной магии?
Здравствуйте, уважаемые подписчики. Праздники кончились и очень хочется немного поработать. Сейчас Суровый разрабатывает небольшое интеграционное решение, оперирующее коллекциями разнообразных объектов. Так как есть весьма критичные требования к производительности, а ассоциации между объектами практически отсутствуют, то было принято решение отказаться от использования ORM и ограничиться чистым JDBC. А так как мы работаем с коллекциями, то всегда найдется место для функциональной магии. В данной статье я расскажу об организации "коллекционно-ориентированного" слоя доступа к данным.
В интеграционном проекте приходится решать две основные задачи: извлекать коллекции объектов из одного хранилища, например базы данных, и записывать их в другое. Соответственно, концептуально мы имеем две операции: load и save. При этом типов объектов и алгоритмов их загрузки/извлечения может быть очень много. Для организации DAO можно описать все операции в виде методов в одном классе. Получится класс, состоящий из N*2 методов, где N - количество типов объектов. Данный класс будет очень большим и сложным, по сути у нас получится просто некоторое кладбище SQL-запросов, которое будет чрезвычайно трудоемко как сопровождать, так и тестировать.
Можно разделить передаваемые типы данных на группы по функциональному признаку и создать не один класс DAO, а несколько. Однако опыт подсказывает, что при интеграции как правило выделяется одна функциональная область, число типов данных в которой значительно превышает все остальные. Речь идет о нормативно-справочной информации (НСИ). Создание нескольких классов по два-три метода и одного с двадцатью методами не является решением проблемы. Антипаттерн "волшебный объект" все еще остается в системе.
Пойдем другим путем. Воспользуемся паттерном QueryObject. При использовании данного паттерна мы инкапсулируем логику загрузки каждого типа объекта в свой класс. Аналогично поступаем с логикой сохранения данных. Таким образом у нас получается N*2 маленьких классов, состоящих из одного бизнес-метода. Данные классы легко сопровождать и тестировать. В случае необходимости очень просто сделать заглушку (mock) - необходимо подменить всего один метод. Вероятность конфликтов при работе с системой контроля версий так же уменьшается.
Используем паттерн QueryObject
В интеграционном проекте приходится решать две основные задачи: извлекать коллекции объектов из одного хранилища, например базы данных, и записывать их в другое. Соответственно, концептуально мы имеем две операции: load и save. При этом типов объектов и алгоритмов их загрузки/извлечения может быть очень много. Для организации DAO можно описать все операции в виде методов в одном классе. Получится класс, состоящий из N*2 методов, где N - количество типов объектов. Данный класс будет очень большим и сложным, по сути у нас получится просто некоторое кладбище SQL-запросов, которое будет чрезвычайно трудоемко как сопровождать, так и тестировать.
Можно разделить передаваемые типы данных на группы по функциональному признаку и создать не один класс DAO, а несколько. Однако опыт подсказывает, что при интеграции как правило выделяется одна функциональная область, число типов данных в которой значительно превышает все остальные. Речь идет о нормативно-справочной информации (НСИ). Создание нескольких классов по два-три метода и одного с двадцатью методами не является решением проблемы. Антипаттерн "волшебный объект" все еще остается в системе.
Пойдем другим путем. Воспользуемся паттерном QueryObject. При использовании данного паттерна мы инкапсулируем логику загрузки каждого типа объекта в свой класс. Аналогично поступаем с логикой сохранения данных. Таким образом у нас получается N*2 маленьких классов, состоящих из одного бизнес-метода. Данные классы легко сопровождать и тестировать. В случае необходимости очень просто сделать заглушку (mock) - необходимо подменить всего один метод. Вероятность конфликтов при работе с системой контроля версий так же уменьшается.
суббота, 17 июля 2010 г.
Об использовании возможностей платформы Eclipse из кода на Scheme
В предыдущей статье мы рассмотрели использование плагина к IDE Eclipse - SchemeScript - в качестве удобного и мощного средства для разработки на Scheme. В данной статье рассмотрим, как можно с помощью данного плагина использовать возможности платформы Eclipse, например с целью изучения языка Scheme.
В поставку SchemeScript входит компилятор Scheme-кода в Java-байткод под названием Kawa. Данный компилятор позволяет как вызывать из Java-кода участки программы, написанные на Scheme, так и в Scheme-коде использовать Java-классы. Таким образом обеспечивается полная интероперабельность между Java и Scheme.
пятница, 16 июля 2010 г.
SchemeScript: разрабатываем на языке Scheme в Eclipse
- Введение
- Eclipse-перспектива Scheme
- Редактирование исходного кода
- Интерпретация
- Поддержка Kawa REPL
- Настройки
- Заключение
Введение
Scheme - функциональный язык программирования, один из двух наиболее известных в наше время диалектов языка Lisp. Гай Стил (Guy L. Steele) и Джеральд Сассмен (Gerald Jay Sussman) из Массачусетского технологического института (MIT) — создали его в середине 1970-х годов. Именно Scheme долгое время применялся в MIT для обучения программированию (сейчас заменен на Python) и именно на Scheme написаны примеры в знаменитой книге "Структура и интерпретация компьютерных программ" - библии всякого уважающего себя программиста.
Для интегрированной среды разработки Eclipse существует плагин, позволяющий программировать на Scheme. В данной статье мы рассмотрим основные возможности данного плагина, изучим процесс его использования и процедуру настройки.
вторник, 15 июня 2010 г.
Про моноиды (с примерами на F#)
Введение
Apocalips порадовал статьей, в которой четко и доходчиво объяснил что такое моноид применительно к алгебре над списками и теории категорий. В данной заметке представлен очень вольный перевод его статьи, снабженный примерами на F# (у Apocalips'a примеры на Scala).
Прежде всего рассмотрим обобщенное определение моноида:
- type IMonoid<'T> =
- abstract member mempty : 'T
- abstract member mappend : 'T * 'T -> 'T
Другими словами, моноид заданного типа 'T - это объединение двух элементов: функции mappend: 'T -> 'T -> 'T и значения mempty: 'T. Для моноида должны выполняться следующие правила:
1. Функция mappend должна быть ассоциативна, т.е. mappend (x, mappend(y, z)) == mappend(mappend(x, y), z).
2. Значение mempty должно быть единицей функции mappend, другими словами: mappend(x, mempty) == mappend (mempty, x) == x
суббота, 17 апреля 2010 г.
Параллельный Reduce: математические основы и пример реализации на Java
В данной статье рассмотрены понятия свертки и ссылочного гомоморфизма, их взаимосвязь, приведен пример построения многопоточного Reduce и сравнение его скорости работы с однопоточным вариантом на примере анализа данных с сервера РТС. В дальнейшем планирую развить данную работу и реализовать MapReduce с помощью R-OSGi.
воскресенье, 4 апреля 2010 г.
Работаем с F# в Emacs
Сегодня мы поговорим о том, как использовать замечательный редактор Emacs для разработки на языке F# от одной небезызвестной корпорации.
Не секрет, что синтаксис языка программирования F# был чуть менее, чем целиком позаимстован с синтаксиса OCaml, поэтому, чтобы на нем было удобно программировать в Emacs - достаточно адаптировать режим для OCaml, добавив работу с отступами, потому что в F# как и в Python отступы имеют значение, и с интерпретатором fsi. К счастью работа по адаптации уже проведена: Laurent Le Brun создал fsharp-mode, который хостится на SourceForge. Проект сейчас находится в стадии alpha, однако умеет следующее:
1. Подсветку синтаксиса.
2. Работу с отступами: автоматическую расстановку отступов, сдвиги блоков кода влево-вправо и т.д.
3. Работу с интерпретатором F# - fsi.exe. Можно отправлять произвольные блоки кода на интерпретацию нажатием комбинации клавиш и видеть результат интерпретации в отдельном интерактивном буфере.
Рассмотрим подключение режима, его настройку и использование подробнее.
суббота, 27 марта 2010 г.
Имитируем алгебраические типы данных в языке Java
Продолжаем тему внедрения элементов функционального программирования в процесс разработки на императивном языке Java. Сегодня мы поговорим о красоте такого понятия как алгебраический тип данных. Интуиция, лежащая при создании такого понятия, и его использование хорошо описаны в статье Евгения Кирпичева "Элементы функциональных языков", опубликованной в 3-м номере журнала Практика функционального программирования . Если вам интересно, то подробное математическое обоснование понятия "алгебраический тип данных" можно прочитать в статье Романа Душкина "Алгебраические типы данных и их использование в программировании", опубликованной во 2-м номере того же журанала. В дальнейшем, обещаю не использовать такие термины, как "размеченное объединение", "декартово произведение", "нотация Хоара" и т.д.
Моя же статья является упрощенным переводом Structural Pattern Matching in Java с некоторыми дополнениями.
суббота, 20 февраля 2010 г.
Устанавливаем F# и FSharp.PowerPack под Mono
Суровому челябинскому программисту захотелось экзотики. А что у нас является экзотикой? Правильно - продукция маленькой и незаметной компании из Redmond'а. В частности - ее платформа .NET и набирающий популярность функциональный язык программирования F#. Вот об установке этого чуда под Mono - открытую реализацию CLR под *nix подобные ОС мы и поговорим.
Прежде всего следует установить сам Mono, причем версии 2.0 или выше. В дереве портежей сейчас присутствует версия 2.4.2.3, которая легко устанавливается следующей командой:
pavel> sudo emerge mono
Теперь нам нужно скачать последний Community Technology Review (CTP) языка F# по ссылке Download the F# CTP, расположенной на странице (как я понял для каждого нового CTP ссылка на него меняется, в частности февральский можно скачать отсюда). Не забываем, что скачивать нужно ZIP-архив.
Подписаться на:
Сообщения (RSS)