Java.use(better); Episode#01 拡張可能な for 文(1)
■ オブジェクト指向プログラミングへの扉を開く
オブジェクト指向プログラミングに欠かせない、三本柱のひとつを支える「情報隠蔽の原則」に従うと、この条件式は利用者(プログラマー)には知らされず、知る必要の(知らせてはいけ)ない情報です。古典的な for 文では、この「原則に背くコードの断片が散在する」ために、ソフトウエアを汚染します。やがて、西暦二千年問題と同じ病巣(メンテナンスの悪夢)を抱えます。
Java では、拡張 for 文を利用すると、データ構造に依存しない制御構造を記述できます。つまり「情報隠蔽の原則に沿った抽象表現」が可能です。
次のコードの断片で注目に値するのは、
// case #3: Java 流 - オブジェクト指向プログラミング int sum = 0; ArrayLists = new ArrayList (seq); for (int e: s) { sum += e; } System.out.println("sum = "+sum);
// case #4: Java 流 - オブジェクト指向プログラミング int sum = 0; LinkedLists = 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