Java.use(better); Episode#01 拡張可能な for 文(1)

前の記事次の記事
Java.use(better);


Episode#01

拡張可能な for 文(1) -- for と別れる50の方法


《関連記事》

オブジェクト指向プログラミングへの扉を開く

オブジェクト指向プログラミングに欠かせない、三本柱のひとつを支える「情報隠蔽の原則」に従うと、この条件式は利用者(プログラマー)には知らされず、知る必要の(知らせてはいけ)ない情報です。古典的な for 文では、この「原則に背くコードの断片が散在する」ために、ソフトウエアを汚染します。やがて、西暦二千年問題と同じ病巣(メンテナンスの悪夢)を抱えます。

Java では、拡張 for 文を利用すると、データ構造に依存しない制御構造を記述できます。つまり「情報隠蔽の原則に沿った抽象表現」が可能です。

次のコードの断片で注目に値するのは、

// case #3: Java 流 - オブジェクト指向プログラミング
int sum = 0;
ArrayList s = new ArrayList (seq);
for (int e: s) {
  sum += e;
}
System.out.println("sum = "+sum);
// case #4: Java 流 - オブジェクト指向プログラミング
int sum = 0;
LinkedList s = new LinkedList (seq);
for (int e: s) {
  sum += e;
}
System.out.println("sum = "+sum);

メソッド get/remove や変数 i が不要になるだけではなく、拡張 for 文は「データ構造に依存しない」ことです。各要素を巡回するには、e とだけ記述します。必要なのは、総和を保持する変数 sum だけです。「情報隠蔽の原則に沿った抽象表現」になっているので、for に続くコードの断片を再利用できるだけでなく、仕様変更(効率の良いデータ構造への改変など)にも柔軟に対処できます。

プログラマーには2つの顔(提供者/利用者)があります。少なくとも利用者の顔を持つプログラマーにとって、データ構造に依存しない`解法`があるのは、あの憂鬱から`解放`されるので朗報です。また、拡張性のある for 文を導入することで「ポリモフィズム」を適用する道(後述)も開けてきます。

関数型プログラミングへの扉を開く

さらに、時計の針を1960年代まで戻すと、次のようにな関数型プログラミングのスタイルを踏襲できます。

// case #5a: Java 流 - 関数型プログラミング
int sum = seq.iterate(new Iterate(0) {
  public int call(final int acc, final int n) {
    return acc+n;
  }});
System.out.println("sum = "+sum);

関数型プログラミングは、Java でも実践できますが、

// case #5b: Scala 流 - 関数型プログラミング
val sum = seq.fold(0) { _+_ }
println("sum = "+sum);

Scala を導入すれば、コードが簡潔で見通しも良くなります。

 ↑ TOP

update*13/01/02 14:04:48