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

Post on 10-Jun-2015

2.270 views 2 download

description

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

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

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

尾形 鉄次 (OGATA Tetsuji)

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

自己紹介

• 尾形 鉄次 (OGATA Tetsuji)

• Twitter: @xtetsuji

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

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

テーマ:delegate / よしなに

今回は手短に

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

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

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

• 今回はPerlの話

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

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

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

継承による例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'); # これはダメ ...;}

委譲による例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'); # 良い ...;}

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

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

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

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

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

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

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

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

設計は難しいですね

• 雑なまとめ、LTっぽい

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

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

うわ、ネタ無い…

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

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

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