「怠慢はプログラマの美徳」というけれど
Java屋Java信者とスクリプト言語屋の間には、「めんどくさい」と感じるセンスについて超えられない壁が存在している。
本質的でない事柄に関する記述があったときに、スクリプト言語屋は「めんどくさい」と感じ、Java屋Java信者はそれを感じないか、または「これは必要な冗長性だ」と本気で思い込んでいる。
前にとり上げたけど、アクセッサの記述がその典型例。本質的でない記述がずらっと並んでいることに、Java屋Java信者はホントに何も感じないのだそうだ。あれがどれだけ readability を下げているか、まったく分かっていない。
また System.out.print() もそう。たかが print 文のくせして、なんで System.out.print() と書かないといけないのか。本来であれば、Java1.5 のタイミングで
package java.util;
public class PrintUtil {
public static void print(int arg) {
System.out.print(arg);
}
public static void print(Object arg) {
System.out.print(arg);
}
...
}というクラスを用意し、static import を使うことで print() と書けるようにすべきであった。しかし長年 System.out.print() を何の疑問もなく使ってきた Java屋Java信者の頭は凝り固まっているから、このような発想には行き着かないのだろう (言語が固いからといって、思考まで固くなる必要はないのにね)。
こんなことは Java ではいたるところに存在していて、たとえばテキストファイルひとつ読み込むのも FileInputStream と InputStreamReader (と BufferedReader) を組み合わせて書かないといけない。だいたい、なんで FileReader では文字コードを指定できないのか、理解に苦しむ。
public static String readFile(String filename, String charset)
throws IOException {
InputStream stream = new FileInputStream(filename);
Reader input = new InputStreamReader(stream, charset);
Reader reader = new BufferedReader(input);
StringBuilder buf = new StringBuilder();
int ch;
while ((ch = reader.read()) >= 0) {
buf.append((char)ch);
}
//char arr[] = new char[256];
//int n;
//while ((n = reader.read(arr)) > 0) {
// buf.append(arr, 0, n);
//}
return buf.toString();
}ファイルひとつ読み込むにも、Java だと複数のクラスを組み合わせて何行もコードを書く必要がある。PHP なら file_get_contents(), Ruby なら File.read(), Python なら open().read() で済むのに!*1 これで「Java は初心者にも使いやすい言語です!」と言ってるんだから笑ってしまう。
ただ、スクリプト言語屋がみな柔軟な頭をしてるのかとか、本質的でない記述を徹底的に排除する姿勢を持っているのかといえば、みんながみんなそういうわけでもない。例えば、スクリプト言語で次のような Hash や Dict を書いたとする。
data = [
{'name'=>'Foo', 'age'=>20, 'email'=>'foo@mail.com'},
{'name'=>'Bar', 'age'=>21, 'email'=>'bar@mail.net'},
{'name'=>'Baz', 'age'=>22, 'email'=>'baz@mail.org'},
]もしこれをみて何も感じないのであれば、スクリプト言語屋といえど Java屋Java信者を笑うことはできない。本質的でない記述に嫌悪感を感じるセンスがあれば、同じキーが何度も現れていることを「めんどくさい」と感じるはずだ。そして、こんなふうに書けないだろうかと一度は思うはずだ。
data = %h{
['name', 'age', 'email'],
['Foo', 20, 'foo@mail.com'],
['Bar', 21, 'bar@mail.net],
['Baz', 22, 'baz@mail.org'],
}これを言語仕様で実現するのか、またはライブラリで実現するのかは正直どっちでもいい。もちろん、このくらいなら我慢するという選択もありだ。大事なのは、「めんどくさい」と感じるセンスがあるかないかである。
プログラマの三大美徳とは「怠慢、短気、傲慢」であると言われるけど、そもそも怠慢であること自体がかなりのセンスを必要とする。延々と続くアクセッサ定義や複雑な pom.xml を見ても「めんどくさい」と感じるセンスが存在しない人間には、プログラマの美徳を説いたってわかってもらえるはずがない。
関連するエントリ:
つうかね、Java がほんとに使いやすくなったら、スクリプト言語なんてイチコロなんだよ。今、スクリプト言語に人気があるのとは対照的に Java に元気がないのは、Java 自身の失態がいちばんの原因だよ、ほんと。
*1:ただしテキストファイル限定