その答えを出すためにオブジェクト指向が生まれた背景から考える
50年前 ~理解しにくく書きにくい時代~
なぜそんな時代があった?
- CPUの性能は低い
- メモリは超高価で性能も低い
⇒ メモリ占有量を減らしステップ数を減らすための「職人芸」的プログラミング
(読みやすさ、作りやすさよりも小さく速いソフトウェアを作ろうとした)
(これは今の組み込み系も同じ)
⇒ 作りにくく理解しにくいソフトウェアが世に溢れた
その結果
- 生産性
- ⇒ 上がらない
- 工程、品質、コスト
- ⇒ 制御できない
しかし
- コンピューターに注目が集まり需要は爆発的に増加
- ⇒ 質・量ともに追いつかず
おまけ ~1000ステップ/1人月~
1人が1ヶ月で開発できるステップ数の平均は1000と言われており、これは30年後も変わらないだろうと言われている
この頃COBOLなど「高級言語」と呼ばれるプログラミング言語が登場し、1ステップあたりの意味を4~5倍に増やしたため、効率も4~5倍上昇
これだけの生産性の向上は最初で最後であろうとも言われている
⇒それでも質・量ともに需要に供給が追いつかなかった
ソフトウェア危機
生産性も品質も上がらず制御も出来ないこの現象をソフトウェア危機と呼んだ
45年前 ~GOTO文からの脱出~
ベームの数学理論
- 連結
- 選択
- 反復
(読みにくく書きにくいGOTO文など使わずとも)どんなプログラムでも上記3つで表現できる
画期的だが当時は誰も相手にせず
なぜ認められなかった?
高級言語が普及しはじめたばかりでifelse
などまだ存在せずGOTO
しかない時代に
-
GOTO
文がなくてもプログラミングはできる -
GOTO
文を使わないプログラミングは理解しやすい
という主張は受け入れられるものではなかった
ダイクストラの書簡
ベームは「GOTO
文がなくてもプログラミングできるよ」という消極的な否定であったのに対し
GOTO
文はスパゲッティ構造を助長するGOTO
文は有害である
と世の中のプログラマー達全てに宣戦布告するかのような衝撃的な内容
大論争を巻き起こした
なぜベームと違い大論争になったのか
- ベーム
- ⇒ 一介の研究家
- ダイクストラ
- ⇒ OSとソフトウェア工学の両分野で巨大な業績を挙げている誰もが知る超有名人
無視できない発言力・説得力があった
大論争へ
大多数の技術者の意見は
言いたいことは分かるが現実問題
GOTO
文無しでどうプログラミングをするのか
中には
goto文がないと、プログラミングは不可能
と唱え猛反対するものも
40年前 ~理解しやすく書きやすい時代へ~
クヌースの論文
ソフトウェア業界のご意見番でもあったクヌースにより
構造化プログラミングとは「
GOTO
文を使わないプログラミング」ではなく、
書きやすく、理解しやすいプログラミングのことである
とされ、10年近く続いた大論争は終結
GOTO
文有害説の肯定派、否定派の両者が合意した、
1.. 構造化プログラミングとは、書きやすく、理解しやすいプログラミングのことである。
2.. 構造化プログラミングは、goto文をなるべく使用せずにプログラミングすることである。
(goto文の使用はエラー処理に限定し、かつ「前方goto文(先へ進むgoto文)」に限る。)
上記を持って構造化プログラミングが誕生
⇒ 処理性能重視から保守性重視へ
近年 ~理解していなくても再利用できる時代へ~
- 小規模再利用
- ⇒ ライブラリ関数や100ステップ程度の小さいサブルーチンをコピーする程度のもの
- 大規模再利用
- ⇒ ソフトウェア全体をコピペして必要個所を変更するもの
小規模は既に大成功を収めている
ソフトウェア業界が求めているのは「大規模再利用」
しかし構造化プログラミングでも「大規模再利用」が得意とは言えない
なぜ?
構造化プログラミングは50年前の職人芸に比べれば理解しやすいが、
自分で書いたプログラムでも3ヶ月経てば他人のものと同じぐらい理解するのは大変という側面がある
大規模再利用のために
再利用を成功させるためのキーは元のプログラムが理解しやすいかどうかにある
理想は理解していなくても再利用できること
(例として言語のライブラリ関数を使うとき内部のデータ構造や処理・制御を知ることなく使っている)
この利点を一般のプログラムにも拡張することが出来たら生産性が大きく向上する
つまり
オブジェクト指向とは理解していなくても再利用できるソフトウェアを開発する技法
オブジェクト指向的ソフト開発
どうすれば中身を理解せずに再利用できるソフトウェアを開発出来るのか
なぜ構造化プログラミングでは同じ事が出来ないのか
ローカル変数とグローバル変数
グローバル変数はプログラム内のあらゆるモジュールからアクセス・変更できるため
どのモジュールとどのように関係しているのかを突き止める事が難しい
そして突き止めるためにはコードを読み解き理解する必要が出てくる
⇒ グローバル変数のあるモジュールは切り離すことが困難(どこからアクセスされているか分からない)
一方でローカル変数は1つのモジュール内部でしか使用できない
⇒ なるべくローカル変数を使うことで情報を隠蔽し、大規模再利用を促す
構造化プログラミングとの比較
- 構造化プログラミング
- ⇒ GOTO文をなるべく使わない
- ⇒ 制御構造に制限を設けてコントロールの流れを綺麗に
- オブジェクト指向プログラミング
- ⇒ グローバル変数を使わない
- ⇒ データ構造にも制限を設けてグローバル変数の弊害を是正し再利用性を向上