new Classs or Class->new どっち

昨日はJava的と書いたのだが、よく考えてみるとJavaでこういう書き方をするのはコンストラクタだけだなぁ。何となく思ったので書いておく。

Class instance = new Class();
instance.do();

こう考えてみると、コンストラクタでnew Class、メソッド呼び出しで矢印というのも、あながち変でもないか。(id:naoyaさんによると、Class->new型の人も結構いるらしい。ふむふむ。)

Perl のコンストラクタ呼び出しは

my $instance = Foo::Bar->new;

でも

my $instance = new Foo::Bar;

でもいいんだけど、どっちが好みかという話。よくある議論のひとつですね。なぜ Perl がこの両者の呼び出し方をサポートしているかは TIMTOWTDI、というよりも単に Perlオブジェクト指向シンタックスの実装から来るものだというのは、その実装のされ方を見れば明らかです。(その辺の話は宮川さんのOOPメールマガジンとかEffective Perl (ASCII Addison Wesley Programming Series)あたりを読むとよいかも。)

それで、じゃあどっちで書くのがいいのかという話ですが、どっちでもいいけど僕は個人的には前者。

Java のようにコンストラクタが組み込みで実装されている言語だと、new メソッドが何か特別な関数呼び出しのように思えますが、Perl ではコンストラクタも自分で定義するため、あまり特別なものではないように感じるでしょう。

package Foo::Bar;
use strict;
use warnings;

sub new {
    my $class = shift;
    bless {}, $class;
}

1;

と、いう感じで。(そういう意味では、コンストラクタ組み込み言語の new のような魔法の一行みたいなのは、Perl では bless に相当するでしょうね。)

結局、Perl におけるコンストラクタってのはクラスの中の1メソッドに過ぎません。とはいっても、インスタンスを生成する前に呼び出さなければいけないメソッドです。つまり、 Perl のコンストラクタはクラスメソッド、ということになります。

Java でもクラスメソッドは

Class.method()

と呼び出すわけですし、Perl

Class->method;

と呼び出します。(Class::method でも呼べるけど。)

てなことを考えていくと、new Class より Class->new の方が自然だよなという気がします。あと、インスタンスを使い切りで生成するときは

(new Foo::bar)->method;

よりも、

Foo::bar->new->method;

の方がかっこいいですよね。

コンストラクタが後置な言語は Perl に限ったことではなく Ruby とかもそうですし、他にも色々あると思います。ということで、あくまで個人的には、ですけど、Class->new でインスタンス生成をオススメします。

Effective Perl (ASCII Addison Wesley Programming Series)

Effective Perl (ASCII Addison Wesley Programming Series)