Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re: Re: Re: Re: Re: Short routines matter more in OO?

by tilly (Archbishop)
on Oct 14, 2003 at 13:21 UTC ( #299098=note: print w/replies, xml ) Need Help??


in reply to Re: Re: Re: Re: Short routines matter more in OO?
in thread Short routines matter more in OO?

Why are you assigning to $self->{"property$n"} and then returning $self->{property}?

Your @_ test also makes little sense to me. If you are trying to write get/set routines, you would want to get on a single routine, set on 2, and think about throwing an error on 3 or more. Your methods as written require an extra argument to say, "set, pretty please".

I was also going to chide you for having methods called property1, property2 without thinking through what you are going to do if you had more than 2 properties, and then I realized that you were likely talking properties of an object, not a computer representation of physical properties. :-)

Oh, right. If you are going to have a lot of very similar code, then I think that autogenerating can be good. (Assuming, of course, that the person who will take over the code is capable of figuring out autogenerated code...) For instance:

foreach my $accessor (@object_properties) { no strict 'refs'; *$accessor = sub { my $self = shift; $self->{$accessor} = shift if @_; $self->{$accessor}; }; }
(Yeah, yeah. A million CPAN modules implement variations on the above for you.)

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Re: Short routines matter more in OO?
by Juerd (Abbot) on Oct 14, 2003 at 15:43 UTC

    Why are you assigning to $self->{"property$n"} and then returning $self->{property}?

    That is a typo, which I then copied.

    Your @_ test also makes little sense to me. If you are trying to write get/set routines, you would want to get on a single routine, set on 2, and think about throwing an error on 3 or more.

    Yes. This is another typo. Should have been >=, not >. The error on 3 or more makes sense, but I usually forget those.

    Fortunately, I have Attribute::Property, so I can even write working code when I'm as tired as I was when I wrote that node.

    If you are going to have a lot of very similar code, then I think that autogenerating can be good.

    I've put all my favourite object-property-code in Attribute::Property, together with xmath. It was originally made to allow $foo->bar = 14; syntax, but I use it now mostly because it makes creating classes much easier. (And when I'm tired, apparently this means I make less mistakes. See the other node: I made no mistake in the lines that use : Property :-))

    Juerd # { site => 'juerd.nl', plp_site => 'plp.juerd.nl', do_not_use => 'spamtrap' }

      I would wonder whether Attribute::Property suffers from the same issue that came up at How to redefine subroutines with Attribute::Handlers that run at BEGIN time? (subsequently reported to p5p here). Namely that attribute wrapping of functions normally is done in INIT or CHECK blocks, but those are only run once in the lifetime of the interpreter.

      Therefore code which is lazily loaded by do, require, AUTOLOAD, Apache::Reload etc won't have existed at the right time for the attributes to actually have been properly installed, therefore leading to mysteriously failing code.

      Basically what I am saying is that attributes, while they certainly win on the "cool tricks" scale, are not something that I really want to depend on.

        Therefore code which is lazily loaded by do, require, AUTOLOAD, Apache::Reload etc won't have existed at the right time for the attributes to actually have been properly installed, therefore leading to mysteriously failing code.

        Even though A::P does suffer from this, the bug caused by it is not mysterious. When you try to use the Property attribute on an anonymous sub or at some other time at which the symbol argument is not given, it croaks.

        I haven't needed to require or do my class modules or to autogenerate functions. Yet.

        Thank you for letting me know about this issue. I hope someone will find a workaround soon. When I have the time, I think I should try using Data::Swap and use the referent argument.

        Juerd # { site => 'juerd.nl', plp_site => 'plp.juerd.nl', do_not_use => 'spamtrap' }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://299098]
help
Chatterbox?
[Corion]: GrandFather: All's well that ends well? ;)
[GrandFather]: I'm fighting with a third party device our software is to support. The documentation for the device's SDK is quite a lot less than average and most of today was spent ...
[GrandFather]: discovering that one of the sensors for the device lies about the gain range it is using!
[GrandFather]: However, by the end of the day I had discovered its deceptions and now have it working correctly, so yes, all's well that ends well. :-D
[Corion]: GrandFather: Ah, (hardware) APIs - I have a similar situation with Chrome and its API... It is fairly underdocumented and I guess I have to hunt...
[Corion]: ... down supposedly working code to find out what I'm supposed to do
[GrandFather]: I haven't any "working code" to inspect! I have to find ways to generate reference signals then check the numbers I get at the far end match.
[GrandFather]: That's ok when the signal is a voltage, but there are three axis accelerometers, gyroscopes and magnetometers in these things! A little invention is needed at times!

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (5)
As of 2017-08-24 07:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Who is your favorite scientist and why?



























    Results (365 votes). Check out past polls.

    Notices?