SlideShare a Scribd company logo
1 of 42
OO Systems and Roles
 Curtis “Ovid” Poe
 Senior Software Engineer
Copyright 2009 by Curtis “Ovid” Poe.

This presentation is free and you may redistribute it and/or
modify it under the terms of the GNU Free Documentation
License.
Template Copyright 2009 by BBC.


Future Media & Technology                                       BBC MMIX
Not a Tutorial
• #ovidfail
• “How” is easy
• “Why” is not




 Future Media & Technology         BBC MMIX
The Problem Domain

• 5,613 Brands
• 6,755 Series
• 386,943 Episodes
• 394,540 Versions
• 1,106,246 Broadcasts
• 1,701,309 On Demands
 July 2, 2009



  Future Media & Technology    BBC MMIX
A Brief History of Pain

•Simula 67
 –Classes
 –Polymorphism
 –Encapsulation
 –Inheritance

 Future Media & Technology    BBC MMIX
Multiple Inheritance

•C++
•Eiffel
•Perl
•CLOS

 Future Media & Technology     BBC MMIX
Single Inheritance

•C#
•Java
•BETA
•Ruby

 Future Media & Technology      BBC MMIX
Handling Inheritance

•Liskov
•Strict equivalence
•Interfaces
•Mixins
•C3
 Future Media & Technology    BBC MMIX
Four Decades of Pain

•Code smell
 –In the language!




 Future Media & Technology    BBC MMIX
B:: Object Hierarchy




Future Media & Technology    BBC MMIX
A Closer Look




Future Media & Technology       BBC MMIX
A Closer Look

• Multiple Inheritance




 Future Media & Technology       BBC MMIX
B::PVIV Pseudo-Code

• B::PVIV Internals

 bless => {
   pv => 'three',
   iv => 3,
 } => 'B::PVIV';

 Future Media & Technology    BBC MMIX
Printing Numbers?
• Perl
 my $number = 3;
 $number   += 2;
 print "I have $number apples";

• Java
 int number = 3;
 number    += 2;
 System.out.println(
   "I have " + number + " apples"
 );



  Future Media & Technology          BBC MMIX
Class Details

• More pseudo-code
 package B::PVIV;
 use parent qw( B::PV B::IV );

 sub B::PV::as_string { $_[0]->{pv} }
 sub B::IV::as_string { $_[0]->{iv} }


• Printing:
 print $pviv->as_string;        # Str
 print $pviv->B::IV::as_string; # Int


  Future Media & Technology              BBC MMIX
Real World Pain




Future Media & Technology      BBC MMIX
Real World Pain




Future Media & Technology      BBC MMIX
Real World Pain




Future Media & Technology      BBC MMIX
Real World Pain




Future Media & Technology      BBC MMIX
Systems Grow




Future Media & Technology     BBC MMIX
The Problem

• Responsibility
  –Wants larger classes
• Reuse
  –Wants smaller classes



 Future Media & Technology       BBC MMIX
Solution




Decouple!
Future Media & Technology           BBC MMIX
Solutions

• Interfaces
   –Reimplementing




 Future Media & Technology          BBC MMIX
Solutions

• Delegation
  –Scaffolding
  –Communication




 Future Media & Technology          BBC MMIX
Solutions

• Mixins
  –Ordering




 Future Media & Technology          BBC MMIX
PracticalJoke

• Needs:
  –explode()
  –fuse()




 Future Media & Technology    BBC MMIX
Shared Behavior
                   Method       Description


✓        Bomb::fuse()        Deterministic


         Spouse::fuse()      Non-deterministic


         Bomb::explode()     Lethal



✓        Spouse::explode()   Wish it was lethal


Future Media & Technology                          BBC MMIX
Ruby Mixins
  module Bomb
      def explode
          puts "Bomb explode"
      end
      def fuse
          puts "Bomb fuse"
      end
  end

  module Spouse
      def explode
          puts "Spouse explode"
      end
      def fuse
          puts "Spouse fuse"
      end
  end



Future Media & Technology          BBC MMIX
Ruby Mixins
    class PracticalJoke
        include Spouse
        include Bomb
    end

    joke = PracticalJoke.new()
    joke.fuse
    joke.explode


Prints out:




  Future Media & Technology        BBC MMIX
Ruby Mixins
    class PracticalJoke
        include Spouse
        include Bomb
    end

    joke = PracticalJoke.new()
    joke.fuse
    joke.explode


Prints out:
    Bomb fuse
    Bomb explode




  Future Media & Technology        BBC MMIX
Moose Roles
{
    package Bomb;
    use Moose::Role;
    sub fuse    { say "Bomb explode" }
    sub explode { say "Bomb fuse" }
}
{
    package Spouse;
    use Moose::Role;
    sub fuse    { say "Spouse explode" }
    sub explode { say "Spouse fuse" }
}



    Future Media & Technology               BBC MMIX
Moose Roles
      {
          package PracticalJoke;
          use Moose;
          with qw(Bomb Spouse);
      }
      my $joke = PracticalJoke->new();
      $joke->fuse();
      $joke->explode();

Prints out:




  Future Media & Technology               BBC MMIX
Moose Roles
      {
          package PracticalJoke;
          use Moose;
          with qw(Bomb Spouse);
      }
      my $joke = PracticalJoke->new();
      $joke->fuse();
      $joke->explode();

Prints out:
    Due to a method name conflict in roles 'Bomb' and
    'Spouse', the method 'fuse' must be implemented
    or excluded by 'PracticalJoke'




  Future Media & Technology                          BBC MMIX
Moose Roles
    {
        package PracticalJoke;
        use Moose;
        with 'Bomb'   => { excludes => 'explode' },
             'Spouse' => { excludes => 'fuse' };
    }
    my $joke = PracticalJoke->new();
    $joke->fuse();
    $joke->explode();

Prints out:
    Spouse fuse
    Bomb explode




  Future Media & Technology                            BBC MMIX
Moose Roles
  package PracticalJoke;
  use Moose;
  with 'Bomb'   => { excludes    => 'explode' },
       'Spouse' => { excludes    => 'fuse',
                      alias      =>
                        { fuse   => 'random_fuse' }
                   };


And in your actual code:
   $joke->fuse(14);      # timed fuse
   # or
   $joke->random_fuse(); # who knows?




 Future Media & Technology                             BBC MMIX
Role Example
  package Does::Serialize::YAML
  use Moose::Role;
  use YAML::Syck;

  requires 'as_hash';

  sub serialize {
      my $self = shift;
      return Dump($self->as_hash);
  }

  1;


And in your actual code:
  package My::Object;
  use Moose;
  with 'Does::Serialize::YAML';




 Future Media & Technology            BBC MMIX
Back To Work




Future Media & Technology       BBC MMIX
Work + Roles




Future Media & Technology       BBC MMIX
Work + Roles



package Country;
use Moose;
extends "My::ResultSource";
with qw(DoesStatic DoesAuditing);




Future Media & Technology       BBC MMIX
Old BBC ResultSet Classes




 Future Media & Technology    BBC MMIX
New ResultSet Classes




Future Media & Technology    BBC MMIX
Work + Roles

       package BBC::Programme::Episode;
       use Moose;
       extends 'BBC::ResultSet';
       with qw(
          DoesSearch::Broadcasts
          DoesSearch::Tags
          DoesSearch::Titles
          DoesSearch::Promotions
          DoesIdentifier::Universal
       );



Future Media & Technology              BBC MMIX
Conclusion

• Increases comprehension
• Increases safety
• Decreases complexity




 Future Media & Technology        BBC MMIX

More Related Content

More from Curtis Poe

Rescuing a-legacy-codebase
Rescuing a-legacy-codebaseRescuing a-legacy-codebase
Rescuing a-legacy-codebaseCurtis Poe
 
Perl 6 For Mere Mortals
Perl 6 For Mere MortalsPerl 6 For Mere Mortals
Perl 6 For Mere MortalsCurtis Poe
 
Disappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
Disappearing Managers, YAPC::EU 2014, Bulgaria, KeynoteDisappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
Disappearing Managers, YAPC::EU 2014, Bulgaria, KeynoteCurtis Poe
 
How to Fake a Database Design
How to Fake a Database DesignHow to Fake a Database Design
How to Fake a Database DesignCurtis Poe
 
Are Managers An Endangered Species?
Are Managers An Endangered Species?Are Managers An Endangered Species?
Are Managers An Endangered Species?Curtis Poe
 
The Lies We Tell About Software Testing
The Lies We Tell About Software TestingThe Lies We Tell About Software Testing
The Lies We Tell About Software TestingCurtis Poe
 
A/B Testing - What your mother didn't tell you
A/B Testing - What your mother didn't tell youA/B Testing - What your mother didn't tell you
A/B Testing - What your mother didn't tell youCurtis Poe
 
Test::Class::Moose
Test::Class::MooseTest::Class::Moose
Test::Class::MooseCurtis Poe
 
A Whirlwind Tour of Test::Class
A Whirlwind Tour of Test::ClassA Whirlwind Tour of Test::Class
A Whirlwind Tour of Test::ClassCurtis Poe
 
Agile Companies Go P.O.P.
Agile Companies Go P.O.P.Agile Companies Go P.O.P.
Agile Companies Go P.O.P.Curtis Poe
 
Testing With Test::Class
Testing With Test::ClassTesting With Test::Class
Testing With Test::ClassCurtis Poe
 
Logic Progamming in Perl
Logic Progamming in PerlLogic Progamming in Perl
Logic Progamming in PerlCurtis Poe
 
Inheritance Versus Roles - The In-Depth Version
Inheritance Versus Roles - The In-Depth VersionInheritance Versus Roles - The In-Depth Version
Inheritance Versus Roles - The In-Depth VersionCurtis Poe
 
Turbo Charged Test Suites
Turbo Charged Test SuitesTurbo Charged Test Suites
Turbo Charged Test SuitesCurtis Poe
 

More from Curtis Poe (15)

Rescuing a-legacy-codebase
Rescuing a-legacy-codebaseRescuing a-legacy-codebase
Rescuing a-legacy-codebase
 
Perl 6 For Mere Mortals
Perl 6 For Mere MortalsPerl 6 For Mere Mortals
Perl 6 For Mere Mortals
 
Disappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
Disappearing Managers, YAPC::EU 2014, Bulgaria, KeynoteDisappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
Disappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
 
How to Fake a Database Design
How to Fake a Database DesignHow to Fake a Database Design
How to Fake a Database Design
 
Are Managers An Endangered Species?
Are Managers An Endangered Species?Are Managers An Endangered Species?
Are Managers An Endangered Species?
 
The Lies We Tell About Software Testing
The Lies We Tell About Software TestingThe Lies We Tell About Software Testing
The Lies We Tell About Software Testing
 
A/B Testing - What your mother didn't tell you
A/B Testing - What your mother didn't tell youA/B Testing - What your mother didn't tell you
A/B Testing - What your mother didn't tell you
 
Test::Class::Moose
Test::Class::MooseTest::Class::Moose
Test::Class::Moose
 
A Whirlwind Tour of Test::Class
A Whirlwind Tour of Test::ClassA Whirlwind Tour of Test::Class
A Whirlwind Tour of Test::Class
 
Agile Companies Go P.O.P.
Agile Companies Go P.O.P.Agile Companies Go P.O.P.
Agile Companies Go P.O.P.
 
Econ101
Econ101Econ101
Econ101
 
Testing With Test::Class
Testing With Test::ClassTesting With Test::Class
Testing With Test::Class
 
Logic Progamming in Perl
Logic Progamming in PerlLogic Progamming in Perl
Logic Progamming in Perl
 
Inheritance Versus Roles - The In-Depth Version
Inheritance Versus Roles - The In-Depth VersionInheritance Versus Roles - The In-Depth Version
Inheritance Versus Roles - The In-Depth Version
 
Turbo Charged Test Suites
Turbo Charged Test SuitesTurbo Charged Test Suites
Turbo Charged Test Suites
 

Recently uploaded

TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...marcuskenyatta275
 
WSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptxWSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptxJennifer Lim
 
The UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, OcadoThe UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, OcadoUXDXConf
 
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdfThe Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdfFIDO Alliance
 
AI presentation and introduction - Retrieval Augmented Generation RAG 101
AI presentation and introduction - Retrieval Augmented Generation RAG 101AI presentation and introduction - Retrieval Augmented Generation RAG 101
AI presentation and introduction - Retrieval Augmented Generation RAG 101vincent683379
 
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdfSimplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdfFIDO Alliance
 
AI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekAI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekCzechDreamin
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutesconfluent
 
Connecting the Dots in Product Design at KAYAK
Connecting the Dots in Product Design at KAYAKConnecting the Dots in Product Design at KAYAK
Connecting the Dots in Product Design at KAYAKUXDXConf
 
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomSalesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomCzechDreamin
 
A Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System StrategyA Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System StrategyUXDXConf
 
Enterprise Knowledge Graphs - Data Summit 2024
Enterprise Knowledge Graphs - Data Summit 2024Enterprise Knowledge Graphs - Data Summit 2024
Enterprise Knowledge Graphs - Data Summit 2024Enterprise Knowledge
 
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...CzechDreamin
 
Optimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityOptimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityScyllaDB
 
THE BEST IPTV in GERMANY for 2024: IPTVreel
THE BEST IPTV in  GERMANY for 2024: IPTVreelTHE BEST IPTV in  GERMANY for 2024: IPTVreel
THE BEST IPTV in GERMANY for 2024: IPTVreelreely ones
 
What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024Stephanie Beckett
 
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdfIntroduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdfFIDO Alliance
 
Google I/O Extended 2024 Warsaw
Google I/O Extended 2024 WarsawGoogle I/O Extended 2024 Warsaw
Google I/O Extended 2024 WarsawGDSC PJATK
 
Top 10 Symfony Development Companies 2024
Top 10 Symfony Development Companies 2024Top 10 Symfony Development Companies 2024
Top 10 Symfony Development Companies 2024TopCSSGallery
 
WebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM PerformanceWebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM PerformanceSamy Fodil
 

Recently uploaded (20)

TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
 
WSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptxWSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptx
 
The UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, OcadoThe UX of Automation by AJ King, Senior UX Researcher, Ocado
The UX of Automation by AJ King, Senior UX Researcher, Ocado
 
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdfThe Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
 
AI presentation and introduction - Retrieval Augmented Generation RAG 101
AI presentation and introduction - Retrieval Augmented Generation RAG 101AI presentation and introduction - Retrieval Augmented Generation RAG 101
AI presentation and introduction - Retrieval Augmented Generation RAG 101
 
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdfSimplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
 
AI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekAI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří Karpíšek
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutes
 
Connecting the Dots in Product Design at KAYAK
Connecting the Dots in Product Design at KAYAKConnecting the Dots in Product Design at KAYAK
Connecting the Dots in Product Design at KAYAK
 
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomSalesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
 
A Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System StrategyA Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System Strategy
 
Enterprise Knowledge Graphs - Data Summit 2024
Enterprise Knowledge Graphs - Data Summit 2024Enterprise Knowledge Graphs - Data Summit 2024
Enterprise Knowledge Graphs - Data Summit 2024
 
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
SOQL 201 for Admins & Developers: Slice & Dice Your Org’s Data With Aggregate...
 
Optimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityOptimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through Observability
 
THE BEST IPTV in GERMANY for 2024: IPTVreel
THE BEST IPTV in  GERMANY for 2024: IPTVreelTHE BEST IPTV in  GERMANY for 2024: IPTVreel
THE BEST IPTV in GERMANY for 2024: IPTVreel
 
What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024
 
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdfIntroduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
 
Google I/O Extended 2024 Warsaw
Google I/O Extended 2024 WarsawGoogle I/O Extended 2024 Warsaw
Google I/O Extended 2024 Warsaw
 
Top 10 Symfony Development Companies 2024
Top 10 Symfony Development Companies 2024Top 10 Symfony Development Companies 2024
Top 10 Symfony Development Companies 2024
 
WebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM PerformanceWebAssembly is Key to Better LLM Performance
WebAssembly is Key to Better LLM Performance
 

Inheritance Versus Roles

  • 1. OO Systems and Roles Curtis “Ovid” Poe Senior Software Engineer Copyright 2009 by Curtis “Ovid” Poe. This presentation is free and you may redistribute it and/or modify it under the terms of the GNU Free Documentation License. Template Copyright 2009 by BBC. Future Media & Technology  BBC MMIX
  • 2. Not a Tutorial • #ovidfail • “How” is easy • “Why” is not Future Media & Technology  BBC MMIX
  • 3. The Problem Domain • 5,613 Brands • 6,755 Series • 386,943 Episodes • 394,540 Versions • 1,106,246 Broadcasts • 1,701,309 On Demands July 2, 2009 Future Media & Technology  BBC MMIX
  • 4. A Brief History of Pain •Simula 67 –Classes –Polymorphism –Encapsulation –Inheritance Future Media & Technology  BBC MMIX
  • 8. Four Decades of Pain •Code smell –In the language! Future Media & Technology  BBC MMIX
  • 9. B:: Object Hierarchy Future Media & Technology  BBC MMIX
  • 10. A Closer Look Future Media & Technology  BBC MMIX
  • 11. A Closer Look • Multiple Inheritance Future Media & Technology  BBC MMIX
  • 12. B::PVIV Pseudo-Code • B::PVIV Internals bless => { pv => 'three', iv => 3, } => 'B::PVIV'; Future Media & Technology  BBC MMIX
  • 13. Printing Numbers? • Perl my $number = 3; $number += 2; print "I have $number apples"; • Java int number = 3; number += 2; System.out.println( "I have " + number + " apples" ); Future Media & Technology  BBC MMIX
  • 14. Class Details • More pseudo-code package B::PVIV; use parent qw( B::PV B::IV ); sub B::PV::as_string { $_[0]->{pv} } sub B::IV::as_string { $_[0]->{iv} } • Printing: print $pviv->as_string; # Str print $pviv->B::IV::as_string; # Int Future Media & Technology  BBC MMIX
  • 15. Real World Pain Future Media & Technology  BBC MMIX
  • 16. Real World Pain Future Media & Technology  BBC MMIX
  • 17. Real World Pain Future Media & Technology  BBC MMIX
  • 18. Real World Pain Future Media & Technology  BBC MMIX
  • 19. Systems Grow Future Media & Technology  BBC MMIX
  • 20. The Problem • Responsibility –Wants larger classes • Reuse –Wants smaller classes Future Media & Technology  BBC MMIX
  • 21. Solution Decouple! Future Media & Technology  BBC MMIX
  • 22. Solutions • Interfaces –Reimplementing Future Media & Technology  BBC MMIX
  • 23. Solutions • Delegation –Scaffolding –Communication Future Media & Technology  BBC MMIX
  • 24. Solutions • Mixins –Ordering Future Media & Technology  BBC MMIX
  • 25. PracticalJoke • Needs: –explode() –fuse() Future Media & Technology  BBC MMIX
  • 26. Shared Behavior Method Description ✓ Bomb::fuse() Deterministic Spouse::fuse() Non-deterministic Bomb::explode() Lethal ✓ Spouse::explode() Wish it was lethal Future Media & Technology  BBC MMIX
  • 27. Ruby Mixins module Bomb def explode puts "Bomb explode" end def fuse puts "Bomb fuse" end end module Spouse def explode puts "Spouse explode" end def fuse puts "Spouse fuse" end end Future Media & Technology  BBC MMIX
  • 28. Ruby Mixins class PracticalJoke include Spouse include Bomb end joke = PracticalJoke.new() joke.fuse joke.explode Prints out: Future Media & Technology  BBC MMIX
  • 29. Ruby Mixins class PracticalJoke include Spouse include Bomb end joke = PracticalJoke.new() joke.fuse joke.explode Prints out: Bomb fuse Bomb explode Future Media & Technology  BBC MMIX
  • 30. Moose Roles { package Bomb; use Moose::Role; sub fuse { say "Bomb explode" } sub explode { say "Bomb fuse" } } { package Spouse; use Moose::Role; sub fuse { say "Spouse explode" } sub explode { say "Spouse fuse" } } Future Media & Technology  BBC MMIX
  • 31. Moose Roles { package PracticalJoke; use Moose; with qw(Bomb Spouse); } my $joke = PracticalJoke->new(); $joke->fuse(); $joke->explode(); Prints out: Future Media & Technology  BBC MMIX
  • 32. Moose Roles { package PracticalJoke; use Moose; with qw(Bomb Spouse); } my $joke = PracticalJoke->new(); $joke->fuse(); $joke->explode(); Prints out: Due to a method name conflict in roles 'Bomb' and 'Spouse', the method 'fuse' must be implemented or excluded by 'PracticalJoke' Future Media & Technology  BBC MMIX
  • 33. Moose Roles { package PracticalJoke; use Moose; with 'Bomb' => { excludes => 'explode' }, 'Spouse' => { excludes => 'fuse' }; } my $joke = PracticalJoke->new(); $joke->fuse(); $joke->explode(); Prints out: Spouse fuse Bomb explode Future Media & Technology  BBC MMIX
  • 34. Moose Roles package PracticalJoke; use Moose; with 'Bomb' => { excludes => 'explode' }, 'Spouse' => { excludes => 'fuse', alias => { fuse => 'random_fuse' } }; And in your actual code: $joke->fuse(14); # timed fuse # or $joke->random_fuse(); # who knows? Future Media & Technology  BBC MMIX
  • 35. Role Example package Does::Serialize::YAML use Moose::Role; use YAML::Syck; requires 'as_hash'; sub serialize { my $self = shift; return Dump($self->as_hash); } 1; And in your actual code: package My::Object; use Moose; with 'Does::Serialize::YAML'; Future Media & Technology  BBC MMIX
  • 36. Back To Work Future Media & Technology  BBC MMIX
  • 37. Work + Roles Future Media & Technology  BBC MMIX
  • 38. Work + Roles package Country; use Moose; extends "My::ResultSource"; with qw(DoesStatic DoesAuditing); Future Media & Technology  BBC MMIX
  • 39. Old BBC ResultSet Classes Future Media & Technology  BBC MMIX
  • 40. New ResultSet Classes Future Media & Technology  BBC MMIX
  • 41. Work + Roles package BBC::Programme::Episode; use Moose; extends 'BBC::ResultSet'; with qw( DoesSearch::Broadcasts DoesSearch::Tags DoesSearch::Titles DoesSearch::Promotions DoesIdentifier::Universal ); Future Media & Technology  BBC MMIX
  • 42. Conclusion • Increases comprehension • Increases safety • Decreases complexity Future Media & Technology  BBC MMIX