6回目

オブジェクト指向
プログラミング
第六回
知能情報学部
新田直也
インデントについて(再掲)

行の
先頭
を揃
える
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クラスを使っている関数にどのように影響するか?