概念モデルに出てくる箱は基本的にはオブジェクトの集まりを表している。 これがclass(クラス)と呼ばれる。実際には個々のオブジェクトには細かい差が あるが、それをある程度無視すれば、クラスは便利なプログラミングの道具 となる。クラスに属する個々のオブジェクトをinstance(インスタンス)という。 クラスをオブジェクトとして扱うかどうかは個々の言語によるが、概念的には オブジェクトだと考えて良い。
Perlではオブジェクトは、Anonymousデータ、つまり、名前無しでも独立に 存在するデータで表される。オブジェクトの属性は連想配列で表される。
オブジェクトの関係は、Perlでは以下のように表現できる。
have-a |
package Customer; sub new_account { my $self = shift; $self->{'account'} = @_; } package main; $a = Customer->new(); $a->new_account(Account->new()); |
is-a |
package Account; sub new { my $type = shift; my %params = @_; $self->{'Balance'} = $params{'Balance'}; $self->{'Customer'} = $params{'Customer'}; bless $self, $type; } package AccountWithInterest; @ISA = qw( Account ); sub new { my $type = shift; my %params = @_; my $self = Account->new(@_); $self->{'Interest'} = $params{'Interest'}; bless $self, $type; } package main; $a = AccountWithInterest->new('Customer'=>$me); $me->new_account($a); |
Perl/Tk はPerlを使ってX-Windowを操作するオブジェクト指向ライブラリ である。Perl/Tkの例題
use Tk; $top = MainWindow->new(); $account = $top->Text(); $account->pack(); $account->insert('end',"test string"); $account->see('end'); $top->update;
オブジェクト指向プログラミングでは、プログラムの再利用という ことが言われる。これは実際のプログラム技術としては、継承という メカニズムを使って行なわれる。 このメカニズムには、大きく分けて二つの方法がある。一つは、継承できる class は一つしか無いというものであり、もう一つは、複数のclassを継承する ことを許す方法である。
単一継承では、プログラムのコードの共有は単純であり再利用は上位のclass の変更と言う形で行なわれる。個々のメソッドの基本的なものは上位のclass で決めるのが普通である。これを逆に利用して、上位のclassにはわざと実装を 記述しないと言う方法もある。このようなclassを抽象class (abstract class) という。これは、このclassを継承するオブジェクトに必要なプロトコルを 規定していると考えることもできる。 単一継承にはインスタンス変数のオフセットを簡単に決めることができるという 実装上の利点もある。
多重継承では、個々のclassを部品として構成することが多い。必要な 部品を集め、それぞれの機能を利用してプログラムを作りあげる。この 方がコードの再利用率は高くなる。その一方で、それぞれの部品の整合性を 取ることは難しくなる。また、単一継承の場合と異なり、インスタンス 変数のオフセットを単純に決めることができない。また、多重継承は、 インスタンス変数に部品となるオブジェクトを格納しておき、必要な時に、 そのオブジェクトに処理を委託するという方法で実現することもできる。 これは委譲(delegate)と呼ばれる。
多重継承でも抽象クラスを使うことができるが、抽象クラスの役割だけを、 取りだす方法もある。これはインタフェースとかプロトコルと呼ばれることが 多いようである。例えば、単一継承のシステムで、受け入れられるメソッドの 種類だけを記述する記述法を用意して、自分が使う変数に対して、インタフェース を指定するというように使う。
ファイルに対する操作には、block I/O, sequential I/Oがある。Unix では、それらは、write/read と seek によって実現される。また、 これに対してbuffering を使った、fwrite, fread, fgetc, fputc、 そして、入出力をstdioに限定した、getchar, putchar がある。 これらをclass として実現するとしよう。可能な多重継承に よる構成と、単一継承による構成を考えて、それぞれの利点と欠点に ついて考察せよ。
上に出てきたアカウントの例に出てくるClassをWindowに表示するプログラムを
Perl/Tkで記述して見よ。Perl/Tkに関しては、/usr/libdata/perl5/site_perl/Tk
と
Perl/Tkの例題
を参考にすること。
解答は、
kono@ie.u-ryukyu.ac.jp まで、来週までにメールで送ること。
Subject には、
Report on Software Engineering Lecture 6/1
を付けること。