委譲がいいんじゃないでしょうか #hachiojipm

13
委譲がいいんじゃ ないでしょうか 尾形 鉄次 (OGATA Tetsuji) Twitter: @xtetsuji 2013/9/28 Hachioji.pm#32

description

2013/9/28に行われた Hachioji.pm#32 http://atnd.org/events/43853 でLTしたスライドです。Hachioji.pmなのにネタ成分が少なくて慌てて最後のスライドを入れました。というか今回のテーマを守って真面目にトークしたの、今回は自分だけ?

Transcript of 委譲がいいんじゃないでしょうか #hachiojipm

Page 1: 委譲がいいんじゃないでしょうか #hachiojipm

委譲がいいんじゃないでしょうか

尾形 鉄次 (OGATA Tetsuji)

Twitter: @xtetsuji2013/9/28 Hachioji.pm#32

Page 2: 委譲がいいんじゃないでしょうか #hachiojipm

自己紹介

• 尾形 鉄次 (OGATA Tetsuji)

• Twitter: @xtetsuji

• Blog: http://post.tetsuji.jp/

• 北海道生まれでHokkaido.pmにも良く行く

Page 3: 委譲がいいんじゃないでしょうか #hachiojipm

テーマ:delegate / よしなに

Page 4: 委譲がいいんじゃないでしょうか #hachiojipm

今回は手短に

いつも長々と話してしまって反省しているので

Page 5: 委譲がいいんじゃないでしょうか #hachiojipm

自分自身の継承を想定したクラス以外は継承しない

• 結構当然なことですが、これを守らず安易に継承に頼るモジュールが多い

• 今回はPerlの話

Page 6: 委譲がいいんじゃないでしょうか #hachiojipm

題材• 絶滅危惧種 CGI.pm で (Perl5.20でbye!?)

• こういうコード、内外でよく見ますし私も昔書いたことあります…反省

• 同じようなものでも、Plack::RequestやApache2::RequestRecは、自分自身が継承されることを意図・言及しているはず

Page 7: 委譲がいいんじゃないでしょうか #hachiojipm

継承による例package My::CGI;

use strict;use warnings;

use parent 'CGI';

sub new { my $class = shift; ...; my $self = $class->SUPER::new(@_); return $self;}

sub foobar { my $self = shift; $self->{foobar} = $self->param('foobar'); # これはダメ ...;}

Page 8: 委譲がいいんじゃないでしょうか #hachiojipm

委譲による例package My::CGI;

use strict;use warnings;

sub new { my $class = shift; my $self = bless {}, $class; $self->{cgi} ||= CGI->new; # delegate return $self;}

sub foobar { my $self = shift; $self->{foobar} = $self->cgi->param('foobar'); # 良い ...;}

Page 9: 委譲がいいんじゃないでしょうか #hachiojipm

継承がマズイ理由• 親クラスの設計変更に引きずられる

• 例の様に「ハッシュリファレンスにblessされたもの」と仮定するとかダメ

• 将来的に内部キーが衝突したり、bless

されるデータ構造が変わるかも

Page 10: 委譲がいいんじゃないでしょうか #hachiojipm

委譲を助けるもの• 全てのメソッドをそのまま持ってこれるのは継承の便利なところ

• 委譲でやるなら AUTOLOAD とかか

• ただパフォーマンス的に問題もある

• 実直にメソッド作るのがよさそう

Page 11: 委譲がいいんじゃないでしょうか #hachiojipm

設計は難しいですね

• 雑なまとめ、LTっぽい

• 継承の使い過ぎは色々厳しい

• 多重継承をプラグイン構造の核としているモジュール、結構心折れる

Page 12: 委譲がいいんじゃないでしょうか #hachiojipm

うわ、ネタ無い…

• 普段はApacheをmod_perlでSMTPサーバにしたりmemcachedサーバにしたりしています!よろしく!

• 疎結合最高だー!私が普段作るものは小さい設計のものが多い

Page 13: 委譲がいいんじゃないでしょうか #hachiojipm

ご清聴ありがとうございました