Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^3: A short, "iffy" rant

by SpanishInquisition (Pilgrim)
on Oct 12, 2004 at 18:40 UTC ( [id://398648]=note: print w/replies, xml ) Need Help??


in reply to Re^2: A short, "iffy" rant
in thread A short, "iffy" rant

Yep, I agree with that, and I was referring to it. "Considered harmful" should be "considered harmful". Tongue and cheek rarely works on the internet, hence confusion.

As your if/elsif/else construct grows, the dispatch solution becomes easier to read and maintain

No doubt about it.

But what about

if ($self->hungry()) { # go eat } elsif ($theater->open() && $self->wants_movie()) { # hunger is more important than movie } elsif ($cable->has_good_tv_show()) { # watch programming shows only, of course }

Bad code, agreed ... but that doesn't translate into a dispatch table. I am quite the fan of dispatch tables.

Dispatch tables work great for scalars if you are only testing scalars, usually your conditionals are more complex.

I too, use the ternary operator most of the time (but never nested), as many things more complex imply too complex ... hence they can be redesigned ... but not always.

Sometimes efficiency is important, and sometimes an if needs to be. Heck, sometimes if you pass through once a switch is what you want (but hey, perl doesn't have a good switch that is implemented without a source filter).

Replies are listed 'Best First'.
Re^4: A short, "iffy" rant
by dragonchild (Archbishop) on Oct 12, 2004 at 19:09 UTC
    if ($self->hungry()) { $self->go_eat(); return; } if ($theater->is_open() && $self->wants_movie()) { $self->go_watch_movie(); return; } ....

    If it is important that the maintainer notice that each choice is mutually exclusive, then make them extremely obviously mutually exclusive.

    Also, Ovid is discussing the fact that most if-statements are of a form that would be better written as a switch statement. Additionally, switch statements, in Perl, are nearly always better written as dispatch tables. And, if you really want a dispatch table, try the following:

    my @dispatch = ( [ sub { $_[0]->is_hungry }, sub { $_[0]->go_eat } ], ); foreach my $choice (@dispatch) { next unless $choice->[0]->( $self ); $choice->[1]->( $self ); last; }

    There's no rule that says dispatch tables have to be hashes of subrefs.

    Being right, does not endow the right to be rude; politeness costs nothing.
    Being unknowing, is not the same as being stupid.
    Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
    Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

    A reply falls below the community's threshold of quality. You may see it by logging in.
Re^4: A short, "iffy" rant
by Ovid (Cardinal) on Oct 12, 2004 at 19:54 UTC

    I think we definitely have the same opinion here. I could translate your code to a dispatch table by creating a method which creates a dispatch key, but I think it would be more trouble than it's worth. Your code is likely simpler.

    Cheers,
    Ovid

    New address of my CGI Course.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2024-04-19 07:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found