オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也
インデントについて(再掲) 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; 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構造体の 内部構造を知らなくてよい List構造体の 内部構造を知っている
データ構造の情報隠蔽(3/4) オブジェクト指向(Java)でそれっぽく書いてみる. List構造体は,JavaではListクラスに相当する. Listクラスを新規に作成する. public class List { int values[] = new int[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[l.size] = v; l.size++; public static int get(List l, int n) { return l.values[n]; Listクラスの 内部構造を知らなくてよい Listクラスの 内部構造を知っている
データ構造の変更(1/2) Listクラスのデータ構造とアルゴリズムを配列を使ったリストから線形リストに変更する. public class List { int value; List next; } データ構造(線形リスト) ⇒Listクラスを使っている関数にどのように影響するか?
課題提出 課題提出先: http://bit.ly/2PysR0b 講義時間内に提出すること. 提出後に訂正はできないが,講義時間内なら再提出可能. 学籍番号は半角の数字で.