Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.

ref($proto) - just say no!

by merlyn (Sage)
on Jan 16, 2001 at 02:48 UTC ( [id://52089]=note: print w/replies, xml ) Need Help??

in reply to Re: perl oo
in thread perl oo

I disagree about that ref($proto) part.

If you want an instance method called "new", I have no idea what it's doing. If you want to clone an object, call your instance method "clone" or "copy". If you want to provide a new empty object of the same class as an existing object, just use:

my $sibling = (ref $original)->new(...);

There is no point in putting that ref-ish crap in something called "new". In fact, it's misleading.

Note that I'm not arguing that every method should be either a class method, or an instance method, but not both. Rather, I'm saying that "new" on an instance could mean either "clone" or "make new one like...", and thus you are confusing at least half your audience, guaranteed.

Yes, there are other prominent members of the Perl community who disagree with me on this. Ask them if they were programming in Smalltalk in 1980. {grin}

I consider any use of this ref($proto) || $proto in new to be "cargo cult programming", and mark it off as such in the code reviews I do.

-- Randal L. Schwartz, Perl hacker

update: I finally wrote this up in a way that fully explains my objections. See the last few paragraphs of my SysAdmin column, which triggered a partial rewrite of perltoot for Perl 5.8.5 removing this objectionable construct.

Replies are listed 'Best First'.
Re: ref($proto) - just say no!
by mr.nick (Chaplain) on Jan 16, 2001 at 06:30 UTC
    Huh. I seem to have hit upon a long-standing disagreement without realizing it. Your point seems sensible; I've been doing it that way because it's the one that's in perltoot :)

      I know what you mean! There is so much in all the Perl OO materials that is overhead without complete explanation it's kind of shocking.

      coreolyn -- return bless { me => 'father' }, $haveSin";

Log In?

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

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (4)
As of 2024-04-15 02:27 GMT
Find Nodes?
    Voting Booth?

    No recent polls found