Java.use(better);

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


Episode#03

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



《関連記事》

《目的》

オブジェクト指向プログラミングの障害となる「古典的な for 文」の隘路を確認した後で「拡張 for 文」による問題解決を図るとともに、制御構造を抽象化して「ポリモフィズム」を促進する術を紹介します。

《動機》

Java は、純粋なオブジェクト指向プログラミングを目指すのではなく、構造化プログラミングとの中庸を選択しました。そのため、基本データ型と多次元配列が混在すると、すべてをオブジェクト指向プログラミングの枠組みで統一的に扱うのが困難です。また、同じ制御構造を何度も記述するのは面倒なだけでなく、コードが複雑で見通しも悪くなるので、避けたいものです。そこで、拡張 for 文を利用すると、異なる階層構造を持つデータ(多次元配列、入れ子になったリスト、ツリーなど)のすべてに有効な、共通の抽象表現が可能です。すると、要求仕様の変更にも柔軟に対処できるので、ソフトウエア開発の能率が上がります。

■ 2次元配列の隘路

 ̄2次元配列を扱うときの典型である「九九(掛算)の表」を事例に話を進めます。以下の事例では、各要素を列挙した、2次元配列 array が存在するものとします。すると、

// case #1: Java - 2次元配列
int array = new int[9][9];

int n = 10;
for (int i = 1; i < n; i++) {
  for (int j = 1; j < n; j++) {
    array[i-1][j-1] = i*j;
  }
}


初期値の設定に2重の for ループが必要になるように、

for (int i = 1; i < n; i++) {
  for (int j = 1; j < n; j++) {
    System.out.print(String.format("%2d ", array[i-1][j-1]));
  }
  System.out.println();
}

各要素の出力にも同じ制御構造が必要です。

 ̄ここで注目に値するのは「多次元配列に呼応する、多重の for 文」です。同じ制御構造を何度も記述するのは面倒なだけでなく、コードが煩雑で見通しも悪くなります。また、要求仕様の変更(データ構造の改変)には柔軟に対処できないので、ソフトウエア開発の能率も悪くなります。この問題を解決する、何かうまい仕掛はないものでしょうか。

■ シーケンスを利用する

 ̄話を進める前に…。これが(1次元配列など)連続した要素の並び(シーケンス)ならどうでしょうか。たとえば、データ構造に Vector を選ぶと、

// case #2: Java - シーケンス(1次元配列)
List seq = new Vector();

int n = 10;
for (int i = 1; i < n; i++) {
  for (int j = 1; j < n; j++) {
    seq.add(i*j);
  }
}

初期値の設定には2重の for ループが必要ですが、各要素の出力には拡張 for 文を利用できます。すると、

int c = 0;
for (int e: seq) {
  c++;
  System.out.print(String.format("%2d ", e));
  if (c%9 == 0) System.out.println();
}
System.out.println();

単純なシーケンスを扱うだけなので、コードが簡潔で見通しも良くなります。また、この制御構造は、他のデータ構造にも有効です。

 ↑ TOP

》作業中です《

update*13/01/10 19:25:00

♪ 風車(かざぐるま)



出典 ☞ http://shimayu.co.jp/modules/myalbum/photo.php?lid=87