Метапрограммирование в Ruby: разбор примера::Журнал СА 12.2014
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Архив номеров
Контакты
   

  Опросы
  Статьи

Электронный документооборот  

5 способов повысить безопасность электронной подписи

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

 Читать далее...

Рынок труда  

Системные администраторы по-прежнему востребованы и незаменимы

Системные администраторы, практически, есть везде. Порой их не видно и не слышно,

 Читать далее...

Учебные центры  

Карьерные мечты нужно воплощать! А мы поможем

Школа Bell Integrator открывает свои двери для всех, кто хочет освоить перспективную

 Читать далее...

Гость номера  

Дмитрий Галов: «Нельзя сказать, что люди становятся доверчивее, скорее эволюционирует ландшафт киберугроз»

Использование мобильных устройств растет. А вместе с ними быстро растет количество мобильных

 Читать далее...

Прошу слова  

Твердая рука в бархатной перчатке: принципы soft skills

Лауреат Нобелевской премии, специалист по рынку труда, профессор Лондонской школы экономики Кристофер

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 9926
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 8136
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 8240
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5219
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 5902
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

Друзья сайта  

 Метапрограммирование в Ruby: разбор примера

Архив номеров / 2014 / Выпуск №12 (145) / Метапрограммирование в Ruby: разбор примера

Рубрика: Разработка /  Особенности языка

Иван Шихалев ИВАН ШИХАЛЕВ, фрилансер, специализируется на веб-разработке и Ruby, shikhalev@gmail.com

Метапрограммирование в Ruby:
разбор примера

Добавление собственных абстракций в объектную модель – это просто. И интересно. От частных примеров – к общим принципам программирования в Ruby

Авторы книги «Programming Ruby: The Pragmatic Program-mers' Guide» называют метапрограммированием расширение и изменение абстракций языка (тогда как собственно программирование пользуется теми, что есть). Конечно, можно поспорить о том, что считать такой абстракцией, а что нет, однако нельзя не заметить, что в современных динамических языках, таких как Ruby или, например, Python, легко делаются некоторые вещи, находившиеся в классических языках именно на языковом уровне и жестко определявшиеся компилятором. Тут можно вспомнить для примера декораторы, о которых я писал в сентябре прошлого года [1]. И сейчас мы рассмотрим нечто подобное. В процессе я буду делать обобщающие отступления, переходя от частного примера к общим принципам программирования в Ruby.

Формулировка задачи

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

Представим, что мы пишем графический редактор, а лучше 3D-конструктор (мебели, например). Нам придется оперировать множеством разнородных (разные классы) объектов, обладающих различными характеристиками, часть которых уместно сделать изменяемыми в процессе редактирования. Характеристики, в общем-то, задаются в разных местах – что-то подгружается из файлов, что-то задается пользователем через поля ввода, что-то меняется посредством мыши и т.д. И, сделав уже половину работы, мы обнаруживаем при тестировании, что отрисовка время от времени выбрасывает ошибку из-за некорректно заданных характеристик – длина доски вдруг оказалась равна строке «стеариновая свечка»...

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

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

Наши свойства будут поддерживать:

  • контроль присваиваемых значений;
  • значения по умолчанию;
  • события, вызываемые при установке значения.

Определение свойств будет выглядеть примерно так:

property :alpha, filter: String, default: ''

property :beta, :gamma, filter: Integer, default: 0

property :delta, filter: Float,

default: 1.0 do |obj, prop, value|

p [obj, prop, value]

end

Последний вариант задает обработчик события. В случае, когда никаких именованных параметров, даже filter, не задано, property будет работать, в сущности, аналогично стандартному attr_accessor. Заметим, что атрибуты в Ruby определяются не ключевыми словами, а приватными методами класса Module. Логично будет пойти тем же путем.

Замечание: ключевые слова «module» и «class» в Ruby не формируют какое-то сакральное определение, принципиально отличающееся от остальной части программы, а просто переводят исполнение в контекст модуля (или класса соответственно), по необходимости создавая его. Это значит, что внутри определений мы можем писать, в общем-то, произвольный код, учитывая контекст, конечно [2]. При этом благодаря необязательности скобок при вызове такие методы, как attr, include, private, module_function, выглядят структурными элементами языка.

Статью целиком читайте в журнале «Системный администратор», №12 за 2014 г. на страницах 56-59.

PDF-версию данного номера можно приобрести в нашем магазине.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru