SlideShare ist ein Scribd-Unternehmen logo
1 von 128
Downloaden Sie, um offline zu lesen
Perl 6 OOP
Was ist OOP ?

Larry
Wall
Du meinst OPP ?
Was ist OOP ?
Position
Out Of Position
OOP
Was ist OOP ?
Lies Das !
Lies Das !
        Object-oriented
     programming ... many
    opinions, theories, and
     even ideologies have
    been formulated on the
      subject. ... Most are
     mutually inconsistent.
OOP
    Klassen / Prototypen
(Multiple) Vererbung / Rollen
     MMD + Delegation
     Typen + Subtypen
  Introspektion / Metaobj.
Seine Meinung
TIMTOWTDI
Alles da in Schönheit
Suche Perfektion
Klasse
Klasse

class
Klasse

class

instanzierbarer Namensraum
Klasse


class module package
Klasse

class Excalibur;

class Babylon;
Klasse

class

Instanzierbarer Namensraum
NR in Klammern

class Excalibur {
   ...
}
Objekt
Objekt

  my $obj =
Klasse.new();
Objekt

  my $obj =
Klasse.new();
Neu Erschaffen
Bestehendes Klonen
Objekt

 my $obj =
$alt.clone();
Objekt

 my $obj =
$alt.clone(...);
Positionale Paramter


clone($pos1, $pos2);
Benannte Parameter


clone( :key('value'),);
Mit Autoquoting


clone( :key<value>,);
Old School Geht Auch


clone( key=>'value',);
Objekt
new & clone

bless blieb
Attribute

   +
Methoden
Klasse
class Spaceship {
   has Int $.speed;
   method stop {
     $.speed = 0
   }
}
Kann Ich auch !
In Perl 5
package Spaceship;
use Moose;
has 'speed' => (
   is => 'ro';
   isa => 'Int';
);
sub stop {
   $self = shift;
   $self->speed = 0;
}
In Perl 5
use MooseX::Declare;
class Spaceship {
   has 'speed' => (
      is => 'ro';
      isa => 'Int';
   );
   method stop {
      $self->speed = 0;
   }
}
Klasse
class Spaceship {
   has Int $.speed;
   method stop {
     $.speed = 0;
   }
}
Attributbenutzung
    P5           P6

$self->speed   $.speed
shift->speed   self.speed
               $!speed
Twigil der
Accessoren
.    öffentlich
!    privat
Twigil der
    Accessoren
    .       öffentlich
    !       privat

has $!speed; # privat
Twigil der
   Accessoren
    .         öffentlich
    !         privat

has $speed;    # auch privat
trusts
trusts
class Hund {
   trusts Katze;
   has $!Knochen;
}
trusts
my $carlo = Hund.new();
my $mine = Katze.new();

$mine!Knochen = 0;
Twigils
.     öffentliche A.
!     private A.
^     pos. auto para.
:     ben. Auto para.
*     globale
?     compiler info
=     POD
~     sublang
Sigils
$    Skalar

@    Array

%    Hash
Sigils
has $.speed;

has @.shuttle;

has %.crew;
Keine Typ Hashref
has $.speed;

has @.shuttle;

has %.crew;
MooseX
use MooseX::Declare;
class Raumschiff {
   has 'speed' => (
      is => 'ro';
      isa => 'Int';
   );
   method stop {
      $self->speed = 0;
   }
}
MooseX
use MooseX::Declare;
class Raumschiff {
   has 'speed' => (
      is => 'rw';
      isa => 'Int';
   );
   method stop {
      $self->speed = 0;
   }
}
Perl 6
class Raumschiff {
    has Int $.speed is rw;
    method stop {
      $.speed = 0;
    }
}
Perl 6
class Raumschiff {
    has Int $.speed is rw = 0;
    method stop {
      $.speed = 0;
    }
}
MooseX
use MooseX::Declare;
class Raumschiff {
   has 'speed' => (
      is => 'rw';
      isa => 'Int';
      default => 0;
   );
   method stop {
      $self->speed = 0;
   }
}
Perl 6 Attribute
kein:
isa default (nur Syntax)
predicate required coerce
reader writer init_arg
clearer builder lazy_build
Hab ich mir ausgedacht!
Perl 6 & Moose


has is
Subtypen
Moose

subtype 'Slogan'
 => as 'Str'
 => where {length $_< 50};
Perl 6

my subset Slogan of Str
   where {$_.chars < 50};
Delegation
Perl 6
class spaceship;
has DateTime $.clock;


$excalibur.clock.now;
Perl 6
class spaceship;
has DateTime $.clock
    handles 'now';

$excalibur.clock.now;
Perl 6
class spaceship;
has DateTime $.clock
    handles 'now';

$excalibur.clock.now; # ==
$excalibur.now;
Moose

has 'clock' => (
   handles => 'now';
);
Moose++, Nicht P6
has 'clock' => (
   handles => {
      now => 'time'
   };
);
Methoden
Methode
class Spaceship;

method stop { … }
Private Methode


method !stop { … }
Methoden

method !stop { … }

submethod go { … }
Methoden
# wird vererbt
method !stop { … }
# nicht erbbar
submethod go { … }
MMD


?
MMD
Multi
Method
Dispatch
Schlüsselworte

only
multi
proto
Schlüsselworte

only #sowieso default
multi # anschaun !
proto # später
MMD
multi method go
 (Coord $place) {}

multi method go
 (Str $cmd) {};
MMD


$excalibur.go('back');
MMD

only #sowieso default
multi # MMD
proto # selber regeln
Vererbung
Vererbung
 Moose    P6

extends => is
MooseX::Declare

class WhiteStar
  extends Spaceship;
Perl 6

class WhiteStar
 is Spaceship;
Mehrfachvererbung

class WhiteStar
is Spaceship is Membari;
Vererbung später

Moose       P6
extends => also is
MooseX::Declare

class WhiteStar;
...
extends Spaceship;
Perl 6

class WhiteStar {
   ...
   also is Spaceship;
Rollen
Klassenhierarchie
Wo kommt die Neue rein?
Rollen
werden nicht vererbt !

 geht nur ins Objekt

 & zur Laufzeit raus
Rollen
 werden vererbt !

wenn in eine Klasse
    gemischt
Rollen
Konflikte werfen Ausnahme
Rollen
Konflikte werfen Ausnahme

Überschreiben nicht global
    wie Ruby Mixins
Rollen
Konflikte werfen Ausnahme

Rollen > Mehrfachvererbung
(dort bleiben Konflikte auch
         unbemerkt)
Rollen
Konflikte werfen Ausnahme

außer wenn Methode leer
Rollen
Konflikte werfen Ausnahme

außer wenn Methode leer

 dann muß überschrieben
    werden (Interface)
Rollen
role Spaceship {
  has Int $.speed;
  method stop {
     $.speed = 0
  }
}
Rollen
role Clock {
  has DateTime $.time;
  method alarm {
    ...
  }
}
Rollen anwenden
 Moose    P6

 with => does
Moose

class WhiteStar
  extends Spaceship
  with Clock;
Perl 6

class WhiteStar
  is Spaceship
  does Clock;
Perl 6

class WhiteStar
  is Spaceship;

also does Clock;
Perl 6
class WhiteStar
  is Spaceship;

also does Clock
     does PlasmaGun;
Laufzeiteinbindung


$excalibur does Clock;
Introspektion
Methoden jedes Objektes
 WHAT short name
 WHICH object ID (type)
 WHO package, long name in str context
 WHERE memory address
 HOW   object of meta class
 WHEN (reserved for events?)
 WHY   (reserved for documentation)
 WHENCE autovivification of closures
Interessanteste
WHAT short name
WHICH object ID (type)
WHO package, long name in str context
WHERE memory address
HOW   object of meta class
WHEN (reserved for events?)
WHY   (reserved for documentation)
WHENCE autovivification of closures
Introspektion

Class.HOW.methods($obj)

Class.^methods()
Metaobjektmethoden
identifier
   name authority version author

description   subject     language

licensed   parents      roles
Immer tiefer


$obj.^methods()[$which].signature
Introspektion
Alles is ein Objekt
Introspektion
  Alles is ein Objekt

„Objekte sind doof“.uc

    (wie in Ruby)
Introspektion
  Alles is ein Objekt
Befehle sind Methoden
Introspektion
  Alles is ein Objekt
Befehle sind Methoden
  (Operatoren auch)
Introspektion
  Alles is ein Objekt
Befehle sind Methoden
  (Operatoren auch)
   MMD ist überall
Introspektion
  Alles is ein Objekt
Befehle sind Methoden
  (Operatoren auch)
   MMD ist überall
 Auch in den Regex
Namenräume

package module

class
Auch 'ne Art Klasse

  package module

  class grammar
Grammatiken
grammar {
  token { … }
  rule { … }
  regex { … }
}
Grammatiken
 Klassen deren
Methoden Regex
 anwenden und
  Matchobjekte
  zurückgeben
Grammatiken

grammar + MMD
= Perl 6 Interna
Lern Mehr
S12: Objekte,S14: Rollen

perl6.org/documentation
http://perlcabal.org/syn/

opt. Präzision & Umfang
Lern Mehr
         Perl 6 Docs

doc.perl6.org/language/objects

optimiert: Kürze & Genauigkeit
Lern Mehr
     Perl 6 Tablets

    tablets.perl6.org

opt.: Hypertext & Umfang
Wann Kommt Perl 6 ?
Thank You

Weitere ähnliche Inhalte

Was ist angesagt?

Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureDr. Christian Betz
 
Source Code Analyse - Ein praktikabler Ansatz
Source Code Analyse - Ein praktikabler AnsatzSource Code Analyse - Ein praktikabler Ansatz
Source Code Analyse - Ein praktikabler AnsatzMarc Ruef
 
An Introduction to Ruby
An Introduction to RubyAn Introduction to Ruby
An Introduction to RubyJonathan Weiss
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...gedoplan
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureSascha Koch
 
Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Sven Efftinge
 
Mehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch SkriptsprachenMehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch Skriptsprachenjlink
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scalathoherr
 
Ruby is Magic - Episode #7: Closures
Ruby is Magic - Episode #7: ClosuresRuby is Magic - Episode #7: Closures
Ruby is Magic - Episode #7: ClosuresDirk Breuer
 
Scala - A Scalable Language
Scala - A Scalable LanguageScala - A Scalable Language
Scala - A Scalable Languagepfleidi
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in GoFrank Müller
 
Designpatterns in Ruby
Designpatterns in RubyDesignpatterns in Ruby
Designpatterns in Rubypfleidi
 
Java Script Ist Anders
Java Script Ist AndersJava Script Ist Anders
Java Script Ist Andersjlink
 
Metaprogrammierung mit Ruby
Metaprogrammierung mit RubyMetaprogrammierung mit Ruby
Metaprogrammierung mit RubyDario Rexin
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7msebel
 
TYPO3 coding guidelines
TYPO3 coding guidelinesTYPO3 coding guidelines
TYPO3 coding guidelinesAlex Kellner
 
Die JSTL Tag-Library
Die JSTL Tag-LibraryDie JSTL Tag-Library
Die JSTL Tag-Librarytutego
 

Was ist angesagt? (20)

Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit Clojure
 
Source Code Analyse - Ein praktikabler Ansatz
Source Code Analyse - Ein praktikabler AnsatzSource Code Analyse - Ein praktikabler Ansatz
Source Code Analyse - Ein praktikabler Ansatz
 
An Introduction to Ruby
An Introduction to RubyAn Introduction to Ruby
An Introduction to Ruby
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
 
Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)Vermisste Sprachfeatures in Java (german)
Vermisste Sprachfeatures in Java (german)
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Mehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch SkriptsprachenMehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch Skriptsprachen
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scala
 
Ruby is Magic - Episode #7: Closures
Ruby is Magic - Episode #7: ClosuresRuby is Magic - Episode #7: Closures
Ruby is Magic - Episode #7: Closures
 
Scala - A Scalable Language
Scala - A Scalable LanguageScala - A Scalable Language
Scala - A Scalable Language
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
 
Designpatterns in Ruby
Designpatterns in RubyDesignpatterns in Ruby
Designpatterns in Ruby
 
Java Script Ist Anders
Java Script Ist AndersJava Script Ist Anders
Java Script Ist Anders
 
Metaprogrammierung mit Ruby
Metaprogrammierung mit RubyMetaprogrammierung mit Ruby
Metaprogrammierung mit Ruby
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7
 
TYPO3 coding guidelines
TYPO3 coding guidelinesTYPO3 coding guidelines
TYPO3 coding guidelines
 
PHP_Codesniffer
PHP_CodesnifferPHP_Codesniffer
PHP_Codesniffer
 
Die JSTL Tag-Library
Die JSTL Tag-LibraryDie JSTL Tag-Library
Die JSTL Tag-Library
 

Andere mochten auch

Complete Programming
Complete ProgrammingComplete Programming
Complete Programminglichtkind
 
Writing Perl 6 Rx
Writing Perl 6 RxWriting Perl 6 Rx
Writing Perl 6 Rxlichtkind
 
Modern wx perl
Modern wx perlModern wx perl
Modern wx perllichtkind
 
(Parameterized) Roles
(Parameterized) Roles(Parameterized) Roles
(Parameterized) Rolessartak
 
P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)lichtkind
 
Learning Perl 6
Learning Perl 6 Learning Perl 6
Learning Perl 6 brian d foy
 

Andere mochten auch (7)

Complete Programming
Complete ProgrammingComplete Programming
Complete Programming
 
Writing Perl 6 Rx
Writing Perl 6 RxWriting Perl 6 Rx
Writing Perl 6 Rx
 
Modern wx perl
Modern wx perlModern wx perl
Modern wx perl
 
(Parameterized) Roles
(Parameterized) Roles(Parameterized) Roles
(Parameterized) Roles
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)
 
Learning Perl 6
Learning Perl 6 Learning Perl 6
Learning Perl 6
 

Ähnlich wie P6oo

Source-Code-Analyse – ein praktikabler Ansatz
Source-Code-Analyse – ein praktikabler AnsatzSource-Code-Analyse – ein praktikabler Ansatz
Source-Code-Analyse – ein praktikabler AnsatzDigicomp Academy AG
 
Objektorientierte Programmierung mit extbase und fluid
Objektorientierte Programmierung mit extbase und fluidObjektorientierte Programmierung mit extbase und fluid
Objektorientierte Programmierung mit extbase und fluidOliver Klee
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershellCreasoft AG
 

Ähnlich wie P6oo (7)

Froscamp2010_moose
Froscamp2010_mooseFroscamp2010_moose
Froscamp2010_moose
 
Source-Code-Analyse – ein praktikabler Ansatz
Source-Code-Analyse – ein praktikabler AnsatzSource-Code-Analyse – ein praktikabler Ansatz
Source-Code-Analyse – ein praktikabler Ansatz
 
Objektorientierte Programmierung mit extbase und fluid
Objektorientierte Programmierung mit extbase und fluidObjektorientierte Programmierung mit extbase und fluid
Objektorientierte Programmierung mit extbase und fluid
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershell
 
Php Schulung
Php SchulungPhp Schulung
Php Schulung
 
PHP: foreach
PHP: foreachPHP: foreach
PHP: foreach
 
Testing tools
Testing toolsTesting tools
Testing tools
 

Mehr von lichtkind

Perl 6 in Context
Perl 6 in ContextPerl 6 in Context
Perl 6 in Contextlichtkind
 
Wx::Perl::Smart
Wx::Perl::SmartWx::Perl::Smart
Wx::Perl::Smartlichtkind
 
Perl 6 Regex und Grammars
Perl 6 Regex und GrammarsPerl 6 Regex und Grammars
Perl 6 Regex und Grammarslichtkind
 
Perl 6 Datastructures
Perl 6 DatastructuresPerl 6 Datastructures
Perl 6 Datastructureslichtkind
 
Perl 6 Datenstrukturen
Perl 6 DatenstrukturenPerl 6 Datenstrukturen
Perl 6 Datenstrukturenlichtkind
 
Document Driven Development
Document Driven DevelopmentDocument Driven Development
Document Driven Developmentlichtkind
 
Bettereditors
BettereditorsBettereditors
Bettereditorslichtkind
 
Was können wir von Rebol lernen?
Was können wir von Rebol lernen?Was können wir von Rebol lernen?
Was können wir von Rebol lernen?lichtkind
 
Perl Testing
Perl TestingPerl Testing
Perl Testinglichtkind
 
Perl in der Wiki
Perl in der WikiPerl in der Wiki
Perl in der Wikilichtkind
 
What is Kephra about?
What is Kephra about?What is Kephra about?
What is Kephra about?lichtkind
 
What we can learn from Rebol?
What we can learn from Rebol?What we can learn from Rebol?
What we can learn from Rebol?lichtkind
 

Mehr von lichtkind (14)

Perl 6 in Context
Perl 6 in ContextPerl 6 in Context
Perl 6 in Context
 
Wx::Perl::Smart
Wx::Perl::SmartWx::Perl::Smart
Wx::Perl::Smart
 
Perl 6 Regex und Grammars
Perl 6 Regex und GrammarsPerl 6 Regex und Grammars
Perl 6 Regex und Grammars
 
Perl 6 Datastructures
Perl 6 DatastructuresPerl 6 Datastructures
Perl 6 Datastructures
 
Perl 6 Datenstrukturen
Perl 6 DatenstrukturenPerl 6 Datenstrukturen
Perl 6 Datenstrukturen
 
Document Driven Development
Document Driven DevelopmentDocument Driven Development
Document Driven Development
 
Bettereditors
BettereditorsBettereditors
Bettereditors
 
Hgit
HgitHgit
Hgit
 
Was können wir von Rebol lernen?
Was können wir von Rebol lernen?Was können wir von Rebol lernen?
Was können wir von Rebol lernen?
 
Neuperl6
Neuperl6Neuperl6
Neuperl6
 
Perl Testing
Perl TestingPerl Testing
Perl Testing
 
Perl in der Wiki
Perl in der WikiPerl in der Wiki
Perl in der Wiki
 
What is Kephra about?
What is Kephra about?What is Kephra about?
What is Kephra about?
 
What we can learn from Rebol?
What we can learn from Rebol?What we can learn from Rebol?
What we can learn from Rebol?
 

P6oo