Software Engineering Lecture s4
Menu Menu
オブジェクト
オブジェクト指向は、人間が世の中のことを理解する単位である「もの」を中心にプログラムする手法である。オブジェクトって、何?
属性の集りと、その操作の集合 自己識別子があり名指しできる集り 自己識別子は、同じ属性を持っていても等しいとは限らないラッセルは、ものを「ある論理式で表現された記述を満たすもの」とした。これは記述の理論と呼ばれている。これは、データベースのタプルやレコードに近い。
オブジェクトは、それだけではなく、Self Identification (自己識別子/ID)を持つ。同じ名前を持つ人が、同一人物とは限らないように、同じ属性を持つだけでは、同じオブジェクトとは限らない。
オブジェクトは、属性の集りを決めるデータ構造を中心として、操作の集合( API) の定義を行なう。
自己識別子は、参照( C では、*や& )と密接に関係している。C++ では、ポインタを自己識別子として使うが、Objective-C や、Smalltalk/Squeak では、ポインタとは別な番号を用いる。
Squeak
オブジェクト指向言語の原点は、Smalltalk-80 (81年)であり、基本的な要素は、そこにそろっている。Small-talk は型のない言語でもあり、今のスクリプト言語に近い使いやすさを持っている。
問題4.1
Squeak を install し実行してみよ。
Object
オブジェクトのIDは、オブジェクトへのポインタあるいはユニークな識別子であり、データベースでのキーと同じ役目を果たす。しかし、オブジェクトのIDは普通はプログラマが直接指定することはない。オブジェクトの間の関係は、
- そのオブジェクトが他のオブジェクトを知っている / もっている
- そのオブジェクトが他のオブジェクトから参照されている
- お互いに参照しあっている
オブジェクトの中身を直接いじることなく、オブジェクトIDを通してオブジェクトにアクセスすることにより、インタフェースと実装の分離を安全におこなうことができる。しかし、その分、実行は遅くなる。オブジェクトIDからメソッドを探すという操作が必要だからである。もし、メソッドを呼び出す時に、そのオブジェクトが何かを指定してやれば、そういうデメリットはない。C++などは、そういう発想で作られている。
継承関係は、あるオブジェクトからすべての属性を引き継ぎ、さらに何んらかの属性をつけ加えることを意味する。実際には、属性だけでなく、 オブジェクトの振る舞いもなんからの形で引き継いでいることをさす。ただし、今の所を、属性以外の条件はそれほど明確ではない。継承するオブジェクトのプログラム理論的な意味をすべて引き継ぐという考え方もあるが、それを厳密に行うのは実はかなりやっかいなことだし、実用的でもない。
データベースといっても、オブジェクトには一般的な検索方法は存在しない。もしデータベースが欲しければ、それは自分で実装しなくてはならない。(あるいは買ってきてもいいね)
Method in Object
オブジェクトの操作は、メソッドを使う。Java では、オブジェクトに属さない static method というのがあり混乱しやすい。
問題4.2
トランプのカードを表すオブジェクトと、カードの組を表すオブジェクトを作り、ポーカーの役を判定するプログラムを作り、テストをJunit使って記述せよ。