2009年12月31日

だいぶ前に作って放置してたんですが、そこそこCPANに上げられる感じにはしてあったので年末の倉庫整理をかねて CPAN にあげました。 http://github.com/yappo/p5-Object-InterfaceType

Goではクラス定義で云々するんじゃなくて、interfaceで定義されてるメソッド群をすべて実装されてたらOKといった感じなんですが、まぁいわゆるduck typingできればおkみたいな感じですね。

Perlの世界では if ($foo->can('bar') && $foo->can('baz')) みたいなコードで duck type可能かを調べるんですが、見た目がごちゃごちゃしがちになるので、Goのinterface type的な感じのものをPerlの世界に持ってきました。

if ($obj->can('read') && $obj->can('seek')  && $obj->can('close')) {
なんてコードを
if ((interface_type [qw/ read seek close /])->($obj)) {
という感じで書き換えられます。

my $is_filehandle = interface_type [qw/ read seek close /];
if ($is_filehandle->($obj)) {
やら
interface_type filehandle =>[qw/ read seek close /];
if (is_filehandle($obj)) {
なんて書き方もできます。

canばっかり呼ばれてるコードって見たこと無いのですが、そういうコードはすっきりとかけるようになるんじゃないでしょうか。

コンセプトは夢の中で思いついて起きて1時間くらいで実装した。

Posted by Yappo at 2009年12月31日 16:21 | TrackBack | Perl
Comments
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。