ここに書いたのは、私が設計・実装したJavaのフレームワーク開発を主に通じて理解したオブジェクト指向の原理原則です。
私は単なるエンジニアであって学者や研究者ではない上に、オブジェクト指向について誰かから教わった経験も無いため、ここに書いてある内容は科学的に吟味されたものではありません。
しかし、普段の仕事の中で気付いた合理性のある内容だと考えています。オブジェクト指向言語を日常使ってはいても、オブジェクト指向そのものをみっちりと学習したことがない人にとって特に役立つ内容だと思います。
これから説明するオブジェクト指向に関する原則は、実際の開発現場で皆さんが実践することを目的に書いています。つまり、
オブジェクト指向設計に関してはデザインパターンという形で様々な本が書かれていますが、パターンは有用ではあるものの全部を一々覚えてはいられません。そもそもパターンというのは、オブジェクト指向の本質を理解した人が設計した有用な常套手段に名前を付けたものです。
このサイトでは、オブジェクト指向設計における原理原則を記述しています。つまり、
これを理解してしまえばパターンのみに頼ることなく正しい設計にたどり着けると私は考えています。しかしパターンを否定しているのでは決してありません。
実はオブジェクト指向は、最初にコードを書く時の生産性は手続き型に較べて低いのです。しかし、
そのため、

「独立したAクラスとBクラスがお互い相手を参照する」という関係を表します。「バイク本体とタイヤ」のような関係です。タイヤはバイクの部品ですが、あるタイヤを色々なバイクに取り付けることが可能です。
関連を記述する場合は

「Mインタフェースの振る舞いをCクラスが具体化(実装)している」という関係を表します。振る舞いの型(呼び出し名、パラメータ、戻り値)だけをインタフェースでは定義し、その具体化(実装)はCクラス側に任せます。
例えば自動車と飛行機の役割は「乗り物」です。この場合、乗り物インタフェースを実現(実装)する形で自動車クラスと飛行機クラスを設計します。
「EとFの性質の共通部分を抜き出してDとした」関係のことです。例えば「ワゴン車とセダンを自動車と呼ぶ」という関係です。「継承」とも呼ばれます。
最近まで私は関連を使わずに集約のみで書いていたのですが、色々迷って考えた結果この逆の結論に至りました。モデルを表現する際、集約は紛らわしさを助長します。
集約は「has a」の関係と言われ、
それでは次ページから、「本には書いてないオブジェクト指向」の始まりです。
責務はクラスではない
クラスにするもの
小粒クラス
リンゴ一個とリンゴ一山は異なるクラス
関数とユーティリティクラスは禁止
privateメソッド禁止
どのメソッドをどのクラスで実装すべきか
業務シナリオで考える
インタフェースとは何か
継承の使いどころ
私は単なるエンジニアであって学者や研究者ではない上に、オブジェクト指向について誰かから教わった経験も無いため、ここに書いてある内容は科学的に吟味されたものではありません。
しかし、普段の仕事の中で気付いた合理性のある内容だと考えています。オブジェクト指向言語を日常使ってはいても、オブジェクト指向そのものをみっちりと学習したことがない人にとって特に役立つ内容だと思います。
オブジェクト指向って?#
オブジェクト指向の最初の説明として良く出てくるのが、- 隠蔽
- 継承
- 多態性
これから説明するオブジェクト指向に関する原則は、実際の開発現場で皆さんが実践することを目的に書いています。つまり、
- 開発現場で役立つオブジェクト指向の本質を解き明かす
オブジェクト指向設計に関してはデザインパターンという形で様々な本が書かれていますが、パターンは有用ではあるものの全部を一々覚えてはいられません。そもそもパターンというのは、オブジェクト指向の本質を理解した人が設計した有用な常套手段に名前を付けたものです。
- パターンは囲碁で言う定石
- 定石には必ず理由があり、それらの根底には共通する原理原則がある
このサイトでは、オブジェクト指向設計における原理原則を記述しています。つまり、
- 定石を産み出すための原理原則
これを理解してしまえばパターンのみに頼ることなく正しい設計にたどり着けると私は考えています。しかしパターンを否定しているのでは決してありません。
- パターンの奥に隠れた本質を理解する
オブジェクト指向の利点#
オブジェクト指向で開発すると何がいいのでしょうか? 一言で言うと、- 1箇所直せばみな直る
実はオブジェクト指向は、最初にコードを書く時の生産性は手続き型に較べて低いのです。しかし、
- 開発中あるいは開発後に仕様変更または仕様ミスがあって修正する
- 別のシステムでの部品を流用する
- 保守性が高い
- 再利用性が高い
そのため、
- 徹底したオブジェクト指向で開発されたシステムは総合的な生産性が高い
クラス図の読み方#
このサイトでは、UML(Unified Modeling Language)のクラス図(Class Diagrams)がたくさん出て来ます。ご存じない人のためにその読み方を簡単に説明します。次の3つがあります(UMLの定義ではこれ以外もあります)。- 関連
- 実現
- 汎化
関連#

「独立したAクラスとBクラスがお互い相手を参照する」という関係を表します。「バイク本体とタイヤ」のような関係です。タイヤはバイクの部品ですが、あるタイヤを色々なバイクに取り付けることが可能です。
- このバイクの部品として使っているタイヤ
- このタイヤを利用しているバイク
関連を記述する場合は
- 多重度(cardinality:カージナリティ)
実現#

「Mインタフェースの振る舞いをCクラスが具体化(実装)している」という関係を表します。振る舞いの型(呼び出し名、パラメータ、戻り値)だけをインタフェースでは定義し、その具体化(実装)はCクラス側に任せます。
- インタフェースは「役割」
例えば自動車と飛行機の役割は「乗り物」です。この場合、乗り物インタフェースを実現(実装)する形で自動車クラスと飛行機クラスを設計します。
汎化#

「EとFの性質の共通部分を抜き出してDとした」関係のことです。例えば「ワゴン車とセダンを自動車と呼ぶ」という関係です。「継承」とも呼ばれます。
- ワゴン車は自動車を継承している。
- E is a D.
- ワゴン車は自動車である。(自動車として扱える)
集約は使わない#
UMLの産みの親「Three Amigos」の一人であるジム・ランボーは、- 集約はプラセボ(プラシーボ)効果である
最近まで私は関連を使わずに集約のみで書いていたのですが、色々迷って考えた結果この逆の結論に至りました。モデルを表現する際、集約は紛らわしさを助長します。
集約は「has a」の関係と言われ、
- AクラスがBクラスを持つのか?
- BクラスがAクラスを持つのか?
- どちらも相手を持てる(持つ必要がある)
このサイトを読む上での注意点#
このサイトに書いてある内容には、皆さんのこれまでの常識をくつがえすものが多々あります。今までの常識にとらわれずに読んで下さい。可能ならば頭を白紙の状態にして、書いてある内容を純粋に吟味してみて下さい。皆さんの開発にきっと役立つはずです。それでは次ページから、「本には書いてないオブジェクト指向」の始まりです。
本には書いてないオブジェクト指向のページ一覧#
クラスとはデータ構造責務はクラスではない
クラスにするもの
小粒クラス
リンゴ一個とリンゴ一山は異なるクラス
関数とユーティリティクラスは禁止
privateメソッド禁止
どのメソッドをどのクラスで実装すべきか
業務シナリオで考える
インタフェースとは何か
継承の使いどころ
添付ファイルの追加
ログイン済のユーザのみが添付ファイルをアップロード出来ます。
添付ファイル一覧
Kind | Attachment Name | Size | Version | Date Modified | Author | Change note |
---|---|---|---|---|---|---|
png |
aggregation.png | 1.4 kB | 2 | 19-9-2011 00:08 | ytp | |
png |
aggregation2.png | 3.2 kB | 1 | 18-7-2011 01:13 | ytp | |
png |
aggregation3.png | 3.2 kB | 1 | 18-7-2011 01:13 | ytp | |
png |
association.png | 1.0 kB | 1 | 20-9-2011 00:04 | ytp | |
png |
composite.png | 1.4 kB | 1 | 18-7-2011 01:13 | ytp | |
png |
extend.png | 1.4 kB | 1 | 18-7-2011 01:13 | ytp | |
png |
generalize.png | 3.2 kB | 1 | 18-7-2011 02:28 | ytp | |
png |
implement.png | 1.9 kB | 1 | 18-7-2011 01:13 | ytp |
«
This particular version was published on 11-3-2012 21:44 by ytp.