Orientação a Objetos Elegante e Eficiente: Brevíssima Introdução ao Moose

Preview:

DESCRIPTION

 

Citation preview

Orientação a ObjetosElegante e Eficiente

[ Brevíssima Introdução ao Moose ]

Breno G. de Oliveira< garu@cpan.org >

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?

Recommended