Accessors: 'yes' or 'no'

1,282 views

Published on

Talk about accessors in Perl world from "Black Perl 2011" workshop http://black-perl.org/bp2011/

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,282
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Accessors: 'yes' or 'no'

  1. 1. Accessors: 'yes' or 'no'?
  2. 2. Программисты любят аксессоры
  3. 3. Почему?
  4. 4. <ul><li>Это красиво </li></ul>$obj ->foo ( 1 ); print $obj ->foo ; $obj ->{ foo } = 1 ; print $obj ->{ foo } ;
  5. 5. <ul><li>Это удобно </li></ul>package MyPackage ; has 'foo' => 42 ; 1 ; package MyPackage ; sub new { my $class = shift ; my $self = bless { @_ }, $class; $self ->{ foo } = 42 ; return $self; } 1 ;
  6. 6. package MyPackage ; has 'foo' => 1 , is => 'ro' ; has 'bar' => 1 , isa => 'Int' ; 1 ; <ul><li>Контроль данных </li></ul>
  7. 7. <ul><li>Меняем логику, не трогаем интерфейс </li></ul>package MyPackage2 ; use base 'MyPackage' ; sub foo { my $self = shift ; croak( &quot;It's not int!&quot; ) if @_ and $_[ 0 ] =~ / ^ d+ $ / ; $self ->SUPER ::foo(@_); } 1 ;
  8. 8. <ul><li>Знакомимся по-ближе </li></ul>
  9. 9. <ul><li>Getter </li></ul>sub get_foo { my $self = shift ; return $self ->{ foo } ; } my $value = $self ->get_foo ;
  10. 10. <ul><li>Getter </li></ul>my $value = $self ->get_foo ; my $value = $self ->{ foo } ;
  11. 11. <ul><li>Setter </li></ul>sub set_foo { my $self = shift ; die 'Not enough arguments for set_foo' unless @_; $self ->{ foo } = shift ; return $self; } $self ->set_foo ( 'bar' );
  12. 12. <ul><li>Getter + Setter </li></ul>sub foo { my $self = shift ; return $self ->{ foo } unless @_; die 'Too much arguments' if @_ > 1 ; $self ->{ foo } = shift ; return $self; } my $value = $self ->foo ; $self ->foo ( 'bar' );
  13. 13. Программисты боятся аксессоров
  14. 14. <ul><li>Скорость выполнения </li></ul>my $value = $self ->foo ; $self ->foo ( 1 ); my $value = $self ->{ foo } ; $self ->{ foo } = 1 ;
  15. 15. <ul><li>Интуитивный интерфейс </li></ul>$self ->foo ( 1 ); # accessor $self ->bar ( 1 ); # method
  16. 16. <ul><li>Интуитивный интерфейс </li></ul>sub bar { my $self = shift ; # ... return rand ($self ->{ foo } ); }
  17. 17. <ul><li>Accessors in the Wild </li></ul>
  18. 18. <ul><li>Class::MethodMaker Object::Tiny Spiffy Class::Spiffy accessors Object::Tiny Rubyish::Attribute </li></ul>
  19. 19. <ul><li>Class::Accessor Class::Accessor::Fast Class::Accessor::Complex Class::Accessor::Constructor Class::Accessor::Classy Class::Accessor::Lite </li></ul>
  20. 20. <ul>Class::XSAccessor </ul>
  21. 21. <ul><li>Moose Mouse Moo Mo M Boose </li></ul>
  22. 22. <ul><li>Plack::Util::Accessor Mojo::Base Rose </li></ul>
  23. 23. <ul><li>Скорость выполнения </li></ul>
  24. 24. <ul><li>XS </li></ul>
  25. 25. <ul><li>Mojo::Base </li></ul><ul><li>Mojo::Base::XS </li></ul>
  26. 26. <ul><li>Ускоряемся </li></ul>
  27. 27. <ul><li>Mojolicious становится быстрее... </li></ul>use Mojo::Base::XS -infect;
  28. 28. <ul><li>… на 20% </li></ul>
  29. 29. cpanm Mojo::Base::XS perl -MMojo::Base::XS=-infect
  30. 30. http://github.com/yko/mojo-base-xs
  31. 31. <ul><li>Стоит ли использовать? </li></ul>
  32. 32. <ul><li>Стоит ли бояться? </li></ul>
  33. 33. <ul><li>Спасибо </li></ul>

×