オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也 インデントについて(再掲) 行の 先頭 を揃 える Javaの標準のインデントに従おう. public static void main(String[] args) { int x, y; x = 4; y = fact(x); System.out.println("4! = " + y); } public static int fact(int a) { if (a == 1) { return 1; } return a * fact(a - 1); } 中括弧開くは 行の末尾に 再帰関数を使った階乗の実装 階乗を求める関数 fact() 再帰を使って実装する. public static void main(String[] args) { int x, y; y = fact(4); System.out.println("4! = " + y); y = fact(5); System.out.println("5! = " + y); y = fact(6); System.out.println("6! = " + y); } public static int fact(int a) { if (a == 1) { return 1; } return a * fact(a - 1); } 呼び出し 呼び出し 呼び出し 呼び出し(再帰) 内部処理(実装)の変更 factの内部の処理を変えてみる. public static void main(String[] args) { int x, y; y = fact(4); System.out.println("4! = " + y); y = fact(5); System.out.println("5! = " + y); y = fact(6); System.out.println("6! = " + y); } public static int fact(int a) { int x, b = 1; for (x = 1; x <= a; x++) { b = b * x; } return b; } 呼び出し側は 一行も変えて いない 呼び出し側は 内部の処理を 知らなくてよい (情報隠蔽) 内部の処理を 書き換え 情報隠蔽の効用 再利用が容易になる. 何度も同じようなコードを書かなくて済む.(効率化) 何度もテスト&デバッグしなくて済む.(高信頼化) 作業を分担できる.(分業化) 変更が必要となったときに修正箇所を局所化できる. (変更の局所化,可変性の向上) データ構造の情報隠蔽(1/4) 処理(アルゴリズム)の隠蔽 関数を用いる. データ構造の隠蔽 構造体を用いる. 配列を使ったリストの例: struct list { int values[1000]; int size; } データ構造 データ構造の情報隠蔽(2/4) 構造体変数を引数に渡したり戻り値で返したりする ことで情報隠蔽を行う. main() { int v; struct List *l; List構造体の l = create(); 内部構造を知ら add(l, 11); なくてよい add(l, 22); v = get(l, 1); } struct List* create() { return malloc(sizeof(struct List)); } void add(struct List *l, int v) { l->values[l->size] = v; l->size++; } List構造体の 内部構造を 知っている データ構造の情報隠蔽(3/4) オブジェクト指向(Java)でそれっぽく書いてみる. List構造体は,JavaではListクラスに相当する. Listクラスを新規に作成する. public class List { int values[1000]; int size; } データ構造(List構造体とまったく同じ) データ構造の情報隠蔽(4/4) オブジェクト指向(Java)でそれっぽく書いてみる. Listクラスを使うプログラムを書いてみる. public static void main(String[] args) { List l = new List(); add(l, 11); add(l, 22); int v = get(l, 1); System.out.println("v = " + v); } public static void add(List l, int v) { l.values[v.size] = v; v.size++; } public static void get(List l, int n) { return l.values[n]; } Listクラスの 内部構造を知ら なくてよい Listクラスの 内部構造を 知っている データ構造の変更(1/2) Listクラスのデータ構造とアルゴリズムを配列を使 ったリストから線形リストに変更する. Listクラスを以下のように修正する. public class List { int value; List next; } データ構造(線形リスト) ⇒Listクラスを使っている関数にどのように影響するか?
© Copyright 2024 ExpyDoc