オブジェクト指向
プログラミング
第七回
知能情報学部
新田直也
データ構造の情報隠蔽(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[] = 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クラスのデータ構造とアルゴリズムを配列を使
ったリストから線形リストに変更する.

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++) {
l = l.next;
}
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 class List {
public static void main(String[] args) { 構造体
int values[] = new int[1000];
List l = new List();
int size;
部分
l.add(11);
public static void add(int v) {
l.add(22);
values[v.size] = v;
int v = l.get(1);
size++;
System.out.println("v = " + v);
}
関数部分
}
public static int get(int n) {
}
return l.values[n];
}
}
構造体と関数をまとめた(カプセル化した)ものをクラスと呼ぶ.
クラスの内部にデータ構造とアルゴリズムの両方を隠蔽できる.
クラスはモノに相当すると考えよう(オブジェクト指向).
ダウンロード

7回目