воскресенье, 23 марта 2008 г.

Enable Globally

ExpandoMetaClass по умолчанию не используется. Например:




Object.metaClass.puts = {obj->
println obj
}

puts "hello"


Мы увидим MissingMethodException. Т.е. вся иерархия классов не получает данный метод, только Object. Однако если мы напишем:



Integer.metaClass


То все объекты класса Integer будут использовать ExpandoMetaClass и начнут понимать puts:



5.puts “yes”

Но что, если мы не хотим перечислять все классы в которые мы хотим добавить наш метод? Для этого мы используем:



ExpandoMetaClass.enableGlobally()


После чего:
puts “hello”
будет работать везде

delegate, owner и this (часть 1)

Эти три переменные очень важны, если вы решили написать DSL. Хотя в простейших случаях они указывают на один и тот же объект, они все могут отличаться друг от друга. Вас не интересовала, как работает identity в Groovy? Быть может, вы думаете, что там кроется какая-та хитрость и только создатели языка да ещё 10-20 программистов знают, как все работает. Давайте напишем, свой вариант identity и назовем его по старой памяти with.




class Sample {
def foo (){
println "foo"
}

def with (Closure s){
s.delegate = this
s ()
}
}

new Sample ().with {
foo()
}



Установив delegate для Closure, мы намекаем Groovy, где искать ненайденные методы - в объекте delegate, в данном случае в объекте Sample. Очень просто? Да.




Давайте теперь вздохнем глубоко и напишем:




class Sample {
def foo (){
println "foo"
}
}

ExpandoMetaClass.enableGlobally()

Object.metaClass.with = {Closure s->
s.delegate = delegate
s ()
}



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

пятница, 21 марта 2008 г.

Ещё одна отличная книга о Groovy

В издательстве Pragmatic Programmer готовится к печати ещё одна книжка по Groovy: Venkat Subramanian – Programming Groovy. Вы можете купить её за 20 долларов в формате PDF. Найти её бесплатную я так и не сумел, поэтому пришлось раскошелиться. Стоит отметить, книжка стоит этих 470 рублей.

Книга состоит из трех основных частей: Beginning Groovy, Using Groovy, MOPing Groovy. Я уже довольно длительное время программирую на Groovy, написал на нем пару проектов, поэтому первые две части особого интереса для меня не представляли. Кроме разве что главы про Closures: более доступно объяснить разницу между owner, this, delegate мне кажется невозможно.

Но покупал то я эту книгу ради раздела про метапрограммирование. Читая в Groovy In Action главу про MOP я как-то не очень проникся, да и с того времени Groovy сильно нарастил свои метапрограммисткие мышцы. Я надеялся, что книжка Венката поможет мне не плавать в этой теме. Надежды оправдались, раздел про MOP написан блестяще. Очень подробно, в деталях, описывая все нюансы, автор просто вбивает вам в голову знание MOP. Он начинает с азов, а затем демонстрирует все возможные методы синтеза кода и заканчивает главами о тестировании (очень подробно: отдельно о том, как тестировать Java и Groovy), построении билдеров и написании DSL. Дочитав до конца, я включил консоль и без труда, без особых размышлений «как», написал два DSL.

Как мне кажется, книжка все-таки больше пригодится тем, кто уже пишет на Groovy. Венкат доступно и очень информативно описывает многие тонкости языка: тестирование, метапрограммирование и др. Да, самое главное: после прочтения я определенно стал понимать Groovy лучше.