Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Why ref($proto) should be avoided

by jeffa (Chancellor)
on Jul 17, 2002 at 06:10 UTC ( #182347=note: print w/ replies, xml ) Need Help??


in reply to Re: (jeffa) 3Re: My first stab at OO perl...
in thread My first stab at OO perl...

You almost got me. :)

On page 103, TheDamian explains that calling a 'constructor' as an object method is a lazy way to copy an object, but observe what happens when you change an object's attributes at runtime and try to clone it:
use strict; use Clone qw(clone); my $foo = foo->new(); $foo->{spam} = {spam =>'eggs'}; my $bad_clone = $foo->new(); my $good_clone = clone($foo); $bad_clone->{spam}->{spam} or warn "bad has no eggs"; $good_clone->{spam}->{spam} or warn "good has no eggs"; package foo; use strict; sub new { my $class = shift; my $proto = ref($class) || $class; return bless {}, $proto; }
TheDamian also explains on page 105 that
While many experts view the overloading of constructors as object copiers to be a natural extension of their functionality, others consider the technique unintuitive, too subtle, and more likely to produce obscure and hard-to-maintain code.
and on page 106
If you have a choice, it's probably better to code a seperate clone method. Apart from keeping your individual methods simpler and less prone to bugs, the method's name will force client code to be more clearly self-documenting.

jeffa

doesn't like spam


Comment on Why ref($proto) should be avoided
Download Code
Re: Why ref($proto) should be avoided
by frag (Hermit) on Jul 17, 2002 at 11:30 UTC
    Still, that's after using ref($caller) in all the preceding examples. Ditto in the 'final version' of CD::Music (p.114). And you've got to admit, "probably better" aint much of a condemnation.

    -- Frag.

      Well, i wouldn't say all the preceding examples. He does use some form of ref($caller) extensively throughout the book, but not in every example.

      And i can admit that "probably better" ain't much of condemnation, but not as much as i can admit that it ain't much of a recomendation either. I see nothing wrong with simpler methods that are less prone to bugs and are more clearly self-documenting. :)

      Update: i should mention that Class::MethodMaker's new_hash_init specifier makes for a very robust instance constructor. Consider using it if you don't like having to write your own clone method.

      jeffa

      L-LL-L--L-LL-L--L-LL-L--
      -R--R-RR-R--R-RR-R--R-RR
      B--B--B--B--B--B--B--B--
      H---H---H---H---H---H---
      (the triplet paradiddle with high-hat)
      

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://182347]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (10)
As of 2014-10-31 17:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (221 votes), past polls