私がJavaからC#に乗り換えた10の理由

私がJavaからC#に乗り換えた10の理由という、コラムが@ITにあった。
面白い話だったので、ここで紹介しておく。
ついでなので、私の意見も織り交ぜることにする。


- 理由01 - struct
C#では、class以外にstructがある。双方の違いは
ヒープ領域に置かれるか、スタック領域に置かれるかの違いだ。
コラムでは、これが大問題にあるとあるが、そんなことは感じたことがない。
最終的に、そうせざるを得ない場合があったとしても、
Poolクラスを作ってしまえば、ヒープ領域の無駄遣いはほぼなくなる。
私は逆にC#の方が使い勝手が悪いように思える。
C#をしっかり押さえている技術者は間違わないが、
スタック領域とヒープ領域を知らない技術者も多い。
そんな技術者がstructをゴリゴリ作ったらどうなるか・・・
スタック領域はかなり限られているので、スタックオーバーを起こす方が簡単だ。


- 理由02 - delegate
これは納得。 delegateは早く対応してほしい。


- 理由03 - property
これについても同意する部分はある。
ただ、getter,setterはeclipseを使えば自動で作ってくれるし、
ある程度のチェックも可能だ。
結局、ダイナミックに使うとなると、リフレクションを使うことになるので、
どちらもさほど変わらないのではないかというのが、私の結論。
ただ、getter,setterがまとめて定義できる分C#の方が上手だろう。


- 理由04 - custom attribute
Javaでいうアノテーションがこれに当たる。
現実C#より若干弱いので、確かにシリアライズはimplementsしないといけない。
どちらかというと、VMでどこまで処理をするかという問題なので、
C#の方が先を行っているだけで、Javaサードパーティが頑張っている。
アノテーションAOPの合わせ技は目をみはるものがある。(S2Dao等)


- 理由05 - thread
これは、C#に軍配があがる。 デリゲートは非常に強力だということだろう。
ただ、どんなに言語レベルで頑張っても、
マルチスレッドは結局たくさんの人の目が必要なので、
負担を減らすことにしかならないのでは?というのが結論。


- 理由06 - interface
「テストの期間を短縮できるのである」と締めているが、
結局、テストを後回しにし、コンパイルが通ればOKというスタンスが間違いだと思う。
(100%TDDを実践していないのでこんなこと言うのもあれだが)
アジャイル開発では、これは大きな問題にならないんじゃないかと思う。
小さな間違いのうちに見つけられるのだから。


- 理由07 - virtualとoverride
これは好き嫌いに依るところが大きい。
私は、オブジェクト指向ポリモーフィズムと言う考えが強いので、
Javaの方が好きだ。
ここでは、クラス継承が影響を与える場合が大きいとあるが、
実際、クラス継承はそんなにしない。
インターフェイスの実装か、抽象クラスの継承だろう。
それでも、オーバーライドされてしまう危険性は残るが、
真にそれが目的の場合に、C#だとどうしようもなくなる場合がある。(C++でも起こり得る)
利便性を取るか、安全性を取るか。
Javaは利便性、C#は安全性を取った。


- 理由08 - #if
条件コンパイルは悪である。
そんなことをするのは設計ミスである。
AOPを使えば不必要なログは納品時には排除できるし、
自動テストを書けばログで確認なんてこともなくなる。


- 理由09 - Visual Studio .NET
それで間に合えば。である。
NUnitアジャイル開発の必需品でもあるし、
自動ビルド環境、ソース管理と必要な機能はたくさんある。
私が思うのは、結局客先には、VisualStudioは入れられないのだから、
それぞれのインストール/設定を知っていないと話にならない。


- 理由10 - Javaが嫌になった
賛否両論あるが故Javaはここまで大きくなった。
結局、理想を捨てれば成長はそこまでで、
C#は独自に開発しているにせよ、他言語の恩恵を一身に受けている。
結局好き嫌いで片付けられてしまったのが非常に残念だ。