BOOK Preview
|
|
|
6.5 言語固有の問題
プログラミング言語によって、クラスへの取り組み方はおもしろいほど異なっている。例として、メンバルーチンをオーバーライドして、派生クラスでポリモーフィズムを実現する方法について考えてみよう。Javaでは、すべてのルーチンが既定でオーバーライドされる。ルーチンが派生クラスでオーバーライドされるのを防ぐには、ルーチンをfinalで宣言しなければならない。C++では、ルーチンは既定でオーバーライドされない。ルーチンをオーバーライド可能にするには、基底クラスでルーチンをvirtualで宣言しなければならない。Visual Basicでは、基底クラスでルーチンをOverridableで宣言し、派生クラスでOverrideキーワードを使用しなければならない。
ここで、言語によって大きく異なる機能のうち、クラスに関連する部分を挙げてみよう。
-
継承ツリーでオーバーライドされたコンストラクタとデストラクタの振る舞い
-
例外処理の条件下にあるコンストラクタとデストラクタの振る舞い
-
既定のコンストラクタ(引数を持たないコンストラクタ)の重要性
-
デストラクタまたはファイナライザが呼び出されるタイミング
-
代入演算子や等価演算子など、言語のビルトイン演算子をオーバーライドする方法
-
オブジェクトの生成と破棄、またはオブジェクトの宣言とオブジェクトがスコープを外れたときのメモリの処理方法
これらについて説明するのはまたの機会にして、章末の「6.7 参考資料」で言語関連の参考書を紹介しておく。
6.6 クラスを超えて:パッケージ
本書の執筆時点では、クラスはプログラマがモジュール化を実現するための最も効果的な手段である。しかし、モジュール化は壮大なテーマであり、クラスの枠にとどまらない。数十年に及ぶソフトウェア開発の進化の歴史は、プログラマが対処しなければならない集合体をごつごつしたものからなめらかなものへ少しずつ進化させた歴史と言ってもよいだろう。最初の集合体はステートメントで、当時のマシン命令からすれば、大きな前進であるように思われた。次にサブルーチンが、その次にクラスが登場した。
|
オブジェクトをグループにまとめる良いツールがあったなら、抽象化やカプセル化の目標を達成しやすかったことは明らかである。Adaはパッケージの概念を10年以上も前にサポートしていた。現在では、Javaがパッケージをサポートしている。パッケージを直接サポートしていない言語でプログラミングを行っている場合は、自分専用の手軽なパッケージを作成して、次を含むプログラミング標準に基づいて適用すればよい。
-
パッケージに含まれるパブリックなクラスとプライベートなクラスを区別する命名規則
-
どのクラスがどのパッケージに属しているのかを識別する命名規則、コード構成規則(プロジェクト構造)、またはその両方
-
他のパッケージを使用できるパッケージと、その使用法が継承、包含、または両方のいずれであるかを定義する規則
これらの打開策は、言語の中でのプログラミングと言語の中へのプログラミングの良い例である。この区別については、下巻第34章の「34.4 言語の中へのプログラミング」を参照すること。
|
|
6.7 参考資料
クラス全般
-
『Object-Oriented Software Construction, 2nd edition』
(Bertrand Meyer著、Prentice Hall、1997年)
『オブジェクト指向入門』
(初版の翻訳、アスキー、1990年、二木厚吉監訳、酒匂寛、酒匂順子訳)
ADTを徹底的に解説し、それらがいかにしてクラスの基礎を形成するのかを説明している。第14章〜第16章では、継承について詳しく述べている。第15章では、多重継承を使用する理由を挙げている。 -
『Object-Oriented Design Heuristics』
(Arthur J. Riel著、Addison-Wesley、1996年)
クラスレベルを中心に、プログラムの設計を改善するための提案を数多く盛り込んでいる。あまりにも深いテーマ(「すねに傷を持つものはうかつなことを言うなかれ」という話)に思えて、数年前までは勧めていなかった。ただし、本の厚さはたった200ページほどである。Rielの文章は読みやすく、楽しめる。的を絞った実用的な内容になっている。
C++
-
『Effective C++: 50 Specific Ways to Improve Your Programs and Designs, 2nd edition』
(Scott Meyers著、Addison-Wesley、1998年)
『Effective C++ 改訂2版』
(アスキー、1998年、吉川邦夫訳) -
『More Effective C++: 35 New Ways to Improve Your Programs and Designs』
(Scott Meyers著、Addison-Wesley、1996年)
『More Effective C++ ― 最新35のプログラミング技法』
(アスキー、1998年、安村通晃、伊賀聡一郎、飯田朱美訳)
Meyerによる2冊の本は、どちらもC++プログラマの標準参考書である。これらの本は楽しいし、シニアエンジニアにC++のニュアンスを高く評価させるのに役立つ。
Java
- 『Effective Java Programming Language Guide』
(Joshua Bloch著、Addison-Wesley、2001年)
『Effective Java ― プログラミング言語ガイド』
(ピアソン・エデュケーション、2001年、柴田芳樹訳)
Javaならではのアドバイスが豊富に盛り込まれているほか、より一般的なテーマとして、良いオブジェクト指向の手法についても紹介している。
Visual Basic
次に、Visual Basicのクラスを取り上げた良い参考書を紹介しよう。
-
『Practical Standards for Microsoft Visual Basic .NET』
(James Foxall著、Microsoft Press、2003年) -
『Programming VB .NET: A Guide for Experienced Programmers』
(Gary Cornell、Jonathan Morrison著、Apress、2002年) -
『Professional VB.NET, 2nd edition』
(Fred Barwell他著、Wrox、2002年)
『プロフェッショナルVB.NET 上基本編』
『プロフェッショナルVB.NET 下応用編』
(初版の翻訳、インプレス、2002年、風工舎訳)
6.8 まとめ
-
クラスインターフェイスは一貫性のある抽象化を実現しなければならない。このたった1つの原則に違反しただけで、多くの問題が生じる。
-
クラスインターフェイスは何か(システムインターフェイス、設計上の決断、または実装の詳細)を隠ぺいしなければならない。
-
「is a」関係をモデリングする場合を除き、通常は継承よりも包含の方が望ましい。
-
継承は便利なツールだが、複雑さを増大させる。このことは、ソフトウェアの鉄則である複雑さへの対処を妨げる。
-
クラスは複雑さに対処するための第一のツールである。クラスの目標を達成するために必要なものと同じくらい、クラスの設計にも注意を払うこと。
INDEX | ||
Code Complete 第2版 上・下 | ||
第6章 クラスの作成 | ||
1.6.1 クラスの基礎:抽象データ型(ADT)(1) | ||
2.6.1 クラスの基礎:抽象データ型(ADT)(2) | ||
3.6.2 良いクラスインターフェイス(1) | ||
4.6.2 良いクラスインターフェイス(2) | ||
5.6.3 設計と実装の問題(1) | ||
6.6.3 設計と実装の問題(2) | ||
7.6.4 クラスを作成する理由 | ||
8.6.5 言語固有の問題/6.6 クラスを超えて:パッケージ/6.7 参考資料/6.8 まとめ | ||
「BOOK Preview」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|