条件文の条件には以下のような式を書くことができる。
defined($var) | 変数$varが定義されているかどうか | |
$var | $varが定義されていて、0でなく""でもない。 | |
$a == $b | 数値的に等しい | |
$a != $b | 数値的に等しくない | |
$a > $b | 数値的に大きい | |
$a eq $b | 文字列的に等しい | |
$a ne $b | 文字列的に等しくない | |
$a =~ /pattern/ | パターンマッチ | |
$a =~ s/pattern/replace/ | 置換 |
Perl は、きちんとプログラムする時と、さっさとプログラムする場合 との使い分けが可能である。
さっさと使う場合 | 変数の宣言はしない。なるべく短く。 | |
ちゃんとする場合 | Packageを使う。use strict。-w -c などを使う |
Perlの強力な機能の一つは、パターンである。正規表現により、さまざまな パターンを処理し、必要なデータを抜き出したり、置き換えたりすることが できる。
$var =~ /pattern/; $var =~ s/pattern/replace/;などの形で使う。$var を省略するとdefaultの変数 $_ が使われる。これは、 while(<>) {} の形で、行毎に代入される。したがって、
while(<>) { if (/pattern/) { print; } }あるいは、
/pattern/ && print while (<>);で、grep pattern と同じ動作をする。
pattern には以下のような種類がある。
ABCD | そのまま文字列ごとの一致 | |
[a-z] | aからzの文字に一致 | |
[a-z]* | aからzの文字の0個以上の一致 | |
[a-z]+ | aからzの文字の1個以上の一致 | |
. | 任意の一文字(改行以外) | |
(ABCD)+ | ABCDの文字列の1個以上の一致 | |
$var | $varの内容と一致 | |
\W | Wなどによって決まった文字集合と一致 | |
\{ | 特殊記号との一致 |
s/j980(\d\d)/& = $1/;
patternが実行時に決まることも多い。そういう場合は、peternを eval を使って実行時にコンパイルする方法もある。
巨大なプログラムを多数の人により開発する。そのためにはプログ ラムを適切な要素に分割しなければならない。その分割パターンを 調べるのがソフトウェア工学だとともいえる。
このモデリングと要求仕様をよりよいものとすることがプログラミング 手法の一つの目標だといえるだろう。
構造化技法は
このような方法は、以下のような利点ある。
UML (Unified Modeling Language)は、Booch法, OMT法、OOSE法を統一 した分析手法用に開発されたオブジェクト指向分析に用いる図法を 規格化したものである。UML では、以下のような図を用いる。
概念モデルは基本的にはデータベースと同じである。つまりオブジ
ェクトの間の関係を記述した図である。ただ、
継承関係があるこ
とが異なる。
オブジェクトの間の関係は、
オブジェクトの中身を直接いじることなく、オブジェクトIDを 通してオブジェクトにアクセスすることにより、インタフェースと 実装の分離を安全におこなうことができる。しかし、 その分、実行は遅くなる。オブジェクトIDからメッソドを探す という操作が必要だからである。もし、メソッドを呼び出す時に、 そのオブジェクトが何かを指定してやれば、そういうデメリットはない。 C++などは、そういう発想で作られている。
継承関係は、あるオブジェクトからすべての属性を引き継ぎ、さらに 何んらかの属性をつけ加えることを意味する。実際には、属性だけで なく、 オブジェクトの振る舞いもなんからの形で引き継いでいることを さす。ただし、今の所を、属性以外の条件はそれほど明確ではない。 継承するオブジェクトのプログラム理論的な意味をすべて引き継ぐ という考え方もあるが、それを厳密に行うのは実はかなりやっかい なことだし、実用的でもない。
5人で行うカードゲームに関する概念モデルを設計してみよ。
上に出てきた問題の
解答は、
kono@ie.u-ryukyu.ac.jp まで、来週までにメールで送ること。
Subject には、
Software Engineering Lecture 5/25
を付けること。