2. Greatly inspired in the contents of...
&
ISBN-13: 978-0596001735 ISBN-13: 978-0131655492
3. “Always code as if the person who will maintain
your code is a maniac serial killer that knows
where you live”
● Software Engineers spend most of their
time reading code NOT writing it!
● Code is the only complete, accurate
and updated documentation
● Easy to read code has fewer bugs
4. sub attr {
$_ = (caller(0))[3];
s/.*://; @_ > 1 ? $_[0]->{$_} = $_[1] : $_[0]->{$_}
}
vs
sub attr {
my $self = shift;
$self->{attr} = shift if(@_ );
return $self->{attr};
}
6. Guideline
namespace → Noun [ :: Adjective ]*
Begin package's names with an uppercase, if compound
words are used each word must be capitalized, also
when using acronyms each letter must be capitalized
Good
package XML::Simple;
package Car::Electric;
Package Devel::NYTProf;
package Moose;
Bad
package Hotel::Inventory::HotelInventory;
package Big::House;
Package Rich::People;
package Html::tag;
7. Guideline
Avoid names that relate to implementation details,
there might be special cases where you don't want to
do that such as packages that provide bindings to an
specific library
Good
package Plane::Jet;
package Dog::Beagle;
Package XML::LibXML;
package Gtk2;
Bad
package XML::SAXServiceParser;
package People::CachedList;
Package Moose::People;
package HTTP::LWPAgent;
9. Guideline
routine ➝ imperative_verb [ _ adjective ]? _ noun _ preposition
| imperative_verb [ _ adjective ]? _ noun _ participle
| imperative_verb [ _ adjective ]? _ noun
Pick function and method names that describe what
they do and not how they do it
Good
$list->is_empty;
sub calculate_net_rate {
sub get_record {
sub build_profile_using {
Bad
$date->ok;
sub end_tag {
$file->backup;
sub using {
10. Guideline
Begin subroutine or method names with is_ or has_ if
they return a boolean, there might be special cases
where you don't want to do that
Good
$element->is_valid;
$node->has_children;
$hotel->room_available_for(@dates);
$list->contains($element);
Bad
$date->valid;
$record->bad_record;
$list->list_empty;
$process->running;
11. Guideline
Prefix “internal use only” subroutines or “Private”
methods with an underscore
Good
$self->_build_list;
$self->_calculate_price;
$self->_store($element);
$self->_initialize(@_);
Bad
sub internal_method {
sub private_function {
12. Guideline
Use nouns for subroutines or methods which return a
specific object or value
Good
$car->engine;
$face->mouth;
$list->next_item;
$person->name;
Bad
$car->get_engine;
$list->item;
$plane->retrieve_model;
$dog->leg;
13. Guideline
Use imperative for subroutines or methods that
performs an action
Good
$car->start_engine;
$face->smile;
$list->remove_all;
$person->clone;
Bad
$car->engine;
$face->happy;
$list->clear;
$person->new_instance;
15. Guideline
Variable ➝ [ adjective _ ]* noun
Use lowercase for variables and if compound words are
use separate each word with underscore
Good
my $name = 'Doe';
my $first_name = 'John';
my $total_price = $net_rate + $taxes
my $next_node;
Bad
my $name_first;
my $name_last;
my $node;
my $sum;
16. Guideline
Name arrays in plural and hashes in singular
Good
my @errors;
my %author_of;
my @brands;
my %config;
Bad
my @record;
my %authors;
my %places;
my @user;
17. Guideline
lookup_variable ➝ [ adjective _ ]* noun _ preposition
Adding a preposition to the end of lookup variables
make names more readable
Good
my @sales_for;
print “$sales_for[$month]n”;
my %title_of;
print “$title_of{$book}n”;
Bad
my @sales;
print “$sales[$index]n”;
my %titles;
print “$titles{$isbn}n”;
19. Guideline
Avoid ambiguous abbreviations or names, is preferable
to use short full names. If you have to abbreviate
use well-accepted abbreviations
Good
my $io_stream;
my $tcp_sock;
my $udp_socket;
sub gmt_timestamp {
Bad
my $left;
my $tcp_st;
my @e;
sub g_tmstmp {
20. Guideline
Use named constants, using the constant pragma. For
named constants use uppercase
Good
use constant PI => 3.14;
my $area = PI * $radius**2 ;
use constant BASE_URL => 'http://a.com';
my $home_url = “${BASE_URL}/home”;
Bad
my $area = 3.14 * $radius**2;
my $base_url = 'http://a.com';
my $home_url = 'http://a.com/home';
if ( $#results < 50 ) {