ソフトウエアの再利用

第二回 ソフトウエアの再利用
オブジェクト指向プログラミング(1)
どうしてOOPは登場したか。
OOPの仕組み
オブジェクト指向プログラミング
1.オブジェクト指向プログラムミングはどうして登
場したか。
2.OOPが持つ構造化言語にない3つの仕組み
3.三大要素ークラスに備わる3つの仕組み
オブジェクト指向プログラミング
黎明期には機械語でプログラムを書いていた。
機械語を使いこなせる、ごく限られたスーパープロ
グラマだけがコンピュータに操れる時代でした。
プログラミング言語の最初の一歩はアセンブラ言語
非効率なプログラミングを改善するためにアセンブ
ラ言語が登場しました。無機質な機械語を人間にわ
かりやすい記号に置き換えて表現します。
オブジェクト指向プログラミング
高級言語の発明でプログラムはより人間に近づいた
・より人間に親しみやすい表現形式でプログラムを
書くために高級言語が発明されました。
FORTRAN(1957年),COBOL(1960年)など
・高級言語の登場により、プログラミング作業の生
産性や品質は大きく向上した。
・それ以上にコンピュータの普及・発展の方が爆発的
に進んだ。プログラムに対するニーズも収まらなか
った。
オブジェクト指向プログラミング
わかりやすさを重視する構造化プログラミング
・オランダ人の学者、ダイクストラ氏によって提唱されまし
た。
・基本的な考え方は「正しく動作するプログラムを作成する
にためには、わかりやすい構造にすることが重要である。
・具体的な方法として、プログラムをわかりづらくしている元
凶であるGOTO文を廃止して、ロジックを順次進行、条件
分岐、繰り返しの3つの構造だけで表現することを提唱し
ました。(基本三構造)
オブジェクト指向プログラミング
(a)順次進行
処理A
処理B
処理C
プログラムに書かれた命令を上か
ら次々に実行させることです。
オブジェクト指向プログラミング
(b)条件分岐
YES
条件
NO
処理A
処理B
条件分岐は何らか
の判定を行い、その
結果によって次の命
令を決めることを指
します。
If文やcase文に値す
る。
オブジェクト指向プログラミング
(c)繰り返し
一定回数またはある条
件に達するまで特定の
命令群を繰り返し実行
することです。
処理A
条件
YES
NO
For文やwhile文に値す
る。
オブジェクト指向プログラミング
・GOTO文の廃止を主張したことから、別名GOTO
レスプログラミングとも呼ばれます。
・プログラムを保守に強くするために工夫されたの
が「サブルーチン」の独立性を高めることです。
独立性を高める方法は、呼び出し側(メインサブ
ルーチン)とサブルーチンで共有する情報を少な
くすることです。
・グローバル変数をいかに減らせるかが全体の保
守性を向上させるために重要しされた。
オブジェクト指向プログラミング
グローバル変数による情報の受け渡し
サブルーチンA
コール
値の設定、参照
グローバル変数
サブルーチンB
コール
サブルーチンC
どのサブルーチンがグローバル変数をどうい
うタイミングで変更したり参照したりしている
のかがわかりずらい。
グローバル変数は、プログラムのどこからで
もアクセスできる可能性があるため、グロー
バル変数を変更する場合は、すべてのロジッ
クを確認する必要が出てきたしまう。
オブジェクト指向プログラミング
ローカル変数、引数の値渡し(CALL by Value)
・ローカル変数
サブルーチンの中だけで使われる変数。
この変数は、サブルーチンに入ったときにつくら
れて、サブルーチンを抜けるときには消える性質
を持ちます。
オブジェクト指向プログラミング
値渡し
サブルーチンに引数として渡す情報を、呼び出し
側が参照している変数を直接使わずに、値をコ
ピーして渡す仕組みです。
この仕組みを使うと、呼び出されたサブルーチン側で
渡された引数の値を変更しても、呼び出す側が
参照している変数に影響を与えることがなくなり
ます。
オブジェクト指向プログラミング
ローカル変数
値渡し
サブルーチンA
コール
ローカル変数はサブルーチン
に入ったときに作られ、抜
けるときに消える
(コピーされる)
引数
ローカル変数
サブルーチンB
コール
引数
ローカル変数
サブルーチンC
値渡し
(コピーされる)
オブジェクト指向プログラミング
進化の方向は保守性と再利用性重視
機械語
アセンブリ言語
高級言語
コンピュータが直接解釈する機械語を
2進数/16進数で記述する。
機械語を記号で記述する。
複数の機械語をまとめた「高級な」文
法で記述する。
構造化言語
基本三構造(GOTOレス)の提供サ
ブルーチンの独立性の強化
オブジェクト指向プログラミング
プログラミング言語の進化
高級言語までの進化
<生産性向上>
命令を簡単に表現するた
めに進化
<保守性向上>
プログラムをわかりやすく
するための新化
<品質向上>
制約をつけて複雑さを避
けるための進化
<再利用促進>
重複ロジックを排除して、
部品化と再利用を促進す
るための進化
構造化言語における進化
命令の「高級化」によ
る表現力の表現力の
向上
基本三構造
GOTOレスプログラミング
サブルーチン
サブルーチンの
独立性強化
オブジェクト指向プログラミング
構造化プログラミングで解決できたことと
残された課題
解決できたこと
GOTO文の乱用によるス
パゲッティコードの回避
共通サブルーチンによる
再利用
残された課題
グローバル変数
貧弱な再利用
オブジェクト指向プログラミング
OOPが持つ構造化言語にはない3つの仕組み
それは、
「クラス」「ポリモーフィズム」「継承」の3つ
OOPの三大要素
オブジェクト指向プログラミング
三大要素1-クラスに備わる3つの仕組み
クラスは「まとめて、隠して、たくさん作る」仕組み
1)サブルーチンと変数を「まとめる」
2)クラスの内部だけで使う変数やサブルーチンを
「隠す」
3)1つのクラスからインスタンスを「たくさん作る」
オブジェクト指向プログラミング
クラスの効能1-まとめる
クラスA
グローバル変数W
グローバル変数X
サブルーチンA
サブルーチンB
サブルーチンC
サブルーチンD
まとめる
クラスB
インスタンス変数W
インスタンス変数X
メソッドA
メソッドC
メソッドB
メソッドD
オブジェクト指向プログラミング
<クラスの効能1:まとめ>
結びつきの強い(複数の)サブルーチンと(複数
の)グローバル変数を1つのクラスに「まとめる」
ことができる。
これにより次のメリットが得られる。
・部品の数が減る
・メソッド(サブルーチン)の名前つけが楽になる。
・メソッド(サブルーチン)が探しやすくなる。
オブジェクト指向プログラミング
クラスの効能2-隠す
クラスA
インスタンス変数W
クラスB
クラスC
インスタンス変数X
インスタンス変数Z
インスタンス変数Y
メソッドA
メソッドD
メソッドG
メソッドB
メソッドE
メソッドH
メソッドC
メソッドF
修正の影響範囲を小さくするため、クラスの外部から使われない変数やメソッドを「隠す」
ことができる。
オブジェクト指向プログラミング
<クラスの効能2:隠す>
クラスに定義した変数とメソッド(サブルーチン)を、他
のクラスから「隠す」ことができる。
これにより、プログラムの保守性悪化の元凶とな
るグローバル変数を使わずにプログラムを書くこ
とが可能となる。
オブジェクト指向プログラミング
クラスの効能3-たくさん作る
クラスA
インスタンス変数
1つのクラスから
複数のインスタンスを
作ることができる
インスタンス
fileNo=1
Open()
Read()
Close()
fileNo
Open()メソッド
Read()メソッド
インスタンス
fileNo=2
Close()メソッド
インスタンス
fileNo=3
Open()
Read()
Close()
Open()
Read()
Close()
クラスを利用する側では、インスタンスを指定してメソッドを呼び出す。
これにより、どのインスタンス変数を処理対象とするかを特定できる。
オブジェクト指向プログラミング
OOPの場合、メソッドの呼び出し方

インスタンスを格納する変数名.メソッド名(引数)
ドット
オブジェクト指向プログラミング
<クラスの効能3:たくさん作る>
いったんクラスとして定義すると、実行時にそこ
からいくつでもインスタンスを作ることができる。
これにより、ファイル、文字列、顧客情報など、同
様の情報を複数同時に扱う処理であっても、そ
のクラス内部のロジックをシンプルにできる。
オブジェクト指向プログラミング
インスタンス変数は「仲間内だけのグローバル変
数」
<インスタンス変数の性質>
1)別のクラスのメソッドからアクセスできないように隠す
ことができる。
2)いったんインスタンスが作られた後は、必要なくなる
までメモリ上に残される。
オブジェクト指向プログラミング
ローカル変数
複数サブルーチンか
らのアクセス
アクセス可能範囲
の限定
存在期間の長さ
変数領域の複製
グローバル変
数
×
(できない)
インスタンス変数
○
(できる)
○
(できる)
○
×
○
(1つのサブルーチンからしかア
クセスできない)
(プログラムのどこからでも
アクセスできる)
(同じクラス内のメソッドから
のみアクセス可能と指定でき
る
×
○
○
(サブルーチン呼び出し時に作
られ、抜けるときに破棄され
る一時的な
(アプリケーションの開始から
終了まで)
×
×
(1時点では1つしか作れな
いq
1変数につけ
(インスタンスが作られてから
必要なくなるまで)
○
オブジェクト指向プログラミング
従来のプログラム構造
グローバル変数a
グローバル変数b
ローカル変数
ローカル変数
サブルーチンw
サブルーチンy
ローカル変数
ローカル変数
サブルーチンx
サブルーチンz
オブジェクト指向プログラミング
オブジェクト指向のプログラム構造
クラスA
クラスB
インスタンス変数a
インスタンス変数b
ローカル変数
ローカル変数
メソッドw
メソッドy
ローカル変数
ローカル変数
メソッドx
メソッドz