JavaとUMLで学ぶオブジェクト指向の考え方 第1章 オブジェクト指向のコンセプト 2003年6月2日(月) 荒木研究室 山之上 陽二 1 この章のポイント オブジェクトとは何か クラスとは何か オブジェクトとクラスの違い 基本的なオブジェクト指向概念 2 最近のソフトウェア開発 現在も非オブジェクト指向で開発された 多くのレガシーシステムが動作している 新規開発では、オブジェクト指向技術を 採用→オブジェクト指向型開発の増加 Web 3 手続き型プログラミングと オブジェクト指向プログラミング(1) オブジェクト指向の主な特徴 コードの再利用性(第8章で詳説) オブジェクトとは何か データと動作の両方を含む実態 4 手続き型プログラミングと オブジェクト指向プログラミング(2) 手続き型プログラミングの問題 データが手続きから分離され、グローバル (広域)になる データにアクセスするコードを制限できない 関数1 関数2 グローバル データ 関数3 関数4 5 手続き型プログラミングと オブジェクト指向プログラミング(3) オブジェクト指向プログラミング データと動作を結合して一つのエンティティ (entity:実体)にする→カプセル化 例 データ型とそれらを操作するメソッドを保持 オブジェクトのメンバへのアクセスを制限 myInt1, myInt2 setmyInt() getmyInt() Math sum() 6 手続き型プログラミングと オブジェクト指向プログラミング(4) myObject データ メソッド メソッド メソッド メッセージ メソッド メソッド メソッド データ Math オブジェクト間の対話 7 オブジェクト指向プログラミングと 手続き型プログラミングの相異点 手続き型 プログラミング データとデータ操作が 分離されている データ(パケット) クライアント サーバ vs. オブジェクト指向 プログラミング データとデータ操作が 一緒にオブジェクトに 含まれている オブジェクト クライアント サーバ 例:ネットワーク経由で送信されるデータ/オブジェクト 8 オブジェクトとは何か?(1) オブジェクト オブジェクト指向プログラムの構成単位 データと振る舞いで構成 例 会社の従業員を表すオブジェクトを含む 企業システム 9 オブジェクトとは何か?(2) オブジェクトのデータ 属性(attribute) オブジェクトの状態(state:ステート)を表す 例 従業員(Employee)は社会保障番号、生年月日、 性別などの属性を持っている 社会保障番号(socialSecurityNumber) 性別(gender) Employee 生年月日(dateOfBirth) 10 オブジェクトとは何か?(3) オブジェクトの振る舞い メソッド 手続き型言語の関数に相当 メソッドを呼び出すには、メッセージ (message)を送信する 単にメソッドのインターフェイスだけを示してお り、メソッドの実装は示していない 11 オブジェクトとは何か?(4) オブジェクトの振る舞い 例 getSocialSecurityNumber() getGender() Employee getDateOfBirth() メッセージ: getSocialSecurityNumber() calculatePay() Payroll 12 オブジェクトとは何か?(4) オブジェクトの振る舞い 例 getSocialSecurityNumber() getGender() Employee getDateOfBirth() 要求された情報: SocialSecurityNumber calculatePay() Payroll 13 オブジェクトとは何か?(5) クラス図 Employee -socialSecurityNumber:String -gender:boolean -dateOfBirth:Date Payroll +calculatePay:double -pay:double +getSocialSecurityNumber:String +getGender:boolean +getDateOfBirth:Date +getSocialSecurityNumber:void +getGender:void +getDateOfBirth:void 14 オブジェクトとは何か?(6) オブジェクトのインスタンス化 クラス(テンプレート)からオブジェクトを生成 例 参照:John 参照:Mary プログラム空間 プログラム空間 //データ―属性 -socialSecurityNumber; -gender; -dateOfBirth; //データ―属性 -socialSecurityNumber; -gender; -dateOfBirth; //動作―メソッド +getSocialSecurityNumber(){} +getGender(){} +getDateOfBirth(){} +getSocialSecurityNumber(){} +getGender(){} +getDateOfBirth(){} //動作―メソッド +getSocialSecurityNumber(){} +getGender(){} +getDateOfBirth(){} +getSocialSecurityNumber(){} +getGender(){} +getDateOfBirth(){} 15 クラスとは何か?(1) クラスはオブジェクトのテンプレートである 概念 クッキーの抜き型 クラステンプレート: クッキーの抜き型 クッキーの生地 オブジェクト: クッキー 16 クラスとは何か?(2) クラスは高水準のデータ型 定義済みのクラスを使用して、オブジェクトを生成 Int x; Float y; MyClass myObject; クラスの定義 属性 メソッド メッセージ 17 クラスとは何か?(3) クラスの定義 属性 メソッド メッセージ Public class Person{ Public class Payroll{ private String name, address; String name; public String getName(){ return name; } public void setName(String n){ name = n; } Person person = new Person(); public String getAddress(){ return address; } public void setAddress(String adr){ address = adr; } String = person.setName(“Joe”); … String = person.getName(); } } 18 UMLによるクラスのモデル化 Person -name:String -address:String 属性 +getName:String +setName:void +getAddress:String +setAddress:void メソッド Personのクラス図 19 カプセル化(1) カプセル化 インターフェイスだけを公開 詳細な実装は隠蔽 20 カプセル化(2) 実世界のインターフェイス/実装パラダイム 例:発電所 パソコン インターフェイス 発電所 21 カプセル化(3) Javaのインターフェイス 例:整数の2乗を計算するクラス Square public class Square{ //プライベート属性 private int squareValue; -squareValue:int //パブリックインターフェイス public int getSquare(int value){ +getSquare:int -calculateSquare:int squareValue = calculateSquare(value); return squareValue; } //プライベート実装 private int calculateSquare(int value){ return value*value; } } 22 継承(1) 継承(inheritance) クラスの共通点を抽出して再利用 スーパークラスとサブクラス 抽象化 is-a関係 23 継承(2) 例 Mammal -eyeColor:int スーパークラス(親クラス) +getEyeColor:int 抽象化 Dog スーパークラス(親クラス) サブクラス(子クラス) Cat -barkFrequency:int -meowFrequency:int +bark:void +meow:void サブクラス(子クラス) 抽象化 GermanShepherd Poodle サブクラス(子クラス) サブクラス(子クラス) +isGerman:void +isFrench:void 24 継承(3) is-a関係 Shape draw() draw() draw() Circle Star Square 25 ポリモーフィズム(1) ポリモーフィズム 類似したオブジェクトが同じメッセージに対して 異なる方法で応答 継承と密接に関連 オーバーライド 親のメソッドの実装を子のメソッド実装で置き換え る 26 ポリモーフィズム(2) 例 public class Circle extends Shape{ double radius; public abstract class Shape{ public Circle(double r){ private double area; radius = r; public abstract double getArea(); } } public double getArea(){ area = 3.14*(radius*radius); return(area); } }; 27 ポリモーフィズム(3) 例 public class Rectangle extends Shape{ double length; double width; Shape #area:double public Rectangle(double l,double w){ length = l; width = w; +getArea:double Circle Radius:double +Circle: +getArea:double } Rectangle public double getArea(){ length:double Width:double +Rectangle: +getArea:double } }; area = length*width; return(area); 28 コンポジション コンポジション オブジェクトがほかのオブジェクトを含む has-a関係 例 テレビ チューナー ブラウン管 29 まとめ カプセル化 継承 ポリモーフィズム コンポジション 30
© Copyright 2024 ExpyDoc