オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也
データ構造の情報隠蔽(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クラスを使っている関数にどのように影響するか?
データ構造の変更(2/2) メインクラスも一部修正の必要がある. public static void main(String[] args) { : } public static void add(List l, int v) { while (l.next != null) { l = l.next; l.next = new List(); l.next.value = v; l.next.next = null; public static int get(List l, int n) { for (int i = 0; i <= n; i++) { return l.value; Listクラスの 内部構造を知らなくてよい データ構造の 修正に合わせて アルゴリズムを 書き換え Listクラスの 内部構造を知っている
構造化指向の問題点 構造化指向(C言語)または構造化指向っぽく書いたオブジェクト指向(Java)のプログラムでは,データ構造の変更に伴って変更すべき箇所が散乱する. public class Main { 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 void get(List l, int n) { return l.values[n]; public class List { int values[] = new int[1000]; int size; } データ構造の修正 (構造体) アルゴリズムの修正(関数)
カプセル化(1/2) それなら,一緒に変更されるデータ構造とアルゴリズムを一箇所にまとめればいい. 構造体 関数を構造体の中に public class Main { 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 void get(List l, int n) { return l.values[n]; public class List { int values[] = new int[1000]; int size; } 関数を構造体の中に 入れてしまえばよい 関数
カプセル化(2/2) それなら,一緒に変更されるデータ構造とアルゴリズムを一箇所にまとめればいい. public class Main { public static void main(String[] args) { List l = new List(); l.add(11); l.add(22); int v = l.get(1); System.out.println("v = " + v); } public class List { int values[] = new int[1000]; int size; public void add(int v) { values[size] = v; size ++; } public int get(int n) { return values[n]; 構造体 部分 関数部分 構造体と関数をまとめた(カプセル化した)ものをクラスと呼ぶ. クラスの内部にデータ構造とアルゴリズムの両方を隠蔽できる. クラスはモノに相当すると考えよう(オブジェクト指向).
課題提出 課題提出先: http://bit.ly/2QoGRXC 講義時間内に提出すること. 提出後に訂正はできないが,講義時間内なら再提出可能. 学籍番号は半角の数字で.