きしださん企画に投稿したプログラムを「エロい」と褒められたので、さらに洗練して整理してみました。 思わず「なるほど」とうなづいてしまったそこのあなた。こんなもんをリファクタリングしてここまで整然とさせる行為自体がどうにもバカなことを見落としているよ。
/**
* エントリポイントのクラス
*/
public class PrintTest {
public static void main(String[] args) {
String[][] data = { { "aa", "bb", "cc" }, { "dd", "ee" } };
// String[][] data = {};
//String[][] data = null;
new RealPrinter().print(data);
}
}
/**
* データを出力しないクラス
*/
class PrinterStub {
protected void printData(String[][] data) {
System.out.println("データがありません");
}
protected void printNotNull(String[][] data) {
System.out.println("データが空です。");
}
protected void printDoubleArray(String[][] data, int idx) {
}
protected void printSingleArray(String[][] data, int idx1, int idx2) {
}
protected void printDelimiter() {
}
protected void printString(String[] ar, int idx) {
}
}
/**
* データを出力するクラス
*/
class RealPrinter extends PrinterStub {
private PrinterStub[] instances = { new PrinterStub(), this };
/**
* trueなら1, falseなら0を返すメソッド。 唯一のバカ部分。
*/
private static int bValue(boolean b) {
return 5 - Boolean.toString(b).length();
}
public void print(String[][] data) {
int p = bValue(data != null);
instances[p].printData(data);
}
protected void printData(String[][] data) {
int p = bValue(data.length > 0);
instances[p].printNotNull(data);
}
protected void printNotNull(String[][] data) {
printDoubleArray(data, 0);
}
protected void printDoubleArray(String[][] data, int idx) {
int p = bValue(data.length > idx);
instances[p].printSingleArray(data, idx, 0);
System.out.println();
instances[p].printDoubleArray(data, idx + 1);
}
protected void printSingleArray(String[][] data, int idx1, int idx2) {
int p = bValue(data[idx1].length > idx2);
instances[p].printString(data[idx1], idx2);
int p2 = bValue(data[idx1].length > idx2 + 1);
instances[p2].printDelimiter();
instances[p].printSingleArray(data, idx1, idx2 + 1);
}
protected void printDelimiter() {
System.out.print(",");
}
protected void printString(String[] ar, int idx) {
System.out.print(ar[idx]);
}
}

この記事に対するコメント