Software Engineering Lecture 5/25

Software Engineering Lecture 5/25

先週の復習

正規表現によるパターンと置換

条件文の条件には以下のような式を書くことができる。
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は積極的に実行時型変換を行うので、この辺りは便利だが注意する必要が ある。特に、裸の$varなどはあいまいさを避けたいのならば使わない方が良い。 しかし、それで良いのならば、積極的に使った方が良い。このあたりは、 その場で選択する。

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の内容と一致
\WWなどによって決まった文字集合と一致
\{特殊記号との一致
()でくくわれたパターンは、それぞれ、$1,$2... に格納される。 これらは、置換パターンの中で使うこともできる。
      s/j980(\d\d)/& = $1/;

patternが実行時に決まることも多い。そういう場合は、peternを eval を使って実行時にコンパイルする方法もある。

問題

last の出力からユーザがどれくらいloginしているかを表す図を 出力するPerl scriptを作成せよ。

オブジェクト指向分析・開発

巨大なプログラムを多数の人により開発する。そのためにはプログ ラムを適切な要素に分割しなければならない。その分割パターンを 調べるのがソフトウェア工学だとともいえる。

  • ソフトウェアライフサイクル

    このモデリングと要求仕様をよりよいものとすることがプログラミング 手法の一つの目標だといえるだろう。

  • 構造化技法
  • オブジェクト指向分析/開発

    UML

    UML (Unified Modeling Language)は、Booch法, OMT法、OOSE法を統一 した分析手法用に開発されたオブジェクト指向分析に用いる図法を 規格化したものである。UML では、以下のような図を用いる。



    概念モデル

    概念モデルは基本的にはデータベースと同じである。つまりオブジ ェクトの間の関係を記述した図である。ただ、 継承関係があるこ とが異なる。


    オブジェクトの間の関係は、

    などが一般的だ。これらをさらに細かく、has-a, part-of などに分ける 手法もあるが、オブジェクトとしての実現という視点から見ると、 オブジェクトの属性(インスタンス変数)に代入されたオブジェクトへの 参照 というだけだと言える。

    オブジェクトの中身を直接いじることなく、オブジェクトIDを 通してオブジェクトにアクセスすることにより、インタフェースと 実装の分離を安全におこなうことができる。しかし、 その分、実行は遅くなる。オブジェクトIDからメッソドを探す という操作が必要だからである。もし、メソッドを呼び出す時に、 そのオブジェクトが何かを指定してやれば、そういうデメリットはない。 C++などは、そういう発想で作られている。

    継承関係は、あるオブジェクトからすべての属性を引き継ぎ、さらに 何んらかの属性をつけ加えることを意味する。実際には、属性だけで なく、 オブジェクトの振る舞いもなんからの形で引き継いでいることを さす。ただし、今の所を、属性以外の条件はそれほど明確ではない。 継承するオブジェクトのプログラム理論的な意味をすべて引き継ぐ という考え方もあるが、それを厳密に行うのは実はかなりやっかい なことだし、実用的でもない。

    問題

    5人で行うカードゲームに関する概念モデルを設計してみよ。

    宿題

    上に出てきた問題の 解答は、 kono@ie.u-ryukyu.ac.jp まで、来週までにメールで送ること。 Subject には、 Software Engineering Lecture 5/25 を付けること。