Orientação a ObjetosElegante e Eficiente
[ Brevíssima Introdução ao Moose ]
Breno G. de Oliveira< [email protected] >
Eden Cardim
Disclaimer
●Não, não sou o Eden :P
●Não, não sou especialista em OO
(essa é a idéia!)
Perl & Orientação a Objetos
●Bare-bones para implementação
●TIMTOWTDI
●Muita digitação, propenso a erros
Moose
● Sistema de Objetos Completo para Perl 5
● Lições de CLOS (Lisp), Smalltalk, Perl 6, ...
● Estável e robusto
● Facilmente extensível (MooseX::*)
● Não é “tudo ou nada”
Moose :: Exemplo
package Shape;use Moose;
has 'x' => ( is => 'rw' );
Moose :: Exemplo
package Shape;use Moose;
has 'x' => ( is => 'rw', isa => 'Int', default => 0,);
O que isso fez?
● Criou uma classe
● Usou 'strict' e 'warnings'
● Adicionou um atributo 'x'
● Fez com que 'x' fosse para leitura e escrita
● Exigiu que o tipo de 'x' seja 'Int'
● Caso 'x' não seja definido, seu valor é 0
Moose :: usando o exemplo
use Shape;
my $shape = Shape>new( x => 1);
print $shape>x;
$shape>x( 42 );
Com Moose
package Shape;use Moose;
has 'x' => ( is => 'rw', isa => 'Int', default => 0,);
Sem Moose
package Shape;use strict;use warnings;use Carp qw( confess );
sub new { my $class = shift; my %params = ref $_[0] ? %{ $_[0] } : @_;
$params{x} = 0 unless exists $params{x};
WTF?!
Erm...
Sem Moose (zoom out...)package Shape;use strict;use warnings;use Carp qw( confess );
sub new { my $class = shift; my %params = ref $_[0] ? %{ $_[0] } : @_;
$params{x} = 0 unless exists $params{x};
$class>_validate_x( $params{x} );
return bless \%params, $class;}
sub _validate_x { shift; my $x = shift;
confess 'x must be an integer' unless $x =~ /^[\]?\d+$/;}
sub x { my ($self, $x) = (@_);
if (defined $x) { $self>_validate_x( $x ); $self>{x} = $x; }
return $self>{x};}
Pequeno demais?
(talvez dividindo a tela...)
Sem Moose (2a tentativa)
package Shape;use strict;use warnings;use Carp qw( confess );
sub new { my $class = shift; my %params = ref $_[0] ? %{ $_[0] } : @_ ;
$params{x} = 0 unless exists $params{x};
$class>_validate_x( $params{x} );
return bless \%params, $class;}
sub _validate_x { shift; my $x = shift;
confess 'x must be an integer' unless $x =~ /^[\]?\d+$/;}
sub x { my ($self, $x) = (@_);
if (defined $x) { $self>_validate_x( $x ); $self>{x} = $x; }
return $self>{x};}
Com Moose
package Shape;use Moose;
has 'x' => ( is => 'rw', isa => 'Int', default => 0,);
Muito mais que atributos e açúcar
● Extensões (subclasses)
package Rectangle;use Moose;extends 'Shape';
has 'height' => ( is => 'ro' );
has '+x' => ( default => 42 );
Muito mais que atributos e açúcar
● Meta Classes
Classes que definem Classes!
Shape>meta>name # 'Shape'
Shape>meta>add_method( ... );
Shape>meta>add_attribute( ... );
Shape>meta>remove_method( ... );
Mais infomações
Moose::Cookbook
Moose::Manual
● Concepts● Classes● Attributes● Delegation● MethodModifiers● Roles● Types● MooseX● BestPractices● FAQ
use Moose
use Moose;
Obrigado!
Dúvidas?
Top Related