オブジェクト指向入門 オブジェクト指向の背景 ソフトウェア開発の現状

コンピュータ・ネットワーク工学科
3年次必修科目
オブジェクト指向入門
オブジェクト指向の背景
本位田 真一
深澤良彰
鷲崎 弘宜
ソフトウェア開発の現状
• システム規模が大きくなり、トップダウン設計が困難
に
• 仕様変更への対応が大変
• 再利用が思うように進まない
• 分散開発がうまくいかない
• ウィンドウ環境でのソフトウェア開発が増えた
• マルチメディア化などの多様化が進んできた
• ネットワーク上で動作するソフトウェアが増えた
オブジェクト指向の考え方とは
ソフトウェアとは?
• ソフトウェアは実世界のシミュレーション
+
• 実世界を「モノ」と「モノ」との関係と理解
• ソフトウェアを「モノ」と「モノ」との関係で記述
• オブジェクト指向へ
手続き的解釈とオブジェクト指向的解釈
• 意味的乖離の減少を目指している
– システム/プログラムが容易に理解可能に
X
• 堅牢な大規模システムを作るには欠かせない
• それにより再利用性、拡張性も向上する
3
人間の世界
コンピュータの世界
和
オブジェクト指向的
解釈
1
手続き的解釈
public class HelloWorld{
pulic static void
main(String){
System.out.println(“Hello”);
System.out.println(“Wold”);
かけ離れた世界
「もの」「こと」で考える
}
操作:+
引数:3
「機能」「データ」で考える
1
誤った
オブジェクト指向技術の適用
手続き指向
オブジェクト指向
本来持つ
利点が
損なわれる
誤った適用
オブジェクト指向の直観的利点
• 機能中心ではなく、「モノ」中心
変更に対して安定
普通預金開設
当座預金開設
引き出し
開設
普通預金引き出し()
当座預金引き出し()
普通預金開設()
当座預金開設()
普通預金引き出し
正しい適用
普通預金
開設()
引き出し()
当座預金引き出し
当座預金
開設()
引き出し()
• 「モノ」の関係、構造に注目
実世界を自然に表現
• 現実世界の重要な側面の抽出(抽象化)
分析の焦点が明確化
複雑さに挑戦するための
基本手段
構造化プログラミングから
オブジェクト指向プログラミングへ
• 複雑な事柄を関心事ごとに分離して、効率よく表現/管理
• 手段(1): 抽象化
– 複雑な対象から詳細を排除して、本質的・共通なものに単純化
• 手段(2): モジュール化
– 特定の事柄を達成するために必要な部分をまとめあげ
モジュール化
抽象化
複雑な事柄
構造化プログラミングの欠点とオブ
ジェクト指向プログラミング
構造化プログラミング
• 仕組み
– 要素: サブルーチン(関数)、ローカル変数、グローバル変数
– 制御構造: 順次、条件分岐、繰り返し
• 複雑さへの挑戦
– 抽象化: 処理の使い方と実装の分離
– モジュール化: サブルーチンによる処理のモジュール化
• グローバル変数の多用による全体の複雑化
⇒ クラスによる高度モジュール化
• 貧弱な再利用の仕組み
⇒ 継承によるデータ+処理の一括再利用階層
⇒ ポリモーフィズムによる処理利用側の再利用
構造化プログラミング
グローバル変数
グローバル変数
line
line
オブジェクト指向プログラミング
point
point
共通呼び出し
ローカル変数
ローカル変数
ローカル変数
ローカル変数
サブルーチン
サブルーチン
サブルーチン
サブルーチン
paintLine(
paintLine( ))
paintPoint(
paintPoint( ))
line
line
paintLine(
paintLine( ))
moveLine(
moveLine( ))
point
point
paintPoint(
paintPoint( ))
FigureElement
paint()
paint()
Line
Line
Point
Point
2
オブジェクト指向プログラミング
(OOP)の仕組み
• クラス
仕組み1: クラス、オブジェクト
• フィールドとメソッドのモジュール化
• 同種インスタンス(オブジェクト)の大量生産
– 変数(フィールド)とサブルーチン(メソッド)のモジュー
ル化
– 高度な可視化設定によるカプセル化、隠蔽、修正時
影響局所化
– 同種インスタンス(オブジェクト)の大量生産
フィールドp1:
フィールドp1: Point
Point
• コンポジション(インスタンスの合成集約)による全体-部分階
層
フィールドp2:
フィールドp2: Point
Point
• 継承(実装継承)
– クラス定義の共通部分のコピー再利用、差分定義、
親-子階層
クラスLine
実体化 (インスタンスの生成)
line1: Line
メソッドpaint(
メソッドpaint( ))
p1=(999,777)
p1=(999,777)
P2=(70,30)
P2=(70,30)
メソッドmove(
メソッドmove( ))
• ポリモーフィズム(インタフェース継承)
– メソッド利用側の共通化、再利用
P2=(1000,0)
P2=(1000,0)
メソッドpaint(
メソッドpaint( ))
メソッドpaint(
メソッドpaint( ))
メソッドmove(
メソッドmove( ))
メソッドmove(
メソッドmove( ))
例:
犬のポチ、犬のタロー、猫のタマ
• インスタンス
line2: Line
p1=(0,0)
p1=(0,0)
犬のポチ
• エサを「食べる」
メソッド
パラメータ
• 名前
• 種類
• 体重
ポチ
雑種
12kg
タロー
秋田犬
20kg
属性
属性値
タマ
シャム猫
5kg
• 石神井公園を「散歩する」
• 威すと「逃げる」
メソッドを起動
メッセージを送る
クラス
• ポチとタローの違い
属性値
• ある性質をもつインスタンス全体
クラス
関連
• 複数のオブジェクトがメッセージの送受信で全体としての
処理を進めること
• 集約(aggregation):全体と部分という関係
• 委譲(delegation):自分で処理せず、他に任せる
座席区分
値段
空席数
*
航空便
3
仕組み2: 継承、カプセル化
• 可視化設定によるカプセル化、隠蔽、修正時影響局所化
• 継承: クラス定義の共通部分のコピー再利用、差分定義、
親-子階層
カプセル化
• 用意されたメソッドを通してのみ
属性にアクセス
クラス FigureElement
paint )
メソッド
メソッドpaint(
共通部分
メソッドのコピー
クラス Line
非公 開
公開
外部から
のアクセス
クラス Point
フィールド
フィールドp1: Point
• カプセル化によって実現される概念
– 情報隠蔽
– 抽象化
フィールド
フィールドp2: Point
paint ) 差分
メソッド
メソッドmove(
paint )
メソッド paint(
メソッド
move ) 共通部分
メソッドpaint(
継承(単一継承)
情報隠蔽
(スーパークラスとサブクラス)
• 利点
– 利用者側:内部の構造を知る必要がない
• プロとアマとの分離
ペットクラス
– 実装側:利用者に知らせず内部の変更が可
• アルゴリズムの変更
• データ構造の変更
犬クラス 猫クラス
多重継承
継承の使用法
• 拡張のための使用
サブクラスに新たな機能を追加
ブタクラス
イノシシクラス
イノブタクラス
• 限定のための使用
機能の拡張=性質の限定
• 意味の整理
抽象クラス
4
仕組み3: メソッドとポリモーフィズム
抽象クラス
• メッセージ: オブジェクトから他のオブジェクトへの通信
• メソッド: クラスに定義された、オブジェクトが受け取ること
ができるメッセージを定義
• 例: lineX.paint();
2. 投げられたメッセージ から
人間クラス
実行すべきメソッドpaintを選択
山田: Player
1. メッセージ paint
を投げる
lineX: Line
p1=(0,0)
p1=(0,0)
男クラス
P2=(70,30)
P2=(70,30)
女クラス
メソッドpaint
メソッドpaint
3. メソッドpaint
を実行
仕組み3: メソッドとポリモーフィズム
(つづき)
• ポリモーフィズム: メソッド利用側の共通化、再利
用
オブジェクトの世界
クラスの世界
メソッドmove
メソッドmove
再定義
(オーバライド)
多重定義の
特殊な場合
• スーパークラスとサブクラスで
同じ名前のメソッド
: Line
Client
Client
呼び出し
FigureElement
paint(
paint( ))
メソッドpaint()
メソッドpaint()
: Client
Line
Line
Point
Point
・・・
・・・
同じ呼
び出し
• サブクラスに対してメッセージが送られる
: Point
メソッドpaint()
メソッドpaint()
: ・・・
• サブクラスで定義されている方を使用
メソッドpaint()
メソッドpaint()
動的バインディング
多相性(polymorphism、多態性)
• スーパークラスのオブジェクトに対して送る
ることができるメッセージは、そのサブクラ
スのオブジェクトでも受け取れる
• 共通的なメッセージの解釈
クラスX
(アップキャスティングと呼ばれる)
継承
• 動的束縛の必要性
クラスY
(遅延バインディング、動的ディスパッチ)
• コンパイル時には、どのメソッドを呼び出すのかが
決定しない
• コンパイラは、オブジェクトの型情報を利用して、ど
のメソッドを呼び出すのかを求めるコードを生成
• 実行効率の問題
– 呼出し処理にかかる時間
– 最適化ができない
Javaのfinal修飾子
• 安全性
– 何が呼び出されるのかの予測が困難
5
多相性&動的結合の例(1)
• 円、四角、三角、楕円などの「各種図形クラス」
• 抽象クラスとしての「図形クラス」
Shape
draw ( )
erase ( )
Circle
Square
Line
draw ( )
erase ( )
draw ( )
erase ( )
draw ( )
erase ( )
多相性&動的結合の例(2)
Void dostuff ( Shape s )
{
s.erase ( ) ;
// …
s.draw ( ) ;
}
Circle c = new Circle ( ) ;
Square s = new Square ( ) ;
Line l = new Line ( ) ;
dostuff ( c ) ;
dostuff ( s ) ;
dostuff ( l ) ;
サブクラスの情報は何もない
新しいクラスを付加しても影響はない
再利用性
の向上
オブジェクト指向プログラミング
(OOP)の複雑さへの挑戦
OOPからオブジェクト指向分析
/設計へ
• 抽象化
–
–
–
–
カプセル化: クラスの特徴/責任の抽象化
継承: 共通部分のくくり出し/抽象化
ポリモーフィズム: 利用方法の抽象化
コンポジション: 全体構成の抽象化
• モジュール化
– データ構造と処理のモジュール化
– データと処理のセットを、データごとに階層化/分類
従来のシステム開発と
オブジェクト指向システム開発
現実はモノ中心
従来
機能/手続き
中心
発想の転換
機能中心
システム開発
オブジェクト
指向
システム開発結果
実行の
形態
モノ中心
抽象化
オブジェクト指向は総合的な開発手法
• オブジェクト指向は、要求分析から設計、実装、プロセス
までをカバーするソフトウェアシステム開発の総合的技
術
–
–
–
–
–
システム要素をオブジェクトとして擬人化・抽象化
対象システムの機能を、オブジェクト間の相互作用で実現
責務を各オブジェクトに分散配置
(関係する)データと操作を近いところに置く
変更に強いシステムの実現
• オブジェクト指向開発方法論 = 開発プロセス+表記法+
概念
– 開発プロセス: UP, Catalysis, UML Components など
– 表記法: UML で統一
– 概念: オブジェクト抽出の方針、継承/委譲の利用方針など
モノ(データ+手続き)中心
6
オブジェクト指向によるソフトウェア開発
UML=4つの側面、9つの図
システム境界
• オブジェクト指向でソフトウェアを開発するには…
– メッセージ送受の関係
– 繰り返し型(インクリメンタル)開発
• ステートチャート図
• アクティビティ図
• 保守や機能拡張のため
出典: 早稲田大学講義「ソフトウェア工学」 本位田真一, 2005
《プロセス》
《物理的》
《物理的》
《物理的》
《物理的》
クラス図
クラス図
オブジェクト図
オブジェクト図
《プロセス》
《物理的》
《物理的》
ユースケース図
ユースケース図
動的側面
《物理的》
《物理的》
プロセス図
プロセス図
《物理的》
《物理的》
ユースケース記述
ユースケース記述
《物理的》
《物理的》
アクティビティ図
アクティビティ図
《プロセス》
システム
分析
《物理的》
《物理的》
《物理的》
《物理的》
クラス図
クラス図
コラボレーション図
コラボレーション図
《物理的》
《物理的》
《プロセス》
設計
●
請求書
作成
[Printer free] 1.1: Print(file)
支払
未払い
支払済み
ステートチャート図
ステートチャート図
《物理的》
《物理的》
クラス図
クラス図
《物理的》
《物理的》
• 概念モデル
– 対象業務の世界を構成する概念と概念間の関
係を表すモデル
• 要求モデル
[disk full]
《物理的》
《物理的》
オブジェクト指向プログラムソースコード
オブジェクト指向プログラムソースコード
Show
MessageBox
“Disk full”
on screen
◎
Show
MessageBox
“Printing”
on screen
Windows
Handler
(whnd.cpp)
Windows
Handler
(whnd.obj)
座席とは・・・
座席とは・・・
予約とは・・・
予約とは・・・
座席をオンライ
座席をオンライ
ンで予約できる
ンで予約できる
ように・・・
ように・・・
– 顧客がシステムに望む事柄を表すモデル
• 分析モデル
– 実装方法を関知せずに、対象業務についてシ
ステム化する方法を詳細に表すモデル
• 設計モデル
– システム化する事柄と、その実装方法を詳細に
表すモデル
• 実装モデル
実装
CustomerWindow.printAllCustomers()
[free disk space]
シーケンス図
シーケンス図
《プロセス》
:Printer
請求書
廃棄
●
5つのモデル
静的側面
ドメイン分
析
要求分析
[Printer free] print (file)
:PrinterServer
• コンポーネント図
• 配置図
オブジェクト指向開発プロセス
要求
要求
1.2:Store(file)
– 物理図
• コミュニケーションの手段として
:Printer
:Queue
[Printer busy]
1:Print(file)
• 物理側面
• 分析・設計の道具として
Bob’s Home PC:
Computer
Name=“Compaq
DeskPro”
Memory=256
Name:”Bob J.”
Name=“Bob
J.”
Age=32
age=32
– 状態図
– 分析・設計の成果物をどう残すか → UML ダイヤグラム
Computer
Name:String
Memory:
Integer
Bob’s
PCPC:
Bob’sjobJob
PC
Computer
Computer
Name=“Dell
466
Name=“Dell4300”
Memory=512
Bob:Author
Bob:Author
:Computer
• コラボレーション図
• シーケンス図
– シームレスな開発
1..
:PrinterServer
– 相互作用図
• 開発プロセスの特徴
Uses
統計をとる
• 動的側面
– 構造の関係(継承)
《情報》
《情報》
Author
Name:String
Age:Integer 0..1
店員
– クラス図
– オブジェクト図
• オブジェクト間の関係をどうやって決めるか
《情報》
《情報》
貸出をする
ビデオを検索する
• 静的側面
• オブジェクトをどうやって抽出するか
業務状況
業務状況
アクター
– ユースケース図
– オブジェクトの構造をどう決めるか → 分析・設計
機能側面
ユースケース
• 機能側面
– プログラムソースコード、(コンパイル後の)プロ
グラム、プログラムの計算機上の配置
画面から希望
画面から希望
座席を指定す
座席を指定す
ると・・・
ると・・・
CGI経由でScreen
CGI経由でScreen
オブジェクトから
オブジェクトから
Sheetオブジェクトを
Sheetオブジェクトを
select()すると
select()すると
class
class Sheet{
Sheet{
void
void select()
select()
xx == yy ++ 1;
1;
7