[rspec-users] class << self considered harmful... really?
Brian Takita
brian.takita at gmail.com
Thu Nov 27 16:59:06 EST 2008
On Tue, Nov 25, 2008 at 8:41 AM, Matt Wynne <matt at mattwynne.net> wrote:
> Sorry, I know this is off-topic, but I'd really like to know what the
> revered ruby-hackers who read this list think.
>
> See
> http://ozmm.org/posts/class__self_is_harmful.html
>
> I have adopted class << self, partly from reading RSpec and Cucumber's code
> as I learn Ruby. I personally think of class methods (or 'static' methods)
> as being in a kind of 'holding pen' waiting to be factored off onto a proper
> class of their own, so I rather like the clear way you can group them in a
> 'nameless' metaclass ready for the exit door.
>
> I also really like the clarity of seeing the invisible metaclass for what it
> is.
>
> What do people think? How can this be harmful?
Its funny because I consider def self.foo harmful for a few reasons.
def self.method_name is often mixed with instance methods. This makes
reading the code confusing because there are two contexts that you
need to deal with.
Its too easy to confuse because it reads like its in the same instance,
def self.foobar
@foobar
end
def foobar
@foobar
end
Also, like you mentioned, using def self. obfuscates an object
extraction that needs to happen. With class << self, I can think about
refactoring an object, rather than refactoring class methods. class <<
self allows me to think of class/modules in a more object oriented
way.
class Foo
def self.method_1(an_instance)
end
def method_1
end
def method_2
end
def method_3
end
def self.method_2(an_instance)
end
end
I also like how all of the class << self methods are organized into a
single section. Yes, its difficult to read if it takes more than a
screenful, but I prefer it to having to track down all of the def
self.method_name methods spread all over the place.
Also, class << self is more powerful. It allows you to use one way to
use your convenience methods (attr_*, include) and parser instructions
(public, private, protected). Nothing is worse than having to use both
def self.method_name and class << self.
>
> cheers,
> Matt
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>
More information about the rspec-users
mailing list