アルゴリズムとプログラミング (Algorithms and Programming) 第4回:オブジェクト指向の考え方 オブジェクト指向的な問題解決法とは UML (Unified Modeling Language) オブジェクトの設計図:クラス クラスとインスタンス オブジェクト指向3大原則 継承 カプセル化 ポリモーフィズム 講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
オブジェクト指向とは? 機械中心主義 人間中心主義 対象= オブジェクト これまで(オブジェクト指向以前): コンピュータ(CPU)が扱えるデータ型と演算をまず考え、人間が解決したい問題をそれに合わせて解釈し直し、プログラム言語に変換する。 機械中心主義 オブジェクト指向プログラミングの理想 人間が解決したい問題から、その問題を解くために必要となる概念(対象)を抽出し定義する。問題解決はその“対象“への”操作”に帰着。機械の都合は2の次。 対象= オブジェクト 人間中心主義
問題設定例1:猫をメインキャラクターとするペット育成シミュレーションソフトの開発 この課題では、猫キャラクターが重要な鍵を握る 猫 どんな属性に注目するか 猫 顔デザイン 毛の色 体重 どんな振る舞いをするか 属性=観察すべき特性
猫オブジェクトの定義 猫 属性 操作 オブジェクト = 属性 + 操作 観察すべき特性 独特の振る舞い 顔デザイン 毛の色 体重 属性 (attribute) 観察すべき特性 鳴く() 食べる() 遊ぶ() 操作 (operation) 独特の振る舞い オブジェクト = 属性 + 操作 これらを定義する作業をモデリングという
オブジェクトの設計図=クラス 猫 猫 猫 これらは全てクラス図 クラス名 属性 操作 顔デザイン 顔デザイン 毛の色 毛の色 体重 体重 鳴く() 食べる() 遊ぶ() 操作 これらは全てクラス図
オブジェクトの生成 ミケ:猫 設計図(クラス)の属性と操作に値を与えて 具体化したもの=オブジェクト インスタンス化するという 3つの記法:どれも可 ミケ:猫 オブジェクト名:クラス名 顔デザイン 毛の色:三色 体重:2400g :クラス名 オブジェクト名 オブジェクト図
クラスとオブジェクトの関係 猫 クロ:猫 ミケ:猫 トラ:猫 クラス(設計図) オブジェクト 顔デザイン 毛の色: 体重: クラス(設計図) オブジェクト 属性と操作に 具体的な値を 与えて生成 された実体 クロ:猫 ミケ:猫 トラ:猫 顔デザイン 毛の色:黒色 体重:1500g 顔デザイン 毛の色:三色 体重:2400g 顔デザイン 毛の色:トラ柄 体重:3000g クロ:猫 オブジェクトは猫クラスのインスタンスである
クラスの階層構造 汎化 特化 動物 脊椎動物 スーパークラス 哺乳類 サブクラス 猫 クラス図 オブジェクト図 クロ:猫 ミケ:猫 トラ:猫 一般的 抽象的 脊椎動物 スーパークラス 哺乳類 矢印の向きは 汎化する向き 相対的な階層関係 サブクラス 猫 クラス図 個別的 具体的 オブジェクト図 特化 クロ:猫 ミケ:猫 トラ:猫 顔デザイン 毛の色:黒色 体重:1500g 顔デザイン 毛の色:三色 体重:2400g 顔デザイン 毛の色:トラ柄 体重:3000g
オブジェクト指向の表記法 UML (Unified Modeling Language) : 統一されたモデリングの方法論と表記法 クラス図 統一されたモデリングの方法論と表記法 クラス図 オブジェクト図 ユースケース図 ステートチャート図 シーケンス図 アクティビティ図 コラボレーション図 コンポーネント図 配置図 Java言語と直接の関係はないが オブジェクト指向用語や概念の 標準であり、Java言語にも基本部分が 取り入れられている。 世の中を、これらのチャート図を 用いて表現(モデリング)し、最終段階 でJavaのクラスやオブジェクトの関係 として設計、プログラムを作成し、 問題を解決する。
クラス同士の関係 関連(association) えさをあげる 人間 猫 じゃれる
クラス同士の関係 ロール(role) えさをあげる 人間 猫 飼い主 ペット
クラス同士の関係 多重度 (multiplicity) 人間 猫 自転車 車輪 表記法 0..3 0から3まで 1..* 1以上 表記法 0..3 0から3まで 1..* 1以上 1,5,7 1か5か7 1 1..* 人間 猫 猫から見て飼い主としての人間が1人で あることが保証された状況をモデリング 飼い主は猫を複数飼うことができる 一般に0も許せば → 0..* しかし、家族の複数名が飼い主と見なせる可能性を考慮すれば → 1..* 1 2 自転車 車輪
クラス同士の関係 限定子(qualifier) 1 1 人間 えさをあげる 猫 名前 複数の猫を名前で限定することで、多重度を1対1にできる
クラスが別のクラスで構成 集約(aggregation) ゾウ 動物園 キリン ライオン 部分要素が集まり全体を構成
コンポジション集約(composition) クラスが別のクラスで構成 コンポジション集約(composition) 天板 机 脚 部品だけでは意味をなさない場合
オブジェクト指向3原則:継承 猫クラスは、哺乳類クラスを継承している すべての属性と操作を受け継ぐ スーパークラス 哺乳類 例外無し! 体重 食べる() 母乳で育てる() 例外無し! 矢印の向きは 汎化する向き UML表記 サブクラス 猫 体重 毛の色 哺乳類から継承した属性 猫クラス 独自の属性 省略可 食べる() 母乳で育てる() 鳴く() 遊ぶ() 哺乳類から継承した操作 猫クラス 独自の操作
継承と集約の区別 継承: is-a 関係 集約: has-a 関係 哺乳類 (猫は哺乳類である) (ゾウは動物園である) 犬 猫 人 動物園 キリン ライオン
カプセル化 猫 属性 操作 オブジェクト指向3原則:カプセル化 クラス図 他のクラスの属性や操作と厳格に区別するためのしくみ。 顔デザイン 毛の色 体重 属性 (attribute) カプセル化 鳴く() 食べる() 遊ぶ() 操作 (operation) 他のクラスの属性や操作と厳格に区別するためのしくみ。
カプセル化の実現: 可視性(visibility) 猫 顔デザイン 毛の色 体重 それぞれがどの範囲から見えるかを定義(可視性のレベル) private: 同クラスからのみ参照可能(-) protected: 継承関係にあるクラス からも参照可能(#) public: 全てのクラスから参照可能(+) 属性 鳴く() 食べる() 遊ぶ() 操作
可視性の表記(ー,#,+) 乗り物 飛行機 全てサブクラスへ継承される 飛行機クラスでは、継承していても スピード属性を参照できない。 -スピード 全てサブクラスへ継承される #スピードを変える() #スピードを表示する() 飛行機 飛行機クラスでは、継承していても スピード属性を参照できない。 → スピードを表示する()操作を使う -高度 #離陸する() #着陸する() #高度を表示する()
抽象クラス:オブジェクトを生成できないクラス 乗り物 クラス名をイタリックにすると 抽象クラス -スピード #スピードを変える() #スピードを表示する() 乗り物クラスのインスタンスは 存在しないことが保証される 飛行機 飛行機クラスでは、依然として スピードを表示する()操作は必須 であり、乗り物クラスは使われる。 -高度 #離陸する() #着陸する() #高度を表示する()
オブジェクト指向3原則:ポリモーフィズム (多態性:オブジェクトは1つだが複数の形を持っていること) 乗り物 ジェット機クラスのインスタンスを、乗り物オブジェクトとして扱うことができる。 飛行機 自動車 ジェット機クラスのインスタンスに対する操作を、乗り物に対する操作として記述できる ジェット機 プロペラ機 このような記述の仕方にどんなメリットがあるの? ジェット機は飛行機でもあり、乗り物でもある
操作名は同じだが、実際の操作内容はそれぞれ異なる 乗り物 #動力を始動する() 飛行機 自動車 #動力を始動する() #動力を始動する() ジェット機 プロペラ機 操作名は同じだが、実際の操作内容はそれぞれ異なる #動力を始動する() #動力を始動する()
ジェット機クラスのインスタンスを生成する :ジェット機 このインスタンスを乗り物オブジェクトと見なす (乗り物オブジェクト変数に格納する) :乗り物 変数名:乗り物1 動力を始動する()メッセージを送る この記法は、ジェット機に限らず、プロペラ機にも自動車にも、将来的に追加される乗り物にもそのまま変更なく使える。 乗り物1.動力を始動する() 乗り物オブジェクトの操作が呼び出されるように記述されているが、自動的にジェット機オブジェクトに対する操作が呼び出される 上位概念(スーパークラス)オブジェクトに対する操作として記述しておくと、サブクラスの細かい修正や追加などに対して強いプログラムになる(保守性が高い)
ジェット機クラスのインスタンスを生成する :ジェット機 このインスタンスをジェット機オブジェクト変数に格納する) :ジェット機 変数名:ジェット機1 動力を始動する()メッセージを送る ジェット機1.動力を始動する() この記法では、プロペラ機や自動車、さらには将来的に追加される乗り物に対しては、そのままでは使えない。
オブジェクト指向プログラミングの有効性! ポリモーフィズムのまとめ ポリモーフィズム(polymorphism)の意味: 1つのオブジェクトが複数の形を持つ ← 継承により実現 ポリモーフィズムの活用の仕方: 上位概念(スーパークラス)への操作として表現する(プログラムを記述する) その効果: サブクラスの細かい修正や追加などに対して強い(保守性が高い)プログラムになる オブジェクト指向プログラミングの有効性!
まとめ オブジェクト指向的な問題解決法とは UML (Unified Modeling Language) オブジェクトの設計図:クラス クラスとインスタンス オブジェクト指向3大原則 継承 カプセル化 ポリモーフィズム