Slide 1

Slide 1 text

ООП 1 / 45

Slide 2

Slide 2 text

Содержание 1. Введение 2. Методы 3. Примеры 4. Наследование 5. Method Resolution Order 6. Детали 7. Moose-like 8. ДЗ 2 / 45

Slide 3

Slide 3 text

bless { package Class::Name; #... } my $obj = bless {}, 'Package::Name'; my $obj2 = bless [], '...'; my $scalar = 42; my $obj2 = bless \$scalar, '...'; 3 / 45

Slide 4

Slide 4 text

Содержание 1. Введение 2. Методы 3. Примеры 4. Наследование 5. Method Resolution Order 6. Детали 7. Moose-like 8. ДЗ 4 / 45

Slide 5

Slide 5 text

Методы { package A; sub set_a { my ($self, $value) = @_; $self->{a} = $value; return; } sub get_a { my ($self) = @_; return $self->{a}; } } my $obj = bless {}, 'A'; $obj->set_a(42); print $obj->get_a(); # 42 5 / 45

Slide 6

Slide 6 text

Атрибуты { package A; sub new { my ($class, %params) = @_; return bless \%params, $class; } } my $obj = A->new(a => 1, b => 2); print $obj->{a}; # 1 print $obj->{b}; # 2 6 / 45

Slide 7

Slide 7 text

Методы класса { package A; sub new { my ($class, %params) = @_; return bless \%params, $class; } sub get_a { my ($self) = @_; return $self->{a}; } } my $obj = A->new(a => 42); $obj->get_a(); # 42 7 / 45

Slide 8

Slide 8 text

Методы — еще варианты $obj->A::get_a(); my $class = 'A'; $class->new(); my $method_name = $cond ? 'get_a' : 'get_b'; $obj->$method_name; A::new(); # not the same! 8 / 45

Slide 9

Slide 9 text

Методы — indirect new My::Class(1, 2, 3); My::Class->new(1, 2, 3); foo $obj(123); # $obj->foo(123); use strict; use warnings; Syntax error! exit 0; 9 / 45

Slide 10

Slide 10 text

Методы — WHY!? use strict; use warnings; Syntax error! exit 0; use warnings; use strict; 'error'->Syntax(!exit(0)); 10 / 45

Slide 11

Slide 11 text

can { package A; sub test { return 42; } } if (A->can('test')) { print A->test; } print A->can('test')->('A'); my $obj = bless {}, 'A'; $obj->can('test'); 11 / 45

Slide 12

Slide 12 text

Filehandles open(my $fh, '>', 'path/to/file'); $fh->autoflush(); $fh->print('content'); STDOUT->autoflush(); 12 / 45

Slide 13

Slide 13 text

Пакеты use Some::Package qw(a b c); # Some::Package->import(qw(a b c)); no Some::Package; # Some::Package->unimport; use Some::Package 10.01 # Some::Package->VERSION(10.01); 13 / 45

Slide 14

Slide 14 text

Содержание 1. Введение 2. Методы 3. Примеры 4. Наследование 5. Method Resolution Order 6. Детали 7. Moose-like 8. ДЗ 14 / 45

Slide 15

Slide 15 text

DBI $dbh = DBI->connect( $data_source, $username, $auth, \%attr ); $rv = $dbh->do('DELETE FROM table'); 15 / 45

Slide 16

Slide 16 text

XML::LibXML; use XML::LibXML; my $document = XML::LibXML->load_xml( string => '...' ); my $list = $document->findnodes('...'); # XML::LibXML::NodeList XML::LibXML::Node / \ XML::LibXML::Document XML::LibXML::Element 16 / 45

Slide 17

Slide 17 text

File::Spec use File::Spec; print File::Spec->catfile('a', 'b', 'c'); 17 / 45

Slide 18

Slide 18 text

JSON use JSON; JSON->new->utf8->decode('...'); decode_json '...'; 18 / 45

Slide 19

Slide 19 text

Содержание 1. Введение 2. Методы 3. Примеры 4. Наследование 5. Method Resolution Order 6. Детали 7. Moose-like 8. ДЗ 19 / 45

Slide 20

Slide 20 text

Наследование { package Lynx; BEGIN { push(@ISA, 'Dog', 'Cat') } use base qw(Dog Cat); use parent qw(Dog Cat); } 20 / 45

Slide 21

Slide 21 text

UNIVERSAL $obj->can('method'); $obj->isa('Animal'); Dog->isa('Animal'); $obj->VERSION(5.12); 21 / 45

Slide 22

Slide 22 text

SUPER sub method { my ($self, %params) = @_; $self->SUPER::method(%params); return; } 22 / 45

Slide 23

Slide 23 text

Содержание 1. Введение 2. Методы 3. Примеры 4. Наследование 5. Method Resolution Order 6. Детали 7. Moose-like 8. ДЗ 23 / 45

Slide 24

Slide 24 text

Method Resolution Order Animal | Pet Barkable / \ / Cat Dog \ / Lynx Lynx->method(); qw(Lynx Cat Pet Animal Dog Barkable); 24 / 45

Slide 25

Slide 25 text

use mro; Animal | Pet Barkable / \ / Cat Dog \ / Lynx use mro 'c3'; Lynx->method(); qw(Lynx Cat Dog Pet Animal Barkable); 25 / 45

Slide 26

Slide 26 text

mro — next::method package A; use mro; sub foo { my ($self, $param) = @_; $param++; return $obj->next::method($param); } 26 / 45

Slide 27

Slide 27 text

Содержание 1. Введение 2. Методы 3. Примеры 4. Наследование 5. Method Resolution Order 6. Детали 7. Moose-like 8. ДЗ 27 / 45

Slide 28

Slide 28 text

blessed , ref use JSON: use Scalar::Util 'blessed'; ref JSON->new(); # 'JSON' ref []; # 'ARRAY' ref {}; # 'HASH' ref 0; # '' blessed JSON->new(); # 'JSON' blessed []; # undef blessed {}; # undef blessed 0; # undef 28 / 45

Slide 29

Slide 29 text

AUTOLOAD package A; our $AUTOLOAD; sub new { my ($class, %params) = @_; return bless \%params, $class; } sub AUTOLOAD { print $AUTOLOAD } A->new()->test(); # test A->can('anything'); # :( sub UNIVERSAL::AUTOLOAD {} # Dog->m(); Animal->m(); UNIVERSAL->m(); # Dog->AUTOLOAD(); Animal->AUTOLOAD(); # UNIVERSAL->AUTOLOAD(); 29 / 45

Slide 30

Slide 30 text

DESTROY package A; sub new { my ($class, %params) = @_; return bless \%params, $class; } sub DESTROY { print 'D'; } A->new(); # print 'D' 30 / 45

Slide 31

Slide 31 text

DESTROY — сложности die local AUTOLOAD ${^GLOBAL_PHASE} eq 'DESTRUCT' sub DESTROY { my ($self) = @_; $self->{handle}->close() if $self->{handle}; } 31 / 45

Slide 32

Slide 32 text

Class::Accessor package Foo; use base qw(Class::Accessor); Foo->follow_best_practice; Foo->mk_accessors(qw(name role salary)); use base qw(Class::Accessor::Fast); use base qw(Class::XSAccessor); 32 / 45

Slide 33

Slide 33 text

Содержание 1. Введение 2. Методы 3. Примеры 4. Наследование 5. Method Resolution Order 6. Детали 7. Moose-like 8. ДЗ 33 / 45

Slide 34

Slide 34 text

Moose package Person; use Moose; has first_name => ( is => 'rw', isa => 'Str', ); has last_name => ( is => 'rw', isa => 'Str', ); Person->new( first_name => 'Vadim', last_name => 'Pushtaev', ); 34 / 45

Slide 35

Slide 35 text

Moose — наследование package User; use Moose; extends 'Person'; has password => ( is => 'ro', isa => 'Str', ); 35 / 45

Slide 36

Slide 36 text

Moose — инициализация BUILD has age => (is => 'ro', isa => 'Int'); has is_adult => (is => 'ro', isa => 'Bool'); sub BUILD { my ($self) = @_; $self->is_adult($self->age >= 18); return; } 36 / 45

Slide 37

Slide 37 text

Moose — инициализация default has age => (is => 'ro', isa => 'Int'); has is_adult => ( is => 'ro', isa => 'Bool', lazy => 1, default => sub { my ($self) = @_; return $self->age >= 18; } ); 37 / 45

Slide 38

Slide 38 text

Moose — инициализация builder has age => (is => 'ro', isa => 'Int'); has is_adult => ( is => 'ro', isa => 'Bool', lazy => 1, builder => '_build_is_adult', ); sub _build_is_adult { my ($self) = @_; return $self->age >= 18; } package SuperMan; extends 'Person'; sub _build_is_adult { return 1; } 38 / 45

Slide 39

Slide 39 text

Moose — инициализация Цепочки has [qw( file_name fh file_content xml_document data )] => ( lazy_build => 1, # ... ); sub _build_fh { open(file_name) } sub _build_file_content { read(fh) } sub _build_xml_document { parse(file_content) } sub _build_data { find(xml_document) } 39 / 45

Slide 40

Slide 40 text

Moose — миксины with 'Role::HasPassword'; package Role::HasPassword; use Moose::Role; use Some::Digest; has password => ( is => 'ro', isa => 'Str', ); sub password_digest { my ($self) = @_; return Some::Digest->new($self->password); } 40 / 45

Slide 41

Slide 41 text

Moose — делегирование has doc => ( is => 'ro', isa => 'Item', handles => [qw(read write size)], ); has last_login => ( is => 'rw', isa => 'DateTime', handles => { 'date_of_last_login' => 'date' }, ); { handles => qr/^get_(a|b|c)|set_(a|d|e)$/, handles => 'Role::Name', } 41 / 45

Slide 42

Slide 42 text

Moose — и т. д. before 'is_adult' => sub { shift->recalculate_age } subtype 'ModernDateTime' => as 'DateTime' => where { $_->year() >= 1980 } => message { 'The date is not modern enough' }; has 'valid_dates' => ( is => 'ro', isa => 'ArrayRef[DateTime]', ); package Config; use MooseX::Singleton; # instead of Moose has 'cache_dir' => ( ... ); 42 / 45

Slide 43

Slide 43 text

Moose — аналоги Moose Mouse Moo Mo M 43 / 45

Slide 44

Slide 44 text

Содержание 1. Введение 2. Методы 3. Примеры 4. Наследование 5. Method Resolution Order 6. Детали 7. Moose-like 8. ДЗ 44 / 45

Slide 45

Slide 45 text

ДЗ 5 https://github.com/Nikolo/Technosfera-perl/ /homeworks/iter my $iterator = Local::Iterator::Array->new( array => [1, 2, 3] ); $iterator->next(); # (1, 0); $iterator->next(); # (2, 0); $iterator->next(); # (3, 0); $iterator->next(); # (undef, 1); my $iterator = Local::Iterator::File->new( file => '/tmp/file.txt' ); $iterator->next(); # ('A', 0); $iterator->next(); # ('B', 0); $iterator->all(); # [qw(C D E)] $iterator->next(); # (undef, 1); 45 / 45