ソフトウェア開発におけるオブジェクト指向の開発事例

今回はオブジェクト指向について記載させていただきます。

とはいえ、教科書にのっているようなオブジェクト指向の共通事項については最小限にとどめ、オブジェクト指向って実際にどう役に立っているの?利用されているの?といった観点から現場での応用例についてご紹介いたします。

教科書によればオブジェクト指向には

「継承」「ポリモーフィズム」「カプセル化」

といった性質があります。

それぞれについて教科書で詳しく説明されていますが、現場での利用例が今一わからないという方が多いと思います。
そこで私の独断と偏見で「継承」「ポリモーフィズム」の利用例について紹介させていただきたいと思います。(「カプセル化」についてはオブジェクト指向の仕事の中でプログラミングをしながら、必然的にその感覚は身につきますので割愛させていただきます)。

オブジェクト指向開発例(その1)

オブジェクト指向を利用することで入口の統一化を図る。

例えばカメラ製品では

  • エントリー、スタンダード、アドバンスといった、グレード、機能に違いがあるもの
  • FA(Factory Automation)向け、汎用向けというような対象ユーザーの違いがあるもの
  • ナノレベル、数m単位で識別可能といった検査対象に違いがあるもの

のように、核となる部分は同じだけど、オプション部分はグレードのよって違いが生じる製品を制御するソフトウェアを開発する場合、オブジェクト指向を採用することが適しています。
理由はオブジェクト指向はソフトウェアをいろいろと使い道がある部品の集合として設計しやすいという点もあります。その部品に相当するものがクラスに相当します。

そして他にもいろいろと使い道がある部品ということですから、クラス内で定義するメソッド名や引数の形(インタフェース)はそれを意識したものとします。
いわゆる汎用性に優れた部品にするということです。例えば当初はカメラ用に作成した部品だけど、顕微鏡にも使えるかもしれない部品ということです。
そういった部品の開発の流れをカメラを例に私の経験から紹介いたします。

  • フォーカス機能を担うクラス名と内部のメソッド名の形を先に決めてしまう(抽象クラスの作成)。
  • 先の抽象クラスを「継承」したカメラのグレードごとのクラスをそれぞれ設計する(先の例でいえばエントリークラス、スタンダードクラス、アドバンスクラスといった類の名前のクラスを3つ作成する。)
  • 上で作成した核グレードごとのクラス内のフォーカス関数の処理について各々、設計する(「ポリモーフィズム」を意識する)。

例えば、エントリークラスでは手振れによるピンぼけは許容、スタンダードクラスは手ぶれ補正を追加、アドバンスクラスは連続撮影機能を追加等、同じフォーカス関数でもグレードによって中身が変えます。

オブジェクト指向は、具体的な中身は決まっていなくても、方針だけきちんと決まっている状況で開発を開始する場合、便利です。
また、カメラのシリーズ化やグレードの追加等により種類が増えても柔軟に対応しやすいです)。

オブジェクト指向開発例(その2)

オブジェクト指向を利用することで仕事を減らす。
再度、カメラ製品による例えとなってしまい、申し訳ありませんが、下位互換のクラスを作る場合、楽ができます。

例えば、アドバンスシリーズを下位互換にもつスーパーアドバンスシリーズの新製品開発を行うとしましょう。
この場合、スーパーアドバンスクラスの機能のうち、アドバンスシリーズと共通する機能は、全く新規に作成する必要なく、同機能を搭載できます。
方法はスーパーアドバンスクラスがアドバンスクラスを「継承」することで、アドバンスクラスのもっていた機能がスーパーアドバンスクラスでも使えるようになります。

すでに存在するクラスと同じようなクラスを新たに設計する場合、共通する部分は必ずしも新規に設計する必要がありません

最後にオブジェクト指向を利用する上で、気をつけて頂きたいことを記載いたします。

オブジェクト指向で設計すること=「継承」「ポリモーフィズム」を意識したクラス間の構成を考えること

もちろん「継承」「ポリモーフィズム」を無視してもオブジェクト指向言語を利用することはできます。
(C++でC言語のコードを書くことも可能、java言語で全く依存関係がないクラスを作成することも可能)。
ですが、この場合、オブジェクト指向言語を利用するメリット、意味がほぼ0に近いといっても過言でないでしょう。

20年程前はソフトウェア設計というと手続き型プログラミングがまだ主流でした(代表的な言語としてはC言語です)。ただし、この手法では新たに同じようなものをつくろうとした場合でも0から同じような設計をしなおす必要がありました。
移植性に乏しかったのです。
そこで、すでにあるものを利用してソフトウェアを効率よく作成するための方法の検討が始まり、結果、オブジェクト指向という考え方が生まれました。
このようにオブジェクト指向は人間の性である本質的な怠惰から生まれてものともいえるかもしれません。

人間は本質的に怠けものです(そのおかげで、様々な便利な家電が生まれてくるということでもありますが))。
これからソフトウェア開発を志す方はオブジェクト指向の熟練者を目指してほしいと思います。

もし、何か興味がある課題がありましたら、コメント頂ければうれしいです。

  • B!