Moose Design Patterns
Upcoming SlideShare
Loading in...5
×
 

Moose Design Patterns

on

  • 1,856 views

One key benefit of Moose is the Object-Oriented jargon it brings to the table. ...

One key benefit of Moose is the Object-Oriented jargon it brings to the table.

With Moose, it's very easy to implement common design patterns, as I present in the keynote.

This keynote was part of the Israeli Perl Workshop 2011.

Statistics

Views

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

Actions

Likes
1
Downloads
10
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

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

Moose Design Patterns Moose Design Patterns Presentation Transcript

  • Moose Design Patterns Ynon Perek ynonperek@yahoo.com http://ynonperek.comTuesday, February 28, 2012
  • Good Code Bad CodeTuesday, February 28, 2012
  • OOP Use Cases • Write code that other developers will use • Write code that will survive in an ever changing environmentTuesday, February 28, 2012
  • Meet The MooseTuesday, February 28, 2012
  • Moose • Post Modern Object Oriented Perl • Consistent OO Framework • StableTuesday, February 28, 2012
  • A First Class Class Def package Person; • use Moose; A class is just a package has name, is => ro, isa => Str; has age, is => rw, isa => Int; • A method is just a sub • An attribute is ... Class Use We’ll get to that later package main; use feature :5.10; my $p = Person->new(name => "James"); say $p->name;Tuesday, February 28, 2012
  • Object Methods package Car; use Moose; has speed, is => ro; • A method takes the object sub go {     my $self = shift; (invocant) as its     print "Vroom Vroom [speed: ", first argument             $self->speed,             "]n"; } • That’s why we use package main; my $self = shift my $c = Car->new(speed => 10); $c->go;Tuesday, February 28, 2012
  • Whats In The Box • A new method • use strict, use warnings • Type Validation • Organize Your CodeTuesday, February 28, 2012
  • OO DesignTuesday, February 28, 2012
  • OO Design Patterns Tested, Proven development paradigms for speeding up development processTuesday, February 28, 2012
  • Pattern Structure • Name • Problem • Solution • ConsequencesTuesday, February 28, 2012
  • Categories Creational Behavioral Structural Singleton Observer Mixins Template Factory Method Composite Builder FlyweightTuesday, February 28, 2012
  • Creational Patterns • Abstract instantiation process • We must only create one log file instance for the entire system • An XML tree is built gradually, node-by-nodeTuesday, February 28, 2012
  • Singleton Pattern • Ensure a class only has one instance • Manage Resource SharingTuesday, February 28, 2012
  • Moose Singleton package Logger; use MooseX::Singleton; sub debug { ... } sub warn { ... } package main; my $logger = Logger->instance; my $same = Logger->instance; my $and_again = Logger->new; $logger->debug("Hello World");Tuesday, February 28, 2012
  • Factory • Create a different object based on some conditional • Treat the newly created objects the same way • Practical: abstract away OS related codeTuesday, February 28, 2012
  • Factory package AppConfig; use Moose::Role; requires debug_mode; • Use a Role to requires native_separators; specify common requires root_fs; behaviorTuesday, February 28, 2012
  • Factory package ConfigFactory; use Moose; sub build_config {     my $cfg; • All creation logic     given ($^O) { stays in the         $cfg = WinConfig->new when /MSWin32/;         $cfg = UnixConfig->new; factory     }     return $cfg; }Tuesday, February 28, 2012
  • Factory package main; • Users only need to know about my $cfg = ConfigFactory->build_config; the role, not the say $cfg->debug_mode; various implementationsTuesday, February 28, 2012
  • Creational PatternsTuesday, February 28, 2012
  • Behavioral Patterns • Assignment of responsibility between objects and classes • Use either inheritance or compositionTuesday, February 28, 2012
  • Template MethodsTuesday, February 28, 2012
  • Template Method • Separate the algorithm from the actual implementation • Define the skeleton of an algorithm • Example: Paint on a canvas or printerTuesday, February 28, 2012
  • Painter Example Draw PixelTuesday, February 28, 2012
  • Roles: Partials package Painter; • Template methods are use Moose::Role; implemented using roles requires drawPixel; • Use requires to define a sub draw_line { ... } sub draw_triangle { ... } partial implementation sub draw_rectangle { ... }Tuesday, February 28, 2012
  • Roles: Partials package ScreenPainter; use Moose; with Painter; sub draw_pixel { ... } package main; my $painter = ScreenPainter->new; $painter->draw_line(0, 0, 100, 100);Tuesday, February 28, 2012
  • Behavioral PatternsTuesday, February 28, 2012
  • Structural • Control structure of an object • Is it composed of other objects ? • How are these parts used ? • Composition, Decorator, AdapterTuesday, February 28, 2012
  • Composition: What Send Mail Send Mail Contact Email Call Call PhoneTuesday, February 28, 2012
  • Moose Composition • Moose has a built-in support for delegation • Use handles on an attribute to create an effective composition • Prefer composition over inheritanceTuesday, February 28, 2012
  • Delegation: How package Contact; • Can take regular use Moose; expressions has email => (     is => ro, • Can take hashref     handles => [ qw/send_mail/ ] ); • perldoc Moose::Manual::Delegation my $c = Contact->new; $c->send_mail(subject => "Hello",               text => "...");Tuesday, February 28, 2012
  • Delegation • Delegation is explicit • Performed via attributes • Highly recommendedTuesday, February 28, 2012
  • OO Design Consider design patterns Use the power of perl Clean Code is worth itTuesday, February 28, 2012
  • Thanks For Listening Ynon Perek ynonperek@yahoo.com http://ynonperek.comTuesday, February 28, 2012