アルゴリズムとプログラミング (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以上 1,5,7 1か5か7 1 猫から見て飼い主としての人間が1人で あることが保証された状況をモデリング しかし、家族の複数名が飼い主と見なせ る可能性を考慮すれば → 1..* 自転車 1 1..* 猫 飼い主は猫を複数飼うことができる 一般に0も許せば → 0..* 2 車輪 クラス同士の関係 限定子(qualifier) 1 人間 1 えさをあげる 名前 複数の猫を名前で限 定することで、多重度 を1対1にできる 猫 クラスが別のクラスで構成 集約(aggregation) ゾウ 動物園 キリン ライオン 部分要素が集まり全体を構成 クラスが別のクラスで構成 コンポジション集約(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大原則 継承 カプセル化 ポリモーフィズム
© Copyright 2024 ExpyDoc