オブジェクト指向プログラミングの勉強
2010年4月、組み込み系のリアルタイムシステム開発を担当しました。このプロジェクトでは、オブジェクト指向設計でシステム設計してC++言語で実装することにしました。
C++言語を使用しての開発は10年以上のギャップがあったので、オブジェクト指向を再度勉強しました。
オブジェクト指向プログラミング
- ソフトウェア芸人・矢沢久雄の名物講座 「オブジェクト指向プログラミング」―OOP、Java、UML、OOD、GoF
- 矢沢久雄 著
- ナツメ社
- 2005年4月4日 初版発行
目次
- 1章 OOPとは何か?
- 2章 OOPの必須テクニック
- 3章 OOPの三本柱と呼ばれるテクニック
- 4章 OOP言語の学習ゴール
- 5章 UMLとOOD
- 6章 GoFデザインパターン
- 7章 質疑応答コーナー
- 8章 プログラミング実習
内容
この本では、ソフトウェアのサンプルコードはJavaで説明しています。私はJavaの経験はありませんが、説明されているサンプルコードはなんとなく理解できました。そして、オブジェクト指向プログラミングの概念を勉強することができました。
「はじめに」に書いてありますが、基本的な概念からデザインパターンまで幅広い技術について、わかりやすく解説しています。
オブジェクト指向プログラミング講座を、紙上で再現したものです。実際の講座の時間は、概要だけなら2時間ぐらい、詳しく説明すると丸1日、プログラミングり実習も行うなら2日間といったところです。この紙上講座で取り上げる内容は、オブジェクト指向プログラミングの概念から始めて、プログラミングテクニック、設計技法、UML、そしてGoFデザインパターンまで、たっぷり盛り込んだ2日間コースに相当します。
この本を読んで、オブジェクト指向設計・プログラミングについて、短時間で理解を深めることができました。
以下、ポイントを整理したメモを掲載します。
第1章 OOPとは何か?
プログラミング技法は何に注目するかにより三つあります。
- 処理 : 処理を通過するときにデータに演算する
- データ : ひとつのデータを操作する複数の処理からなる
- オブジェクト : 複数のオブジェクト間でメッセージを渡す
OOP(Object Oriented Programming)とは、現実世界をそのままプログラムに置き換えることで、「物:Object」に注目してプログラムを作ることです。メッセージとは、他のオブジェクトが持つ処理を行うことで、メッセージパッシングは関数呼び出しのことです。
クラスの概念を初めて取り入れたのは、Simula 67で現実世界をそのままプログラムに置き換えることを目的としていました。Simulaは、シミュレーション(現実世界の置き換え)を意味しています。
開発効率と保守効率を向上するためには、「オブジェクト間の関連を太くしないこと」です。継承、カプセル化、多様性の本質は、オブジェクトの関連を細くすることになります。
第2章 OOPの必須テクニック
クラスは、オブジェクト(オブジェクト=データ+処理)の定義です。
- データ定義 : フィールド、変数、プロパティ、属性
- 処理定義 : メソッド、関数、手続き、動作、振る舞い
オブジェクト間のメッセージパッシングによってプログラムが動作すると考えるのが、OOPの視点です。現実世界で人と人が会って会話するのと同じです。
オブジェクト=クラスのインスタンス(instance:実体)です。
- クラス、はクッキーの型
- オブジェクトは、生地からくりぬかれたクッキーの実体
オブジェクトは、クラスから生成します。クラスのコンストラクタは、オブジェクトが生成された直後に呼び出される特殊なメソッドで初期化処理を行います。
メンバ(メソッド/フィールド)には、二種類あります。
- インスタンスメンバ : オブジェクト名.メンバ名・・・オブジェクトを生成したインスタンスを使用します
- クラスメンバ : クラス名.メンバ名・・・オブジェクトを生成しなくても利用できるクラスメンバを使用します
クラスの使い方には、三種類あります。
- クラスメンバを個別に使う・・・インスタンスメンバ、クラスメンバを使います
- クラスを丸ごと含めて使う : 「集約」 has-a関連 ・・・は~を持っている・・・クラスの中に、他のクラスをデータ型としたフィールドを持ちます
- クラスを丸ごと引き継いで使う : 「継承」 is-a 関連 ・・・は~の一種である・・・クラスを作るときに別のクラスを引き継ぎます
継承元クラスをスーパークラス (上位)、継承先クラスをサブクラス (下位)といいます。
スーパークラスのコンストラクタは、サブクラスに継承されません。スーパークラスの引数無しのコンストラクタが、サブクラスのコンストラクタから自動的に呼び出されます。
第3章 OOPの三本柱と呼ばれるテクニック
OOPの三本柱は、下記の三つです。
- 継承(inheritance インヘリタンス)
- カプセル化(encapsulation エンカプセレーション)
- 多様性(polymorphism ポリモーフィズム)
継承
継承とは、既存のクラスメンバを引き継いで、新たなクラスを作ることです。
- 継承元クラス : スーパークラス、基底クラス、ベースクラス、親クラス
- 継承先クラス : サブクラス、派生クラス、子クラス
汎化とは、複数のクラスに共通したメンバを抽出してスーパークラスを作ることです。クラス図は、サブクラスからスーパークラスに向かって白抜き矢印を書きます。設計時に汎化し、実行時に継承すると考えます。
- 単一継承 : ひとつのスーパークラスだけを継承
- 多重継承 : 複数のスーパークラスを同時に継承
多重継承は、C++では許可されていますが、新しいOOP言語のJavaなどでは禁止されています。便利さ(開発効率)より、シンプルさ(保守効率)を優先したためです。
カプセル化
カプセル化とは、クラスメンバを他のクラスから使えないように隠す機能です。ブラックボックス化するためのものです。
- 非公開 private メンバ クラス外部から使用できない
- 公開 public メンバ クラスを使うときに使用する
フィールドはprivateにして、フィールドを読み書きするpiblicなメソッドを作るとフィールドへの不適切な値が代入されることを防ぎ、運用上の問題が起きない安全なクラスになり、プログラムの保守性が向上できます。
多様性
多様性とは、同じメッセージに対して、オブジェクトごとに異なる応答を返すことです。同様の機能を持っているメソッドには同じ名前を付けることで、複数のクラスに同名のメソッドを記述します。
第4章 OOP言語の学習ゴール
クラスの使い方は、三つあります。
- 通常クラス
- 抽象クラス
- インターフェイス
通常クラス
同じ機能のメソッドを汎化したスーパークラスを作り、メソッドをオーバーライドします。すなわち、スーパークラスから継承したメソッドをサブクラスで同名のメソッドで上書きします。
汎化したので一元管理できるようになります。スーパークラスの配列を使用して、異なるサブクラスのオブジェクトを一元管理し、スーパークラス.メソッド()でサブクラスごとのメソッドを呼び出すことができます。
抽象クラス abstracr class
クラスを抽象クラスで定義すると、抽象クラスのスーパークラスで抽象メソッドの処理内容は不要となります。また、抽象クラスを継承したサブクラスでは抽象メソッドの実装が必須となります。
インターフェイス
抽象メソッドだけ持つ抽象クラスで、「interface クラス名」で定義します。インターフェイス抽象クラスを継承したサブクラスで、インターフェイスの実装を行います。
第5章 UMLとOOD
OOPのための設計をOOD(Object Oriented Design)=オブジェクト指向設計と言います。
UML(Unified Modeling Language)は、統一モデリング言語です。
- 静的なモデリング システムの構造を表す
- 動的なモデリング システムの動作を表す
UML1.5図 | 静的 | 動的 | 説明 |
---|---|---|---|
クラス図 | ○ | クラス | |
オブジェクト図 | ○ | オブジェクト | |
ユースケース図 | ○ | ユーザーから見たシステムの使われ方 | |
シーケンス図 | ○ | オブジェクトのメッセージパッシング(時間軸) | |
コラボレーション図 | ○ | オブジェクトのメッセージパッシング(協調関係) | |
ステートチャート図 | ○ | オブジェクトの状態遷移 | |
アクティビティ図 | ○ | アクション(処理)の流れ | |
コンポーネント図 | ○ | ソフトウェアの構成 | |
デプロイメント図 | ○ | システムの構成 |
第6章 GoFデザインパターン
GoFデザインパターンは、「Design Patterns : Elements of Reusable Object Oriented Software」で23種のパターンを紹介しています。
デザインパターンは、OODに役立つパターンで再利用可能であり、デザインパターンのアイデアを学び応用するものです。
Factory Methodパターン
Factory Method(工場メソッド)パターンは、オブジェクトの生成を容易にするデザインパターンです。クラスのメンバの中に、関連するクラスのインスタンスを生成するメソッドを用意するアイデアです。
Builderパターン
Builder(構築者)パターンは、オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にします。インスタンスの生成と初期化処理を別のクラスで行うアイデアです。ディレクタクラスとは、適切な順序でメソッドを呼び出して作成過程を決定するクラスです。Builderパターンは、ビルダクラス(構築者)とディレクタクラス(管理者)より構成します。
Adapterパターン
Adapter(接続装置)パターンは、インターフェイスに互換性の無いクラス同士を組み合わせることを目的としたパターンです。2つのクラス間に別のクラス(アダプタクラス)を仲介させて、両者を結びつけるアイデアです。
Facadeパターン
Facade(見かけ)パターンは、複雑な内部処理を隠蔽して、利用者にシンプルなインターフェイスを提供するパターンです。複数のクラスを使って実現される機能をひとつのクラス(ファサードクラス)のメソッドにまとめてしまうアイデアです。
Chain of Responsibilityパターン
Chain of Responsibility(責任の連鎖)パターンは、ある要求の受け取り対象となる複数のオブジェクトに鎖状の関係を構築し、要求を処理することが可能なオブジェクトに渡るまで、鎖状の関係に沿って要求を受け流していくパターンです。複数のオブジェクトを鎖のようにつないで、順番にメッセージを受け渡していくというアイデアです。
Mediatorパターン
Mediator(調停者)パターンは、複雑に絡み合う複数のオブジェクト間の関係を「仲介者」 を介して処理を行うようにすることで、単純かつ明快なインターフェイスを提供するパターンです。連携する複数のオブジェクトの中に調停者となるオブジェクトを置くことで、メッセージのやりとりを整理するというアイデアです。
第7章 プログラミングに関するQ&A
三階層アーキテクチャ・・・層ごとに機能を独立させ、再利用と保守性を高める
- プレゼンテーション層 : ユーザー入出力
- アプリケーション層 : データを演算
- データベース層 : ファイル入出力
MVCモデル
- Model : 核となる演算
- View : ユーザーインターフェイス
- Controller : 全体の制御
第8章 プログラミング実習
Java と Visual Basic .NET を使用して、本書に説明したサンプルプログラムが掲載されて実際に動作させることができるようになっています。