November 09, 2004

Syntactic Salt Considered Harmful

さて政治的に正しくないことを書いたあとは、技術的にレベルの低いことでも書いてごまかしましょう。なんかダメなことばかり書いている気もしますけど、どうしてなんでしょうね。

無難な言語であるJavaですが、気持ちよいプログラミングを妨げる言語仕様がいくつかあります。ここでそれらを批判するとともに、Syntactic Saltは良くないと主張します。

1. キャスト構文を強制される

Javaではオブジェクトのダウンキャストをするときに、必ずキャスト構文を書かなければなりません。しかし、ダウンキャストはそれほど避けるべき行為なのでしょうか。確かに、なるべくポリモーフィズムで解決するほうがエレガントですが、それはクラス設計の大幅な見直しを伴う作業であり、ダウンキャストするのが面倒であるとしても何かヒントが得られるとも思いません。

そもそもJavaの言語仕様(5.0以前)では、ListなどのCollectionを使うときには、必ずダウンキャストが必要になるわけです。それなのにいちいち、foo = (fooclass) list.get(1)などとしなくてはいけないため、血圧が上昇してしまいます。

この状況はgenericsで改善されるのが幸いです。しかし、わざわざsyntactic saltを使い、初心者プログラマを戸惑わせ、熟練プログラマをいらいらさせるメリットはどこにあるのでしょうか。

2. throwsを書かされる

やりたいことは分かります。でも基本的には「どんな例外が投げられるのかが、一目で明らかになる」という言語仕様を実現するためにthrowsを強制すべきとは思いません。コンパイルオプションなどによっては、未処理例外の一覧が表示されるといった機能で良いはずです。

たしかにJDBCなどのCloseが必要な処理があるときに例外処理を忘れないというメリットはあるかもしれません。でも、そもそも希少リソースの解放問題と、例外処理は本質的には関係がないはずで.... エラーが発生することを考えれば、いずれにせよfinally節で処理されるべきであって....

throwsが強制されて一番恐ろしいことは、未熟練プログラマがなんでもかんでも例外をcatchして、その処理を無視してしまう可能性です。また、throwsを書くのが面倒くさいために例外のクラスをきちんと定義しなかったり、全てのメソッドにthrows Exceptionを書いてしまったりという恐れがあります。

熟練プログラマにとってはthrowsはイライラのもとでしかありません。百害あって一利なし。Syntactic Saltを廃絶しましょう。

3. byte型がunsignedじゃない

これはいわずもがな。byte型を符号付きで使う場面を思いつきません。unsignedがないと、bytewise,bitwiseな演算ってものすごくやりにくいんですよね。なんでbyte型をunsignedにしなかったんだろう?

Posted by arai at November 9, 2004 03:01 AM
Comments

1か月以上前のことにコメントさせていただきますが、1. と 2. は、同感ですが、3. については私は Java の肩を持ちます。C/C++ ではなまじ unsigned があるため、ちょっと凝ったことをやろうとすると、正負が非常にシビアでバグのもとになりました。Java は常に signed だ、というシンプルさがあって分かりやすいです。ビット操作もそんなにしにくいとは思ったことはないです。

Posted by: unibon on December 24, 2004 11:00 PM
Post a comment














Please enter this 6digits Security Code (for SPAM's sake...).
spam対策のため6桁のセキュリティコードを入力してください。