実はずいぶん前に頂いた本ですが、やっと読みました。
- Effective Java プログラミング言語ガイド
- Joshua Bloch ジョシュア・ブロック
- ピアソン・エデュケーション 2001-12-03
- おすすめ平均
- 上を目指す人の基礎固め
- 脱初心者に必須
- Effective C++とともに最良の書籍
- JAVA言語を理解するための効果的な実践書です。
- 翻訳も良いと思う
- 脱初心者に必須
by G-Tools , 2006/12/16
題材がJavaというだけで、.NETプログラマーでも十分に役立ちます。
私のようなパンピー(一般プログラマ)では、スレッドの辺りはあまり使わないので飛ばしてしまいましたが・・・。
まず、自分的に一番ホットな内容だったのは、「継承よりコンポジションを選ぶ」。
元となるプログラムがあって、その機能を拡張するために継承を使うということを考える場合があると思います。
実は私も以前やったことがあり、どうもうまくいかないという感じがありました。ここでは問題点と解決法が明確に書かれており
・サブクラスはスーパークラスの実装に依存する→スーパークラスの変更でサブクラスの動作が不正になる可能性がある
・スーパークラスにメソッドが追加される可能性がある→サブクラスのメソッドとぶつかる可能性がある
そこで、コンポジションを使いましょうということで
・新クラス(ラッパクラス)に元クラスのインスタンスを持つ
・転送メソッドで、元クラスのメソッドを呼び出す
・拡張したいメソッドだけを実装する
という形で、元クラスのカプセル化を壊さないで実現するというわけです。
他でも読んだ記憶がありますが、継承はサブクラスがスーパークラスにis-a関係が成り立つときだけ使いましょうということです。
次にいいと思ったのは、「nullではなく、長さゼロの配列を返す」。こうしておけば、最初にnullチェックをせずにいきなりループ処理に入っても安全なわけですね。
あと、基本ですけどなかなかできていないこととして「メソッドのシグニチャを注意深く設計する」の中の「パラメータ型に関しては、クラスよりインタフェースを選ぶ」。余談ですが、画面コントロール(テキストボックスとか)をインターフェースの実装にできたら、記述が楽になるのかなと思ったり。
さらに、「ローカル変数のスコープを最小限にする」の中で、変数宣言は使用の直前で、と言われているのは、好まない人もいると思いますが(最初に宣言が固まっていたほうが見やすい)、直前の方が安全だと思いますし、さらにループカウンタは別に宣言するのではなく、ループ変数を使うようにする(For i As Integer = 0 To n みたいな宣言)というのも、使う変数を間違えないようにする等の効果が挙げられていてよいです。
というわけで、コンポジッションは即実践!