Visualization Tool Kit(VTK)など

C++による開発のコアはクラス化にあるわけではない.継承のなされていないクラスをやたらと増やしても意味がないどころか,コードは膨張し多くのバグを含むことになるだろう.
では,重要な要素は何かを考えると抽象化をキーワードとして挙げられよう.クラス設計を行うとは,まさしくそのクラスがもつ機能や要素を抽象化することにすぎない.
では,抽象化がなぜ開発効率の向上に寄与するのかというと,具体的な部分を入れ替えることが可能となるからである.

例1 継承による実装の抽象化
 class Shape
 {
    virtual void Draw() = 0
 };

 class Circle : public Shape
 {
    virtual void Draw(); //実装
 }

ViewClass::Draw()
{
 Shape *p = GetShape(); //
 p->Draw();
}

上の場合は,ViewClassは具体的な図形について知る必要はない.言い換えると,Shapeの派生クラスがどれだけ追加されようとViewClassを変更する必要はない.すなわち,これは"インターフェイスの再利用"をしていることになる.同様に非仮想関数が意味することはインターフェイスだけでなく実装を再利用していることになる.すなわち,非仮想関数の継承はほぼサブルーチンと同意と考えて良い.

一方,テンプレートでは,型に依存しないアルゴリズムをテンプレート化することでアルゴリズムを再利用できる.下のような単純な例は分かりやすいだろう.
  template<typename Ty>
  Ty Max(Ty a, Ty b) { return ( a > b ? a : b); } 

最後にテンプレートを用いた関数オブジェクトについて述べておくと,これはアルゴリズムの抽象化にあたる.例えば std::sortという関数は,入力したコンテナについて,"何らかのルールで並べ替える"という関数である.わかりやすくソートという機能が抽象化されていることがわかると思う.ここで"何らかのルール"を関数オブジェクトで渡すことで,"具体的なソート"が完成する.

  std::sort( data.begin(), data.end(), /*ルール*/);

  template<typename Ty>
  struct less_than
  {
    bool operator()(Ty a, Ty b) { return a < b; };
  };

  struct less_than_in_abs
  {
    bool operator()(Ty a, Ty b) { return std::abs(a) < std::abs(b); };
  };

  std::sort( data.begin(), data.end(), less_than() ); //ちなみにless_than()の括弧はoperator()ではなくコンストラクタである
  std::sort( data.begin(), data.end(), less_than_abs() );

継承とは,派生によりアルゴリズムの再利用やアルゴリズムの交換(インターフェイスの再利用)を実現する動的な言語仕様
テンプレートとは,使用する型や関数オブジェクトを入れ替えることで,アルゴリズムの再利用やアルゴリズムの交換(インターフェイスの再利用)を実現する静的な言語仕様

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー

チュートリアル

アルゴリズム(数学)

並列計算

STL

#include<memory> #include<string> #include<sstream> #include<algorithm> #include<functional> #include<numeric>

Media Foundation

【メニュー編集】
Wiki記法ガイド

メンバーのみ編集できます