Perl 6 OO
Co je OOP ?
Larry Wall řika:
Co je OOP ?
Pozice
Out Of Position
OOP
Muž s Tušení
Čti To !
Damian řika: Object-oriented programming ... many opinions, theories, and even ideologies have been formulated on the subject. ... Most are mutually inconsistent.
OOP Třídy / Prototypy (mnohonásobný) Dědictví / Role MMD + Delegace Typy + Podtypy Introspekce / Metaobj.
jeho názor
TIMTOWTDI
vše v kráse
hledání dokonalosti
začína to s třídou
třída class
třída class jmenovy prostor pro instanze
třída
class module package
pro soubor class Excalibur; class Babylon;
třída class jmenovy prostor pro instanze
jm.pros.= zavorky class Excalibur { ... }
soukroma třída my class Excalibur { ... }
anonymní třída my $at = class { ... }
Objekt
Objekt
my $obj = Class.new();
oper. změnily se
my $obj = Class.new();
vytvoř znovu
klonuj existující
objekt
my $obj = $old.clone();
objekt
my $obj = $old.clone(...);
pozicionalny Parametry
clone($pos1, $pos2);
jmenování Parametry
clone( :key('value'),);
s autocitaci clone( :key
,);
stara škola furt pracuje
clone( key=>'value',);
Perl 6 standard clone( :key);
pozor prostor ! clone
(:key);
pozor prostor ! clone
(:key);
Tak to jde! clone\ (:key);
objekt
new & clone bless zůstalo
atributy + metody
kosmická loď
Chyba ? class Raketa { has Int $.rychlost; method stop { $.rychlost = 0 } }
rych. nelze psat ! class Raketa { has Int $.rychlost; method stop { self.rychlost = 0 } }
To je spravně! class Raketa { has Int $.rychlost; method stop { $!rychlost = 0 } }
To umim taky !
Perl 5 package Raketa; use Moose; has 'rychlost' => ( is => 'ro'; isa => 'Int'; ); sub stop { $self = shift; $self->rychlost(0); }
rovněž jaa !
Perl 5 package Raketa; use Moo; has 'rychlost' => ( is => 'ro'; isa => sub { die "…" unless looks_like_number($_[0]); }); sub stop { $self = shift; $self->rychlost(0); }
Perl 5 use MooseX::Declare; class Raketa { has 'rychlost' => ( is => 'ro'; isa => 'Int'; ); method stop { $self->rychlost(0); } }
kratši v P6! class Raketa { has Int $.rychlost; method stop { $rychlost = 0; } }
V Perl 5 use MooseX::Declare; class Raketa { has 'rychlost' => ( is => 'ro'; isa => 'Int'; ); method stop { $self->rychlost(0); } }
V Perl 5 use MooseX::Declare; class Raketa { has 'rychlost' => ( is => 'rw'; isa => 'Int'; ); method stop { $self->rychlost(0); } }
Class class Raketa { has Int $.rychlost is rw;
}
method stop { $.rychlost = 0; }
Class class Raketa { has Int $.rychlost is rw = 0;
}
method stop { $.rychlost = 0; }
Perl 5 use MooseX::Declare; class Raketa { has 'rychlost' => ( is => 'rw'; isa => 'Int'; default => 0; ); method stop { $self->rychlost(0); } }
Perl 5 use Moops; class Raketa { has 'rychlost' => ( is => 'rw'; isa => 'Int'; default => 0; ); method stop { $self->rychlost(0); } }
od krávy use Moops;
class Raketa { has 'rychlost' => ( is => 'rwp'; isa => 'Int'; default => 0; ); method stop { $self->_set_rychlost = 0; } }
Používání Atribut P5
P6
$self->rychlost $.rychlost shift->rychlost self.rychlost $!rychlost
Twigil of Accessors . !
veřejný soukromý
Twigil of Accessors . !
veřejný soukromý
has $!rychlost; # soukromý
Twigil of Accessors . !
veřejný soukromý
has $rychlost; # take soukr.
důvěřuje
trusts class Pes { trusts Kočka; has $!kost; }
trusts class Kočka { method krást { my $carlo = Pes.new(); $carlo!kost = 0; ...
. ! ^ : * ? = ~
Twigils
veřejný access. privátní access. pos. auto para. jménov. auto p. global variabilni kompilátor info POD sublang
Sigils $ @ %
Scalar Array Hash
Sigils has $.rychlost; has @.kyvadla; has %.posádka;
Perl 6 Atribut no: isa default (jenom Syntax) predicate required coerce
reader writer init_arg clearer builder lazy_build
To byly moje nápady!
Perl 6 & Moose has is
Podtyp
Subtypes
Moose subtype 'Slogan' => as 'Str' => where {length $_< 50};
Perl 6 my subset Slogan of Str where {$_.chars < 50};
delegace
Excalibur
Perl 6 class Excalibur; has DateTime $.hodiny; $excalibur = Excalibur.new; $excalibur.hodiny.now;
Perl 6 class Excalibur; has DateTime $.hodiny handles 'now'; $excalibur = Excalibur.new; $excalibur.now;
Moose has 'hodiny' => ( handles => 'now'; );
přejmenovat atrib. has 'hodiny' => ( handles => { now => 'čas' }; );
Perl 6 class Excalibur; has DateTime $.hodiny handles { :now<čas>};
metody
metody method stop { … }
metody method !stop { … }
metody method !stop { … } submethod
metody method !stop { … } submethod #nezdědit
MMD
?
MMD
Multi Method Dispatch
MMD only multi proto
MMD only # implicitní multi # zajímavý ! proto # později
MMD multi method navigovat (Coord $pozice) {} multi method navigovat (Str $cmd) {};
MMD $excalibur.navigovat('zpátky');
MMD only # default anyway multi # MMD proto # own handling
Dědictví
MooseX::Declare class WhiteStar extends Spaceship;
Moops class WhiteStar extends Spaceship;
dědictví
extends => is
Perl 6 class WhiteStar is Spaceship;
mnohonásobný dědictví class WhiteStar is Spaceship is Minbari;
dědictví později
extends => also is
MooseX::Declare class WhiteStar; ... extends Spaceship;
Perl 6 class WhiteStar { ... also is Spaceship;
role(s)
třídni hierarchie
Kam vložit novou?
řešení Role: jednotka znovu použitelne funkčnosty
Proto: Role: jednotka znovu použitelne funkčnosty mimo jakýkoli hierarchie
řešení: Role: jednotka znovu použitelne funkčnosty jinde Trait (neni samý)
řešení: Role: jednotka znovu použitelne funkčnosty Role maji atribut, Traits ne
proto: Role: recyklovat => maly
pamatujte? Role: recyklovat => maly Třída: jmenovy prostor pro instance
jak to řešit Role: recyklovat => maly Třída: kompletní => velky
jak to řešit Role: recyklovat => maly != Třída: kompletní => velky
role možná zdědit ! jestli smíšený do třídy i když program běži
role možná zdědit ! jestli smíšený do třídy i když program běži
role možná zdědit ! jestli smíšený do třídy i když program běži
role konflikt hazi výjimku
role konflikt hazi výjimku Žádný globální přepsani jako v Ruby Mixins
role konflikt hazi výjimku Žádný globální přepsani jako v Ruby Mixins refinements neřešejy to úplně
role konflikt hazi výjimku lepší než mnohonásobne dědictví kde konflikt zůstane
role konflikt hazi výjimku kromě když metoda je prázdna
role konflikt hazi výjimku kromě když metoda je prázdna
potom musiš je přepsat
role konflikt hazi výjimku kromě když metoda je prázdna
potom musiš je přepsat (interface)
role role Spaceship { has Int $.rychlost; method stop { $!rychlost = 0 } }
role role Clock { has DateTime $.hodiny; method alarm { ... } }
použít role
with => does
Použít Role
with => does 5 6
Moose class Excalibur extends WhiteStar with Hodiny;
Moo too !
Moo::Role package Excalibur; extends 'WhiteStar'; with 'Hodiny';
Perl 6 class Excalibur is WhiteStar does Hodiny;
Perl 6 class Excalibur is Whitestar; also does Hodiny;
Perl 6 class Excalibbur is WhiteStar; also does Hodiny does PlasmaGun;
Perl 6 $excalibur does Hodiny;
introspekce
metody WHAT krátke jméno WHICH objekt ID (typ) WHO package, dlouhe jméno v str kont. WHERE adresa v paměťy HOW objekt meta třídy WHEN (rezervovaný pro events?) WHY (rezervovaný pro dokumentace) WHENCE autovivification pro closures
metody WHAT krátke jméno WHICH objekt ID (typ) WHO package, dlouhe jméno v str kont. WHERE adresa v paměťy HOW objekt meta třídy WHEN (rezervovaný pro events?) WHY (rezervovaný pro dokumentace) WHENCE autovivification pro closures
introspekce Class.HOW.methods($obj) Class.^methods()
metody metaobjektu identifier name authority version author description licensed
subject
parents
language roles
hloub & hlouběji $obj.^methods()[$which].signature
introspekce všechno je objekt
introspekce všechno je objekt „objekty jsou blby“.uc
introspekce všechno je objekt příkazy jsou metody
introspekce všechno je objekt příkazy jsou metody (operatori take)
introspekce všechno je objekt příkazy jsou metody (operatori take) MMD je všude
introspekce všechno je objekt příkazy jsou metody (operatori take) MMD je všude rovněž v reg. výrazu
jménovy prostor package module class
take druh objektu package module class grammar
gramatika grammar { token { … } rule { … } regex { … } }
naučit se vice S12: Objekty,S14: Roles perl6.org/documentation http://perlcabal.org/syn/ optimiz.: úplný & přesný
naučit se vice Perl 6 Docs doc.perl6.org/language/objects
kratky & přesný & zřetelný
naučit se vice Perl 6 Tablets tablets.perl6.org Hypertext & volne Učení
Lenošinda
Děkuji