• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)
 

Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)

on

  • 1,070 views

An updated version of the talk I gave at FOSDEM earlier in 2011.

An updated version of the talk I gave at FOSDEM earlier in 2011.

This one has a much better "How to approach this in the real world" section.

Statistics

Views

Total Views
1,070
Views on SlideShare
1,070
Embed Views
0

Actions

Likes
1
Downloads
9
Comments
0

0 Embeds 0

No embeds

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version) Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version) Presentation Transcript

    • Introduction to writing readable and maintainable Perl Or Perl Best Practices: The Best Bits Or Perl is more readable than Java! Or Your code is bad and you should feel bad
    • Who Am I?Alex Balhatchet Working at• Super Nerd since 1985 • 5+ years of code• Perl Hacker since 2002 • 727 modules• Londoner since 2004 • 1107 test files• Paid Perl Hacker since • Lots of legacy code 2006 • All Perl
    • Whats this all about?• Pragmas• CPAN• Best Perl Best Practices• The Real World• Questions
    • Pragmas
    • Always use strictuse strict makes your code safer• requires that all variables are declared with "my", "our", etc. - stops you from making typos in variable names• stops you from using symbolic (string) references - stops you from writing terrible terrible code• does not allow non-subroutine barewords - stops you making typos in subroutine calls
    • ...and use warningsuse warnings ensures that odd things do not silently try to "dowhat you mean."• print undef - uninitialized value in print()• 1 + "bananas" - non-numeric value in addition• %hash = (1, 2, 3); - odd number of elements in hash
    • Other Useful Pragmasmake open() and others die on erroruse autodie;use new Perl featuresuse feature :5.14; # enable all of themuse feature say;   # enable one at a timemake warnings throw exceptionsuse warnings FATAL => all;
    • CPAN
    • The CPANThe CPAN is by far the best thing about Perl.http://search.cpan.org98,000 modules!Using CPAN modules means your code gets maintained, bug-fixed and optimized for you!
    • Picking CPAN ModulesWith 98,000 modules it can be difficult to pick the right one...Which is the right one for the job?
    • Picking CPAN ModulesUse the CPAN Testers reports, rt bug tracker, and Reviews.Every Distribution will have these!http://search.cpan.org/dist/Data-Dumper/
    • Picking CPAN ModulesThe Task::Kensho CPAN module is a documentation-and-dependencies-only distribution which can be used as arecommended modules list.Some highlights are...App::cpanminus, Test::Most, Try::Tiny,Devel::NYTProf, Perl::Critic, DateTime,Config::General, and App::Ack Its a great starting point!
    • The BestPerl Best Practices
    • Perl Best PracticesPerl Best Practices is an amazing book that was published in2005PBP contains some great tips forwriting readable and maintainablePerl code... and some silly ideaslike inside-out objects ;-)But seriously, read it. It will make youa better programmer.
    • Code in paragraphsCode which is written in paragraphs is much more readable.# get ready...read_commandline_arguments(); init();  # actual work here...do_stuff();# output...format_output();output_stuff();
    • Throw ExceptionsThere are many reasons Exceptions win out over error codes.• Impossible to ignore• Functions dont have to try to return two values• Separate exceptional from non-exceptional cases
    • Throw ExceptionsPerl implements exceptions with strings and die(). die "Exception!"; You can use eval() to catch them, but the Try::Tiny modulegives us Java-style try/catch keywords which are much nicer.try {  stuff();}catch {  # exception is in a lexically scoped $_ variable}; 
    • Use builtinsBuiltins in Perl are sensible and readable, especially when youreditor has decent syntax highlighting.Perl is excellent at string manipulation and dealing with lists.Use it to its full potential.Perls builtins have well defined names and behaviours, learn tolove them.
    • Use builtinswhile (my $line = readline $fh) {    # ...}Is more readable than...while (my $line = <$fh>) {    # ...}Especially for people less familiar with Perl!
    • Use builtinsmy @log_files = glob "*.log";Is more readable (and less prone to error) than...my @log_files = <*.log>;(Especially when your syntax highlighter thinks that log is the log()function and highlights it yellow :-))
    • Use builtinsif (defined $value){    # stuff...}Is less prone to error than...if ($value){    # stuff...}
    • Use builtinswarn "Something went wrong!";Is way better than...print STDERR "Something went wrong!";See perldoc ­f warn for all the awesome details :-)
    • Use honorary builtinsThere are a number of "honorary builtins" which are exportedby core modules.use Scalar::Util qw(looks_like_number openhandle);use List::Util qw(first max min shuffle sum);use List::MoreUtils qw(any all none uniq apply);
    • Avoid overly confusing idioms and clevernessPerl lets you write code however you want.TIMTOWTDI - There is more than one way to do it.A big part of writing readable Perl is about admittingthat some of the ways to do it suck!
    • Avoid overly confusing idioms and clevernessWhat does this do?my $result =     [ $result1 => $result2 ]  ­>[ $result2 <= $result1 ];
    • Avoid overly confusing idioms and clevernessMaybe its more obvious like this... use List::Util qw(min); my $result = min($result1, $result2);
    • The Real World
    • Why do we want maintainable code?To be able to maintain it of course!Especially important• When working on a long-lived project• When working on a team• When team members are added frequently
    • Coding Style Guidelines• Set out rules for all new development• Match existing code as closely as is sensible• Embrace the Best Practices and the Modern• Give you something concrete to point to when somebody writes something you dont agree with• Give you something to work from for code reviews
    • The Golden RulesWe have an Asimovian set of rules at the top of our CodingStyle Guide document...Rule One: Follow the style of the surrounding codeRule Two: Follow the rules of the Coding Style GuideRule Three: Follow Perl Best Practices
    • Refactoring for StyleBasically follows the same rules as regular refactoring...• Make sure there are tests• Make sure there are good tests• Change the whole file so that consistency is maintained• Commit your changes to your VCS as a whole, without any other changes!
    • Perl::CriticPerl::Critic, and its executable friend perlcritic, is atool which will tell you what is wrong with your Perl code.% perlcritic my_script.pl
    • Perl::Critic#!/usr/bin/perluse feature say;open(IN, $0);while (<IN>) {    chomp; foreach (sort keys %letters) {    for (split //, $_) {     say "$_t$letters{$_}";        $letters{$_}++; }    }} close(IN);How many style problems can you spot?
    • Perl::Critic% perlcritic ­­verbose 11 bad_perl.pl Bareword file handle opened at line 3, near open(IN, $0);.  InputOutput::ProhibitBarewordFileHandles (Severity: 5)    Using bareword symbols to refer to file handles is particularly evil because they are global, and you have no idea if that symbol already points to some other file handle. You can mitigate some of that risk by......Contains the full Perl Best Practices text!!
    • Perl::CriticHow we use Perl::Critic at Nestoria...● Nightly test run critiques code● Writes output to a separate log file● If any failures occur, a single file is chosen to be the one to fix for the day. The current “Engineer of the Week” fixes it● Within 3 months we had zero Perl::Critic violations!● New violations are solved almost immediately!
    • Questions etc.
    • Questions?
    • Contact Me http://kaoru.slackwise.net/ @kaokun on Twitter My Code http://search.cpan.org/~kaoru/ https://github.com/kaoru/ Slideshttp://www.slideshare.net/kaokun