【本・開発】オブジェクト指向でなぜつくるのか -知っておきたいOOP、設計、アジャイル開発の基礎知識-
はじめに
2022年に購入して積読だった「オブジェクト指向でなぜつくるのか 第3版 知っておきたいOOP、設計、アジャイル開発の基礎知識」を最近読んだので、まとめ記載。
プログラミング言語の歴史の部分が、とてもわかりやすかった。
プログラミング言語の歴史:機械語→アセンブリ言語→高級言語→構造化プログラミング
機械語
コンピュータは2進数で書いた機械語しか解釈できない。
# 機械語によるプログラム例
A10010
8B160210
01D0
A10410
アセンブリ言語
機械語を人間がわかりやすい記号に置き換えて表現したもの。
アセンブラと呼ばれる別のプログラムに読み込ませて、アセンブリ言語から機械語を生成する。
# アセンブリ言語によるプログラム(Z=X+Y)例
MOV AX, X
MOV DX, Y
ADD AX, DX
MOV Z, AX
高級言語
コンピューターが理解する命令を1つ1つ記述するのではなく、より人間にわかりやすい「高級な」形式で表現したもの
FORTRAN(1957年)・COBOL(1960年)
# FORTRANによるプログラム例
Z = X+Y
構造化プログラミング:GOTO文の廃止・サブルーチンの独立性強化
1)GOTO文(プログラム内の任意のラベルに無条件で分岐する命令)を廃止
GOTOレスプログラミング。具体的には、ロジックを基本3構造のみ使用:順次進行・条件分岐(if/case)・繰り返し(for/while)
2)サブルーチンの独立性の強化
ローカル変数と値渡しの仕組みを導入して、グローバル変数の使用を最小限にした。しかし、ローカル変数はサブルーチン呼び出しが終わると消えてしまう一時的な変数。サブルーチンの実行期間を超えて保存する必要のある情報はサブルーチンの外側、つまりグローバル変数として保持せざるを得ない課題
OOP(オブジェクト指向プログラミング)
3つの要素(クラス・ポリモーフィズム・継承)を導入
プログラムの無駄を省いて整理整頓する仕組み
クラス:まとめて、隠して、たくさん作る
まとめる:サブルーチンとグローバル変数をクラス内にまとめる
メソッド:クラスにまとめたサブルーチン
インスタンス変数(属性、フィールド):クラスにまとめたグローバル変数。仲間内だけのグローバル変数
Java
// 構造化プログラミングによるファイルアクセス処理
// アクセス中のファイル番号を格納するグローバル変数
int fileNum;
// ファイルをオープンするサブルーチン
// 引数にパス名を受け取る
void openFile(String pathName) {/* ロジックは省略 */}
// ファイルをクローズするサブルーチン
void closeFile {/* ロジックは省略 */}
//ファイルから1文字を読み込むサブルーチン
char readFile() {/* ロジックは省略 */}
Java
// クラスを使ってまとめる
class TextFileReader {
// アクセス中のファイル番号を格納するグローバル変数
int fileNum;
// ファイルをオープンするサブルーチン
// 引数にパス名を受け取る
void open(String pathName) {/* ロジックは省略 */}
// ファイルをクローズするサブルーチン
void close() {/* ロジックは省略 */}
//ファイルから1文字を読み込むサブルーチン
char read() {/* ロジックは省略 */}
}
隠す:private/public
クラスやメソッド、インスタンス変数の宣言部にprivate/publicを指定することで、アクセスをクラス内部だけに限定したり、他のアプリケーションからも呼び出すなどを柔軟に設定できる
Java
// インスタンス変数を隠す
// クラスとメソッドを公開する
public class TextFileReader {
// アクセス中のファイル番号を格納するグローバル変数
private int fileNum;
// ファイルをオープンするサブルーチン
// 引数にパス名を受け取る
public void open(String pathName) {/* ロジックは省略 */}
// ファイルをクローズするサブルーチン
public void close() {/* ロジックは省略 */}
//ファイルから1文字を読み込むサブルーチン
public char read() {/* ロジックは省略 */}
}
たくさん作る
インスタンス:クラスで定義したインスタンス変数が確保されるメモリ領域
従来のサブルーチン呼び出しの場合は、単に呼び出すサブルーチン名を指定するだけだった。しかし、OOPの場合は、、、、
続きは、こちらで記載しています。