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

Re^5: Burned by precedence rules (not)

by tye (Sage)
on Dec 27, 2008 at 06:53 UTC ( [id://732755]=note: print w/replies, xml ) Need Help??


in reply to Re^4: Burned by precedence rules
in thread Burned by precedence rules

Actually, I've seen the confusion happen with just a simple "unless $bool". Making the negation more explicit tends to help. I've quite recently seen several cases where I and people I've worked with were persistently confused as to how code could be doing what it was doing and it turned out that the part that was confusing us was the use of "unless".

I've also tried to simply replace an "unless" with an "if" and thus produced a horribly complicated bunch of negations (which I didn't keep). Most of the time, I can find other subtle negations and cancel them out. Things like "unless $count != 0".

Of course, "unless" seems to be "obviously" the same as "if not". But if the human mind actually worked that way, then there would have been no confusion when I answered "Is this preview button regarding updates not wanted?" with "No". The human mind doesn't do "double negatives" like some claim English does (and thus also not like programming languages do).

So reduce the number of negations in your programming constructs. And make the negations that you do more explicit. "unless" may be appealing because it eliminates a negation, but it doesn't, it just makes the negation more subtle.

An example of a really bad subtle double negative is "last unless ...". "last" has a subtle negation in it, since it means "do not keep looping".

And when a conditional gets complicated, sometimes the best route is to just add one or more named items for different parts of the conditional.

my $is_logged_in= $user && $user->id() != User->anonymous_id(); my $has_guest_coupon= $cookie && $cookie->is_for_guest() && ! $cookie->is_expired(); if( $is_logged_in || $has_guest_coupon ) {

or, usually better, especially if the short-circuiting is important:

if( is_logged_in($user) || has_guest_coupon($cookie) ) {

- tye        

Replies are listed 'Best First'.
Re^6: Burned by precedence rules (not)
by gwadej (Chaplain) on Dec 28, 2008 at 20:53 UTC

    In my experience, the difference between if and unless has been less of a problem than overly complex conditional expressions. As you point out, adding a well-named function or variable that summarizes a series of tests is more important.

    Since we've probably all seen these same kinds of confusions in languages that do not have an unless, it seems more reasonable to focus on clear conditionals rather than which keyword is used. If the conditional expression is clear enough, the code will be clear.

    G. Wade

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (6)
As of 2024-03-28 10:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found