Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re^2: bless with => separated args

by jaa (Friar)
on Aug 01, 2005 at 09:32 UTC ( [id://479836]=note: print w/replies, xml ) Need Help??


in reply to Re: bless with => separated args
in thread bless with => separated args

Thanks for the detail on fat-comma.

Any reason why "(ref $class || $class)" is deprecated?

It is useful if you want a new instance based on the same class as an existing object, without having to hard-code the class name.

The only reason that I have heard is that most people start OO by copying the examples, without understanding the code, which surely is not a strong enough reason for deprecation?

Regards,

Jeff

Replies are listed 'Best First'.
Re^3: bless with => separated args
by davorg (Chancellor) on Aug 01, 2005 at 09:42 UTC
    Any reason why "(ref $class || $class)" is deprecated?

    It can make the semantics of your constuctor confusing. If I want a new object of class Foo then I want to call Foo->new. I'd probably expect $foo->new to clone $foo, but if the class author wanted that functionality they should have created an object method called "clone" or something like that.

    In general, it's a good idea to have class methods and object methods completely separate from each other. The ref $class || $class idiom breaks that distinction.

    It is useful if you want a new instance based on the same class as an existing object, without having to hard-code the class name.

    Well, you can always use (ref $foo)->new if that's what you want.

    --
    <http://www.dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg

      I'd probably expect $foo->new to clone $foo, but if the class author wanted that functionality they should have created an object method called "clone" or something like that.
      That, I do not understand. If you expect the author to name clone functionality clone, then why assume that new clones the object?

      I'd expect something called new to give me a new thing - not a cloned one.

      Well, you can always use (ref $foo)->new if that's what you want.
      That's not much of an argument, is it? With such an argument, we could do away with for/foreach, unless, and/or, q/qq/qw/qx, etc. There are always alternatives taking a few more keystrokes.

      And note that the existance of ref $proto || $proto in a constructor doesn't prevent you from writing:

      (ref $foo)->new
      if
      $foo->new
      confuses you.

      But the absense of ref $proto || $proto forces someone who doesn't confuse easily to write:

      (ref $foo)->new
      Ergo, using ref $proto || $proto gives the user of the module more choice.

        My point was that $foo->new has confusing semantics. It should mean something like "create a new object based on $foo" not "create a new object of the same class as $foo". Who knows whether $foo->new creates a new, empty object of the same class or a complete copy of $foo. It's not clear unless you read the docs or the source code. I didn't say that I was confused, just that it was potentially confusing :)

        Good OO programming practice is that class methods and object methods should be distinct. I think that it's a shame that common Perl practice seems to be to ignore that practice as it makes OO programming in Perl seem more complex than it needs to be.

        --
        <http://www.dave.org.uk>

        "The first rule of Perl club is you do not talk about Perl club."
        -- Chip Salzenberg

Re^3: bless with => separated args
by blazar (Canon) on Aug 01, 2005 at 09:58 UTC
    I'm far from being an OO expert myself, but the basic reason is that they think that new() should be used as a class method and that an instance method to provide cloning should be supplied instead, to keep their roles/functionalities separated, so as to avoid possible confusion.
      The existance of
      ref $proto || $proto
      in the constructor doesn't prevent you from using new strictly as a class method.

      It just doesn't enforce that upon someone who doesn't mind.

      I use

      ref $proto || $proto
      in my constructors, but I use my constructors purely as class methods. However, I let other uses of my modules free in their choice.
Re^3: bless with => separated args
by Anonymous Monk on Aug 01, 2005 at 10:56 UTC
    Deprecated implies they once endorsed it.

    Writing ref $proto || $proto allows the caller of the constructor to create a new object by calling:

    $obj -> new;
    Some people (who are seen as "knowledgable") claim that $obj -> new confuses the hell out of them and that hence constructors should not contain ref $proto || $proto.

    I think that's silly. If something confuses you, don't use it. No need to jihad the thing that enables you to get confused.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2024-04-23 18:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found