22
Orientação a Objetos Elegante e Eficiente [ Brevíssima Introdução ao Moose ] Breno G. de Oliveira < [email protected] > Eden Cardim

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

  • Upload
    garux

  • View
    1.302

  • Download
    3

Embed Size (px)

DESCRIPTION

 

Citation preview

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

Orientação a ObjetosElegante e Eficiente

[ Brevíssima Introdução ao Moose ]

Breno G. de Oliveira< [email protected] >

Eden Cardim

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

Disclaimer

●Não, não sou o Eden :P

●Não, não sou especialista em OO

(essa é a idéia!)

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

Perl & Orientação a Objetos

●Bare-bones para implementação

●TIMTOWTDI

●Muita digitação, propenso a erros

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

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”

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

Moose :: Exemplo

package Shape;use Moose;

has 'x' => ( is => 'rw' );

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

Moose :: Exemplo

package Shape;use Moose;

has 'x' => (     is      => 'rw',    isa     => 'Int',    default => 0,);

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

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

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

Moose :: usando o exemplo

use Shape;

my $shape = Shape­>new( x => 1);

print $shape­>x;

$shape­>x( 42 );

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

Com Moose

package Shape;use Moose;

has 'x' => (     is      => 'rw',    isa     => 'Int',    default => 0,);

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

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};

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

WTF?!

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

Erm...

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

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};}

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

Pequeno demais?

(talvez dividindo a tela...)

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

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};}

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

Com Moose

package Shape;use Moose;

has 'x' => (     is      => 'rw',    isa     => 'Int',    default => 0,);

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

Muito mais que atributos e açúcar

● Extensões (subclasses)

package Rectangle;use Moose;extends 'Shape';

has 'height' => ( is => 'ro' );

has '+x' => ( default => 42 );

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

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( ... );

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

Mais infomações

Moose::Cookbook

Moose::Manual

● Concepts● Classes● Attributes● Delegation● MethodModifiers● Roles● Types● MooseX● BestPractices● FAQ

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

use Moose

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

use Moose;

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

Obrigado!

Dúvidas?