簡単なのでやってみませう。
Perlにおけるクラスは、モジュールの概念を拡張したものです。 しかし、今回はモジュールの概念には触れず、直接クラスの作り方、利用の仕方を解説します。
テスティングフレームワークには、Test::MoreやTest::Unitなどがあります。
ここではTest::Moreを使ってテスト用スクリプトTestHello?.plを書きます。 テスト対象のスクリプトは、./OO/Sample/Hello.pmに書くことにします。
#!/usr/bin/perl
#filename: ./TestHello.pl
use strict;
use lib qw(.);
use Test::More tests => 5;
use OO::Sample::Hello;
use_ok('OO::Sample::Hello'); #test 1
my $hello = new OO::Sample::Hello();
can_ok('OO::Sample::Hello', 'say'); #test 2
is($hello->say(), "hello,world!\n"); #tset 3
is($hello->say('hoge'), "hello,hoge!\n"); #test 4
is($hello->say(), "hello,hoge!\n"); #test 5
undef $hello;
OO/Sample/ディレクトリを作り移動し、そこにHello.pmを作って以下のように書きます。
package OO::Sample::Hello; #パッケージ名は、クラスの名前です。
use strict; #別のモジュールを利用する時には、たいていここに書きます。
sub new {
my $this = bless {};
$this->init();
return $this;
}
sub init {
my $this = shift; #重要:メソッドは、第一引数でインスタンスへのリファレンスを受け取ります。
$this->{user_name} = 'world'; #インスタンス変数user_nameの規定値をセットします。
}
sub say {
my $this = shift;
my $arg_user_name = shift; #このメソッドは、引数に名前を受け取ります。これは省略可能です。
#メソッドを利用する人のタイプ量を減らすため、
#新しい名前があれば記憶します。
$this->{user_name} = $arg_user_name if $arg_user_name;
#コンテキスト依存の分岐。値を要求されていればreturn。値が不要な文脈ではprintします。
if (defined(wantarray)) {
return "hello,$this->{user_name}!\n";
} else {
print "hello,$this->{user_name}!\n";
}
}
1; #戻り値。Perlに読み込みの成功を知らせるため。
シェル(あるいはDOS窓)からTestHello?.plを実行してみてください。
perl ./TestHello.pl
何事も無く全てがうまくいけば、あなたの仕事はおしまいです。 仕様どおりにテストを書いて、テストに通ったから、もう確認作業は必要ないのです。
それと、現在のTestHello?.plはOO::Sample::Helloクラスの実装を網羅していますから、 あなたはOO:Sample::Helloの使い方をもう知っているはずです。 覚えてない?じゃあ、スクロールしてもう一度テストを見てくださいね。
どうだったでしょうか? Perlでクラスを書く作業は少々面倒かもしれませんが、使い方は簡単です。 あなたもぜひ、正当な不精のためにオブジェクト指向を取り入れてみましょう。
え、なになに? 「クラスの書き方については分かったけど、 OO::Sample::Helloはあまりにも使い物にならねーよ。」ですって?
スパン(とつじょかるいおとがひびいた。はつげんしゃはうめきごえをあげつつゆかでころがっている。)
そういう好奇心旺盛な方は、このクラスを原型をとどめないほどに改造してみましょう。 前もって登録した名前以外は名前を記憶しないようにしてみるとか、 SOAPを使ってファイアーウォール越しに挨拶できるようにしてみるとか、 Tkを利用してダイアログ上に挨拶を表示してみたりとか、可能性は無限大です。
あ、そうだ。まずテストを書くようにね!