Accessors are dangerous

So commonly used accessors (setters/getters) I think are dangerous when overused or used without a caution. Here is a quick list why.

  • Too many accessors are a sign of a class that does too much or is highly coupled
  • Too much information is revealed about the class
  • Accessors that have the same name for setting and getting variables may be confused with normal methods since they don't state clearly if they are read only
        $invoice->price(100); # Nothing happens
        $invoice->price;      # Anything but 100
  • Encourage breaking of Tell Dont Ask and Law of Demeter principles
        if ($invoice->price > 100) {
            $invoice->pay;
        }
  • Require too much of configuration when more advanced behaviour is needed
        has 'book' => sub {
    
            # Setter
            if (@_) {
                my $value = shift;
    
                if ($value =~ m/.../) {
                    ...
                }
    
                return;
            }
    
            # Getter
        };
  • Trying to be universal add a lot of checks that are not always needed
  • Too many ways to do it
        Class::MethodMaker
        Object::Tiny
        Spiffy
        Class::Spiffy
        accessors
        Object::Tiny
        Rubyish::Attribute 
        Class::Accessor
        Class::Accessor::Fast
        Class::Accessor::Complex
        Class::Accessor::Constructor
        Class::Accessor::Classy
        Class::Accessor::Lite 
        Class::XSAccessor 
        Moose
        Mouse
        Moo
        Mo

    and

        Mojo::Base::XS # yeah, baby, yeah!

    See also App::Benchmark::Accessors.

  • Are slow and require optimization magic (literally)

    See Class::XSAccessor

    For me it's not difficult to write 3-5 methods that set/get variables while keeping encapsulation and ease of modification (though I must admit I have CPAN modules that do not follow this approach, but the time will come!).

Comments

blog comments powered by Disqus