C++言語解説:2.オブジェクト指向プログラミング
2002-07-06

●オブジェクト指向プログラミングとは

 ◆構造化プログラミングで見えてきた課題
  
  ・今まで構造化プログラミングについて学習してきました。構造化プログラミングで
   はある分量から開発と保守が難しくなる
と説明しましたがそれは何故でしょうか。
  
  ・複雑なソフトウェアの場合、ユーザ自身ですら要求仕様の全貌を把握できないこと
   がほとんどです。従って一次開発後の変更や機能追加は「行われて当然」のものと
   なりつつあります。
  
  ・構造化プログラミングの場合、要求仕様を動作の分析/実装に合わせて構造化し、関
   数単位でプログラミングを行っていきます。つまり関数の機能はすでに構造の一部
   を体現しています。ある機能の追加が構造変更を必要とする場合、それが全体へ影
   響を及ぼしてしまうこともあります。故に開発当初に想定していなかった要求には
   応えることができないケースも多い
のです
  
  ・しかし状況がそれを許さない場合、まさに悪夢のようなコーディングを重ね、著し
   く保守性の低いソフトウェアが出来上がってしまいます。
  
  ・つまり、見えてきた課題をまとめると以下の3点になります。
     ユーザ視点のシステム開発
     拡張性の確保
     保守性の向上
   これに対する答えが「オブジェクト指向プログラミング」なのです。
 
 
 ◆ユーザ視点:コンピュータ上でシミュレート
 
  ・オブジェクト指向言語の原点は「Simula」と呼ばれるシミュレーション用言語だと
   言われています。それはシミュレーションが「現実で行われていることをコンピュ
   ータ上で仮想的に実行する」ことだからです。
  
  ・コンピュータでソフトウェアを開発する以上、何らかの形でモジュール化を行うわ
   けですが、ユーザの視点から見た対象物(オブジェクト)を中心にモジュール化して
   いくプログラミング手法がオブジェクト指向プログラミングです。

  
  ・シミュレーションという作業はユーザ視点で、システムを仮想的に動作させるもの
   です。従って「ユーザ視点」で何かを実行するための仕掛けを持っています。シミ
   ュレーション用言語である「Simula」がオブジェクト指向言語の原点になった理由
   です。

 
 
 ◆拡張性と保守性の向上
  
  ・オブジェクト指向では、分析段階からユーザ視点の処理対象物を「クラス」で分類
   します。クラスは対象物の性質や振る舞いを持つ単位となります。しかしクラスは
   あくまで「雛形」であり、雛形に中身(インスタンス(instance))を入れて整形した
   ものがオブジェクト
となります。
  
  ・例えば「饅頭」クラスの「具」属性に「肉」というインスタンスを設定したオブジ
   ェクトが「肉まん」です。「ピザ」をインスタンスに設定するとオブジェクト「ピ
   ザまん」ができます。
  
  ・そしてこれらのオブジェクトが連携してシステムを形成するわけですが、その連携
   を表現する仕組みとして以下のものがあります。これには表現方法以外に拡張性と
   保守性も考慮されています。
     継承 .............(inheritance)
     多態性 ...........(polymorphism)
     カプセル化 .......(encapsulation)
     メッセージ送信 ...(message sending)
     関連 .............(association)
     集約 .............(aggregation)
  
  ・C++に限らず、オブジェクト指向言語と呼ばれるものは、クラスに対して上記の操作
   を可能とする機能が組み込まれています。つまり、プログラミング言語のオブジェ
   クト指向的機能はオブジェクト指向分析/設計と密接に絡んでおり、多少表現方法は
   違っても、実現しようとする機能は言語によらずほとんど同じ
なのです。
  
  ・以降このテキストでは、C++のオブジェクト指向に関する機能を見ていきますが、実
   際にシステム開発を行う際は、別途オブジェクト指向分析/設計についても学習が必
   要である点は認識下さい。
  

[Revision Table]
 |Revision |Date    |Comments
 |----------|-----------|-----------------------------------------------------
 |1.00   |2002-07-06 |初版
 |1.01   |2002-07-07 |リンク追加
[end]
Copyright(C) 2002 Altmo