オブジェクト編その2-クラス

※この記事を書いているのは未熟なプログラマです。なのでもし間違いがあったとしても「こんな内容の記事書くんじゃない。未熟者めが!」というご意見があったらありがたく頂戴します。よろしくお願いします。

設計図「Class」

クラスとは再利用するために基本となる型の事を指します。といってもピンとこないかもしれませんが、実はほとんどの人間が日常的にクラスの再利用を行っています。

たとえば、A君がB君に対して次の発言をしました。

「昨日買った本面白かった。」

この本というのはほかならぬ「立方体の、紙でできていて、文字がたくさん記述されているもの」のことですが。そしてわざわざ「昨日買った立方体の、紙でできていて、文字がたくさん記述されているもの面白かった」なんて言わないですよね。

本という概念をA君もB君も共通の認識をしているからコミュニケーションが成り立っています。これはプログラムでも同じであらかじめクラスを作成しておくと、そのクラスを再利用することによって最小限の労力でプログラミングを行う事ができます。

では、Perlで実際にクラスと、そのクラスを呼び出すスクリプトを作成してみましょう。
C:\work\example\oop_002.pl というクラスを呼び出すスクリプトを作成してください。

#!C:\Perl\bin\perl
use strict;
use warnings;
use lib 'lib';
use Book;

my $args = {
    name   => '初めてのPerl',
    author => [ 'ランダル・L. シュワルツ', 'トム クリスチャンセン', ],
    price  => 3780,
};

### Book の設計図からオブジェクトを生成します
my $book = Book->new( $args );

$book->speak;

続いてクラスを保存するディレクトリC:\work\libを作成します。


続いて
C:\work\lib\book.pm というモジュールを作成してください。

package Book;
use strict;
use warnings;

sub new {
    my ( $class, $args ) = @_;
    my $self = bless $args, $class;
    return $self;
}

sub speak {
    print 'hi!';
}

1;

それではコマンドプロンプトから実際にperlを実行してみましょう。


Bookというクラスの設計図をC:\work\lib\book.pmに記述しました。このlibというディレクトリ名はほぼ絶対にこの名称にするものと考えて下さい。

C:\work\example\oop_002.pl に 「use lib 'lib';」 という記述があると思いますが、これはクラスの設計図がどのディレクトリに存在しているかを示しています。この場所を指定するのはC:\work\example\oop_002.plから見た場所ではなく、C:\work\example\oop_002.plをどのディレクトリから実行しているかによって判別しています。

もしこのスクリプトをC:\work ではなくC:\work\example で実行すると以下のようにエラーとなります。



ではもう少し解説をしておきましょう。Perlにおけるオブジェクト指向は大きく3つの特徴があります。

  • クラスの設計図を書く
  • クラスにメソッドを書く
  • オブジェクト(インスタンス)を作成するには変数のリファレンスをブレスする。

つまり、もうほとんどPerlオブジェクト指向のプログラムに必要な処理は大体説明済みです。あとは少し説明が足りない部分を補足したいと思います。

C:\work\example\oop_002.pl で最初に行っている処理はコンストラクタ(契約)と呼ばれる処理です。この処理を理解するに、まず次の事を思い出して下さい。

Perlオブジェクト指向プログラムは、変数がメソッドを呼び出せるようにbless(女神の祝福)を行う。

この女神の祝福を行う処理をクラスの設計図に記述します。それがnewメソッドで定義されています。このnewメソッドに祝福したい変数(のリファレンス)を渡します。

ところでC:\work\example\oop_002.plでは引数を一つだけ渡していますが、newメソッドでは2つの引数が渡されています。

これはまだ説明していませんでしたが、アロー演算子( -> ) でメソッドを呼び出すと、第一引数に自分自身を渡します。

C:\work\lib\book.pmを次のように書き換えてみましょう。

package Book;
use strict;
use warnings;
use Data::Dumper;

sub new {
    my ( $class, $args ) = @_;
    print "this class is $class", "\n";
    print Dumper my $self = bless $args, $class;
    return $self;
}

sub speak {
    print 'hi!';
}

実行します。


アロー演算子を使わないで以下の書き方をしても結果は同じです。
C:\work\example\oop_002.plを以下の様に書き換えて下さい。

#!C:\Perl\bin\perl
use strict;
use warnings;
use lib 'lib';
use Book;

my $args = {
    name   => '初めてのPerl',
    author => [ 'ランダル・L. シュワルツ', 'トム クリスチャンセン', ],
    price  => 3780,
};

### Book の設計図からオブジェクトを生成します
#my $book = Book->new( $args );
my $book = Book::new( 'Book', $args );

$book->speak;

お疲れさまでした。
今回はPerlにおけるクラスの設計方法を学びました。

次回はアクセサについて説明します。