これで分かるオブジェクト指向入門 基本編 #2-最近のオブジェクト指向

これで分かるオブジェクト指向入門 基本編 #2-最近のオブジェクト指向
C++_image

はじめに

この連載では,オブジェクト指向を学んだ視点から見て,オブジェクト指向を実際に扱えるようになることを目指して解説していきます.
基本編では,実際にオブジェクト指向プログラミングを行うために,必要な概念を大まかに解説していきます.

また,本連載では,オブジェクト指向についてはさっぱり分からないけれど,CやArduino, Pythonなどのプログラミング言語なら一つでも触ったことがあるような人を想定しています.

前回の記事はこちら
#1-最初のオブジェクト指向

概要

基本編 #2では,C++などの現在広く使用されている言語におけるオブジェクト指向の考え方を解説します.
モジュール化という考え方からクラスとオブジェクトへの進化,そして前回の「メッセージング」との類似点について記します.

用意するものは,まだ何もありません.

モジュール化

オブジェクト指向の前に,まずはモジュール化という概念を扱います.

ソフトウェア危機

1960年代,ソフトウェアはどんどん巨大で複雑なものになっていきました.当時の手法では開発が追いつかず,期限に間に合わなかったり,予算オーバーになったり,低品質なソフトウェアが生み出されたりすることが大きな問題になりました.この問題はソフトウェア危機(Software crisis)と呼ばれ,その対策として構造化プログラミングやオブジェクト指向などの手法が生まれることになりました.

そのどちらとも密接に関係する考え方が,モジュール化(Modular programming)です.

モジュール化とは

モジュール化は,大きなソフトウェアやシステムをモジュールという単位に分割することで,それをブラックボックス化して再利用や補修などを容易にし,開発効率やソフトウェア品質を高めるという考え方です

modular_programming_image
モジュール化の簡単なイメージ

Cの場合は,ソースファイルとヘッダファイルを用意して,ヘッダファイルをincludeすることでソフトウェアを分割できます,Pythonの場合は,ソースファイルをimportすることでソフトウェアを分割できます.Pythonはモジュール化を明示的にサポートしていて,このソースファイルをモジュールと呼びます.

キューに見るモジュール化の問題点

モジュール化は現在でも広く使用されている考え方ですが,これだけではうまく実装できないものもあります.例として,キュー(Queue)を実装する場合を考えます.

キューは,FIFO構造をもつデータ構造で,タスクや通信のデータなどをバッファリングするために使われることが多いです.今回は,データを入れるPut,データを取り出すGet,データを数えるCountの3つの機能を持つこととします.

queue
今回考えるキューの図

このキューをモジュールとして実装する場合,どのような問題が起こるでしょうか.キューの実装に必要なのは,データを入れる配列と,処理を行う3つの関数です.これをモジュールとして実装した場合,配列は一つのモジュールに一つしか持つことができません.ですから,複数のキューが欲しい場合は複数のモジュールをロードする必要があります.すると,名前の違うソースファイル(とヘッダファイル)をいくつも用意することになります.

これなら,配列を渡すとキューとして扱ってくれるモジュールを作ったほうが良いようにさえ思えます.しかし,データと関数は一つにまとめて美しいソフトウェアにしておきたいところです.

まとめ

モジュール化だけではデータを一つしか持つことができないため,キューのような抽象的なデータをいくつも実装するには不十分です

抽象データ型

そこで,キューのような抽象的なデータを効率的に実装するために生まれたのが,抽象データ型(Abstract data type, ADT)です.

抽象データ型とは

通常のデータ型は,intやboolやstringなどのデータに名前をつけて宣言することができます.抽象データ型は,同じように名前をつけて宣言できますが,データとその操作を行う手続きがセットになっています.抽象データ型では,この手続きだけが内包するデータを扱うことができるので,より効率的で美しいソフトウェアを実現できます.また,抽象データ型は,その定義を記述するだけで複数の実体をたくさん作ることができるので,修正や改良が容易になります.

キューを実装した場合

先程のキューを抽象データ型を使って実装するとどうなるでしょうか.Put,Get,Countの3つの手続きが配列とセットになり,たくさんのキューを一つの抽象データ型で生成することができます.

Queue ADT
キューの実体をスタンプのようにして生成できる

それぞれの実体に対して3つの手続きが存在するので,抽象的なデータ自身が,それを操作するための方法を知っていることになります.

Smalltalkのオブジェクト指向との類似点

ここで前回の内容を思い出してください.

“1” というオブジェクトは,それ自体が “+ 2” に対する振る舞いを知っていて,メッセージを受けると自分自身に対して引数に応じた “+” の処理を行います.

これらはとても似ていませんか? 抽象データ型は,データ自身が振る舞いを知っているという点において,Smalltalkのオブジェクト指向と似ているのです.データ自身が処理の方法を知っているので,プログラマはとても楽になります.データを複雑で面倒なものから,賢くて抽象的なものに変えることこそが,オブジェクト指向の本質なのです

まとめ

抽象データ型は,データとその操作を強く結びつけることで,データを賢いものにします,また,そのまとまりをブラックボックス化することで,効率的で美しいソフトウェア開発を可能にするのです

クラスとオブジェクト

それでは,いよいよクラスとオブジェクトに移ります.クラスは,抽象データ型を改良してポリモーフィズムと継承という考え方を導入したものです.オブジェクトは,抽象データ型によって生成される実体のようなものです.この2つについては長くなってしまうので,次回説明することとします.
抽象データ型とクラスはとても似た存在です.その違いには諸説ありますが,上位互換であることに違いはありません.

クラスが持つ基本的な性質は抽象データ型と同じなので,これだけでも理解しておけばオブジェクト指向への理解が深まると思います.