NAME
Perl::Critic::Policy::ControlStructures::ProhibitPostfixControls - Write if($condition){ do_something() }
instead of do_something() if $condition
.
AFFILIATION
This Policy is part of the core Perl::Critic distribution.
DESCRIPTION
Conway discourages using postfix control structures (if
, for
, unless
, until
, when
, while
) because they hide control flow. The unless
and until
controls are particularly evil because they lead to double-negatives that are hard to comprehend. The only tolerable usage of a postfix if
/when
is when it follows a loop break such as last
, next
, redo
, or continue
.
do_something()
if
$condition
;
# not ok
if
(
$condition
) { do_something() }
# ok
do_something()
while
$condition
;
# not ok
while
(
$condition
) { do_something() }
# ok
do_something()
unless
$condition
;
# not ok
do_something()
unless
!
$condition
;
# really bad
if
(!
$condition
) { do_something() }
# ok
do_something()
until
$condition
;
# not ok
do_something()
until
!
$condition
;
# really bad
while
(!
$condition
) { do_something() }
# ok
do_something(
$_
)
for
@list
;
# not ok
LOOP:
for
my
$n
(0..100) {
next
if
$condition
;
# ok
last
LOOP
if
$other_condition
;
# also ok
next
when
m< 0 \z >xms;
# fine too
}
CONFIGURATION
A set of constructs to be ignored by this policy can specified by giving a value for 'allow' of a string of space-delimited keywords: if
, for
, unless
, until
, when
, and/or while
. An example of specifying allowed flow-control structures in a .perlcriticrc file:
[ControlStructures::ProhibitPostfixControls]
allow =
for
if
until
By default, all postfix control keywords are prohibited.
The set of flow-control functions that are exempt from the restriction can also be configured with the 'flowcontrol' directive in your .perlcriticrc file:
[ControlStructures::ProhibitPostfixControls]
flowcontrol =
warn
die
carp croak cluck confess
goto
exit
This is useful if you're using additional modules that add things like assert
or throw
.
NOTES
The die
, croak
, and confess
functions are frequently used as flow-controls just like next
or last
. So this Policy does permit you to use a postfix if
when the statement begins with one of those functions. It is also pretty common to use warn
, carp
, and cluck
with a postfix if
, so those are allowed too.
The when
keyword was added to the language after Perl Best Practices was written. This policy treats when
the same way it does if
, i.e. it's allowed after flow-control constructs. Thanks to brian d foy for the inspiration.
BUGS
Look for the do {} while
case and change the explanation to point to page 123 when it is found. RT #37905.
AUTHOR
Jeffrey Ryan Thalhammer <jeff@imaginative-software.com>
COPYRIGHT
Copyright (c) 2005-2011 Imaginative Software Systems. All rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The full text of this license can be found in the LICENSE file included with this module.