last update: 2013/09/03

2008/05/07

本も買う必要があったんだった

歯医者で麻酔を打たれてちょっとけだるい感じでお届けします。

C/C++原理主義として活動している(わけではないけどC++でしかプログラムを書かない)私ですが、仕事でどうやらJavaを使わなきゃならない羽目になりそうです。

うーん、別にJavaが嫌いってわけじゃないんだけどさー。というか別にJavaが書けないわけでもないしスキル的な問題はなんら気にしてないんですが、C++にはC++の作法があるようにJavaにはJavaのお作法がありそうなので、それを習得するのがめんどいんです。

とかいってお勉強を後回しにしてるといきなり仕事で使うときにハマりまくり(一番有名な話はJavaでSingletonパターンやろうとしてDouble-Checked Lockingを実装してハマる話かな?)になりそうなので、お作法をお勉強することにしました。スコットメイヤーじゃないけど、Effectiveの名前が付いてるからEffective Javaあたりを買っておくか! ということで早速注文。ただ、今月末に原書の第2版がでるんですよねー。日本語版も今年中には出したいとどこかのブログに訳者の人がコメントしてましたが、ちょっとそこまで待っていられないので7年前の本ですが購入に踏み切りました。

しかしあれですね。Javaといえば大学時代のときに授業でちょろっと触った程度の知識しかないんですが、当時Socket周りが標準ライブラリに存在しててかなり感動したものです。だってC++ってそういうソケットライブラリないからオレそれまで通信プログラム書いたことなかったし。その時のオレはC++のSTLの(かなり深いところの)習得中だったんですが、Javaの豊富すぎる標準ライブラリにはちょっとびびりました。

ただ当時のJavaのイメージって、C++のtemplateみたいにパラメタライズしたクラスが作れなかったから、Arrayとかを特定の型にfixして使おうとしてもそれをコンパイル時にチェックできてない(なんでもObjectクラスを継承してるから何を突っ込んでもコンパイルエラーにならない)のがすごい使えない言語だなぁというイメージでした。

その辺をどうとらえるかっていうのは実はCとかの厳密な言語で育った人とLL言語で育った人でまったく違うとらえ方をしてるんじゃないかなぁと思ってて、私はCみたいにコンパイル時になんでも解決してたほうが後から苦労しなくていいと思ってるんですけど、一部のLL言語みたいに型の解決が実行時まで遅延していてくれていたほうが楽(というか融通が利く)という見方も出来るんじゃないかと思っています。

でも最終的になんでもごちゃ混ぜにして突っ込むコンテナってバグの温床になるのでコンパイル時に型が解決したほうがいいんですけどねぇ。関数型言語とかを使い出すとまたその辺の話が変わってきそうですが、そこは守備範囲外なのでわかりません。Haskell。

まぁそんなことを思ってたわけですが、昨年の今頃に新人研修でJavaをやらされたときにいつの間にかJavaに(JDK 1.5から)Genericとかいうパラメタライズしたクラスのインスタンスを作る機構ができていてちょっと感動しました。これがあればこれまでJavaに持ってたいやーなイメージはある程度払拭できるかなぁと。

ただ、それだけじゃないんですけどねー。CとかC++ってヘッダファイルとソースファイルが分離されていますが、JavaとかC#なんかは全く分離されていない(そのうえJavaなんてクラス名とファイル名がリンクしてるしさ…)のが個人的にはいやだったりします。だってクラス定義がぱっと見えないんだもの…。

あとはJavadocみたいにソースに書式付きコメントをつけてドキュメント生成するっていうアレですか。あれもあんまり好きではない…のですがそうも言っていられない(仕事ではドキュメントをそれなりに作らないといけない)のでこれは受け入れざるをえない。個人的にはC/C++なら「ドキュメント/クラスリファレンスはヘッダを見れば一目瞭然だよ」と行きたいところです。ヘッダとソースが分離されていないJavaやC#ではそうはいかないので、まぁその辺はしかたないですね。

ある意味ソースからドキュメント作るっていうのは逆説的な発想ですよね。ヘッダとソースが分離されていればヘッダを書き終わったところで設計が完了して、ソースを書き上げてコーディング完了って感じのイメージで作業できますけど、Javadocとかを使ってJavaソースを書く人ってどういう順番で書いてるんでしょう? 一応クラスのプロトタイプ+Javadocコメントを先に書くのかなぁ。ソース書き終わってからJavadocコメントつけてたんじゃ設計の前に実装してることになるから設計もなにもあったもんじゃないですよね

とまぁ、仕事でJavaを使いそうな話を適当に書きつづってみました。しかしあれだなぁ。Java「も」使うけどJavaから通信でつなぐ先はC++(これもオレが書く)なので、なんかいろいろとC++とJavaの違いで泥沼にハマりそうな気がとてもしていてちょっと気が重いです。十分な調査期間があればいいんだけども。

comments powered by Disqus