wood burning stoves 2.0*
The moose likes Ruby and the fly likes Metaprogramming : not for everyone ? Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login

Win a copy of OCA/OCP Java SE 7 Programmer I & II Study Guide this week in the OCPJP forum!
JavaRanch » Java Forums » Languages » Ruby
Bookmark "Metaprogramming : not for everyone ?" Watch "Metaprogramming : not for everyone ?" New topic

Metaprogramming : not for everyone ?

Thomas Queste

Joined: Mar 08, 2006
Posts: 15

Just a question about the complexity of metaprogramming.

As Metaprogramming can be an incredible way to produce a piece of code (elegant, concise...), it can also be very difficult to understand by young developpers.
We know that not every developers will read the Ruby Metaprogramming book because they don't think they need to.
So how to know where to use metaprogramming and when not ?

My question is a bit vague, I am looking for your impression on the subject.


David Newton

Joined: Sep 29, 2008
Posts: 12617

Like any other abstraction tool, use metaprogramming when the problem you're trying to solve is one you have to solve repeatably, and the cost/benefit tradeoff is weighed in favor of "benefit". And remember that metaprogramming doesn't need to be done, or even well-understood, by people that *use* it. After all--how many people use attr_accessor without even knowing what it is, that it's a method that creates new methods, and so on?

Whoever *does* do the metaprogramming *should* understand it, how to debug it, how Ruby finds methods to run, and so on.
Thomas Queste

Joined: Mar 08, 2006
Posts: 15
Thanks David.
I understand your point of view. attr_accessor is a good example of metaprogramming behind the scene.

And, code should not be leveled by the worst people on the team :-)
Paolo Perrotta

Joined: Mar 27, 2010
Posts: 27
David, you have a very good point here. I'd also add that metaprogramming is like any other technique - difficult at first, and then it becomes just another tool. Then you select your tools based on the usual questions: how obvious is this code for me and my teammates? Is a method_missing() this more elegant than just defining two similar methods here? What happens if I have to change this later? And so on.

Like most good things, metaprogramming can be overused (or abused). However, I don't think that overusing metaprogramming is worse than overusing most other coding practices. Maybe the "meta" prefix just makes it sound scary. Well-written metaprogramming code is supposed to be more readable than the equivalent "regular" code, not more obscure.

Admittedly, there are a few techniques that can bite you real bad - like reckless monkeypatching of classes. That happens when you change existing classes, for example by redefining their methods. This is a slippery path. In the book I talk at length about this and how to avoid pitfalls (in a word: testing!).

Paolo Perrotta, Europe
Author of Metaprogramming Ruby
subject: Metaprogramming : not for everyone ?