巨大なプログラムを多数の人により開発する。そのためにはプログ ラムを適切な要素に分割しなければならない。その分割パターンを 調べるのがソフトウェア工学だとともいえる。
このモデリングと要求仕様をよりよいものとすることがプログラミング 手法の一つの目標だといえるだろう。
構造化技法は
このような方法は、以下のような利点ある。
大規模なプログラムでは、変数や手続き名の数は数百以上になる。良く使われる 語彙は500程度と言われているので、必然的に同じ名前を使うか、無意味な識別 名を使う必要に迫られる。一方で、iとかjとかは一時変数として便利なので、 良く使うことが多い。しかし一時変数などは、データフローを持つ構造化技法 にはなじまない。
そこで名前空間というのを考える。名前空間が異なる場合は、そこでは同じ 同じ字面でも異なる名前をさすことになる。名前空間は、パッケージ(Package) または、モジュール(Module)と呼ばれる。C では、static というキーワード によりファイルに局所的な名前を作成することができる。これにより疑似的な 名前空間を作ることができる。
名前空間では、他の名前空間の名前を輸入(import) したり、自分の名前を 公共的なものと宣言する(export)する機能がついていることが多い。しかし、 名前空間と、その中の名前の対でアクセスすることでも十分である。これらの 名前空間はセキュリティなどとからめて使われることも多いが (Java などは そうである)本来は、セキュリティと名前空間の概念は直交している。
Sally Shlaer,Stephen Mellor のObject Lifecycles (邦題:続オブジェクト 指向システム分析オブジェクトライフサイクル 近代科学社 ISBN4-7649-0238-9) をここでは使うことにしよう。ソフトウェア工学の教科書ではコード・ヨードン を使っているが、こちらの方がより詳細な記述になっている。ある意味では 教条的である。コード・ヨードン法は、どちらかというと精神主義的な感じ がある。
情報モデルは基本的にはデータベースと同じである。つまりオブジ
ェクトの間の関係を記述した図である。ただ、オブジェクト( デー
タベースではレコード)にIDがあること、そして継承関係があるこ
とが異なる。
オブジェクトのIDは、オブジェクトへのポインタあるいはユニーク な識別子であり、データベースでのキーと同じ役目を果たす。しか し、オブジェクトのIDは普通はプログラマが直接指定することはな い。
オブジェクトの間の関係は、
オブジェクトの中身を直接いじることなく、オブジェクトIDを 通してオブジェクトにアクセスすることにより、インタフェースと 実装の分離を安全におこなうことができる。しかし、 その分、実行は遅くなる。オブジェクトIDからメッソドを探す という操作が必要だからである。もし、メソッドを呼び出す時に、 そのオブジェクトが何かを指定してやれば、そういうデメリットはない。 C++などは、そういう発想で作られている。
継承関係は、あるオブジェクトからすべての属性を引き継ぎ、さらに
何んらかの属性をつけ加えることを意味する。実際には、属性だけで
なく、 オブジェクトの振る舞いもなんからの形で引き継いでいることを
さす。ただし、今の所を、属性以外の条件はそれほど明確ではない。
継承するオブジェクトのプログラム理論的な意味をすべて引き継ぐ
という考え方もあるが、それを厳密に行うのは実はかなりやっかい
なことだし、実用的でもない。
データベースといっても、オブジェクトには一般的な検索方法は 存在しない。もしデータベースが欲しければ、 それは自分で実装しなくてはならない。(あるいは買ってきてもいいね)
package Socket;
Perlのオブジェクトは、Package とデータを結び付けることによって 作られる。
オブジェクトのデータは、配列と[1,2,3]と連想配列{'a',1,'b',2} を使うこ とができる。これらは、リスト(1,2,3)と違って無名配列(Anonymous Array) 、無名連想配列(Anonymous Hash)と呼 ばれることもある。これらは名前がないので、直接$a{'test'}などという ようには扱えない。実際には、これらは配列への参照であり、以下のように 使う。
$a=[1,2,3,4]; $a->[5]=3; print "@$a, $a->[2]\n"; $b={}; $b->{First}='Cat'; $b->{Second}='Dog'; $b->{Third}='Pig'; foreach $key ( keys %$b) { print "$key is $b->{$key}\n" }
この無名データをそのままオブジェクトの持つ内部構造とすることができる。 これにオブジェクトの操作方法を記述した Package を対応させると Perl のオブジェクトができあがる。この二つを結び付けるのが bless という演算子 だある。
例えば猫のオブジェクトをPerlで記述すると、 cat.pl のようになる。
package Mammal; sub new { my $type = shift; my %params = @_; my $self = {}; $self->{'Name'} = $params{'Name'}; $self->{'Sex'} = $params{'Sex'}; $self->{'Weight'} = $params{'Weight'}; $self->{'Color'} = $params{'Color'}; bless $self, $type; } package Cat; @ISA = qw( Mammal ); sub new { my $type = shift; my %params = @_; my $self = Mammal->new(@_); $self->{'Character'} = $params{'Character'}; bless $self, $type; } # method の書き方 sub miyao { my ($self,$arg) = @_; $self->{Name} = $arg; } sub name_print { my ($self) = @_; print $self->{Name}; print "\n";} # 使い方 $a = Cat->new(Name=> Jackey, Sex=>F); print $a->{Name};print "\n"; $a->name_print;のようになる。@ISA を使うことにより、他のオブジェクトの性質を 引き継ぐことができる。
上に出てきた猫に、methodを付けてみよ。method は package で宣言される subroutine で、インスタンス変数を変更したり、印刷したりする。まず、 猫をたたくと怒るようにしてみよう。そして、怒ると鳴き声が変わるように してみよう。
上に出てきた口座の例に出てくるClassをPerlで記述して見よ。
解答は、
kono@ie.u-ryukyu.ac.jp まで、来週までにメールで送ること。
Subject には、
Software Engineering Lecture 5/19 __ Perlの宿題
を付けること。