ソフトウェアコンポーネントとは、
ソフトウェアシステムを構成する独立した部品のことです。システムを機能ごとに分割し、それぞれの機能を
カプセル化した再利用可能な
モジュールとして扱います。この設計手法は、コンポーネントベース
ソフトウェアエンジニアリング(CBSE)と呼ばれ、
ソフトウェア工学の重要な分野の一つとなっています。
コンポーネントの基本概念
コンポーネントは、
ソフトウェアパッケージ、
Webサービス、ウェブリソース、または関連機能とデータを
カプセル化した
モジュールとして存在します。各コンポーネントは、内部データと関数が密接に関連しており、「モジュラー」で「統一的」であると言えます。
インタフェース
コンポーネントは、システム全体で協調して動作するために、インタフェースを通じて相互に通信します。あるコンポーネントがサービスを提供する際、他のコンポーネントが利用できるインタフェースを公開し、その使用方法を示します。このインタフェースは、コンポーネントの「署名」と見なすことができ、利用側はコンポーネントの内部実装を知る必要はありません。これにより、コンポーネントは「
カプセル化」されます。UMLのコンポーネント図では、このインタフェースはロリポップ記号(白丸)で表現されます。
一方、コンポーネントが機能するために他のコンポーネントを必要とする場合、使用するインタフェースも定義されます。UMLのコンポーネント図では、この使用インタフェースはソケット記号(半円)で表され、他のコンポーネントが公開しているインタフェースと接続する形で表現されます。
置換可能性
コンポーネントの重要な特性の一つに「置換可能性」があります。同じインタフェースを持つコンポーネントは、設計時または実行時に相互に置換可能です。これにより、システムの動作を損なうことなく、コンポーネント単位でのバージョンアップや実装の変更が柔軟に行えます。
一般に、コンポーネントBがコンポーネントAを置換できる場合、コンポーネントBはコンポーネントAの機能全てを提供し、コンポーネントAが依存する他の要素以外を必要としない必要があります。
実装
ソフトウェアコンポーネントは、
オブジェクト指向プログラミングではオブジェクトまたはオブジェクトの集合として実装されることが多いです。また、インタフェース記述言語(IDL)に従った
バイナリやテキスト形式で表現されることもあります。後者の場合、コンポーネントは他のコンポーネントから独立して存在します。
コンポーネントがネットワーク経由で
アクセスまたは共有される場合、シリアライズ(マーシャリング)によってビットストリームに変換される必要があります。
再利用性
高品質な
ソフトウェアコンポーネントは、再利用性が重要な特徴です。再利用可能なコンポーネントを作成するには、以下の要件を満たす必要があります。
文書化: 完備したドキュメントが必要です。
評価: 十分な評価がなされている必要があります。
堅牢性: 入力値の妥当性チェックが必要です。
エラー処理: 適切なエラーメッセージやリターンコードを返す必要があります。
予期しない利用: 想定外の使用方法にも対応できる必要があります。
初期の取り組み
1960年代には、科学技術計算用のサブルーチンライブラリが登場しましたが、商用システムではアセンブリ言語やCOBOLなどで書かれた再利用可能なモジュールが利用されていました。
コンポーネント概念の提唱
ソフトウェアのコンポーネント化という概念は、1968年にダグラス・マキルロイがNATOのソフトウェア工学会議で「大量生産されたソフトウェアコンポーネント」という論文で発表したのが最初です。彼はUNIXオペレーティングシステムのパイプとフィルターでこの概念を初めて実装しました。
ブラッド・コックスは、コンポーネントを「ソフトウェアIC」と呼び、Objective-Cを開発してこの概念を広めようとしました。しかし、ソフトウェアICは物質であるシリコンICとは異なり、市場での売買は成立しませんでした。
コンポーネントモデルの発展
IBMは1990年代初期にSystem Object Model (SOM) を提唱し、マイクロソフトのOLEやCOMが登場したことで、ソフトウェアコンポーネントモデルが普及しました。現在では、再利用可能なコンポーネントは、データ構造とアルゴリズムをカプセル化し、オブジェクト指向プログラミングの理論に基づいて構築されています。
オブジェクト指向プログラミング(OOP)は、実世界の相互作用をモデル化し、「動詞」と「名詞」を抽出してソフトウェアを開発します。一方、ソフトウェアコンポーネントは、事前に作成されたコンポーネントを組み合わせてソフトウェアを構築することを重視します。
コンポーネントはオブジェクトほど直感的ではなく、エンドユーザーによるプログラミングには悲観的な立場です。この考え方に基づき、コンポーネント指向プログラミングという新しいパラダイムを提唱する人もいます。
この違いは、ドナルド・クヌースとエドガー・ダイクストラの論争にまで遡ることができます。クヌースは直感と形式モデルの融合を提唱し、ダイクストラはプログラミングを数学の一分野と見なしました。
複数のソフトウェアコンポーネントを実行するコンピューターはアプリケーションサーバーと呼ばれます。アプリケーションサーバーとソフトウェアコンポーネントの組み合わせは、分散コンピューティングの一種であり、金融アプリケーションやビジネスソフトウェアで使用されます。
コンポーネントモデル
コンポーネントモデルは、コンポーネントの実装、ドキュメンテーション、および配備に関する標準を定義します。EJBモデル(Java)、COM+モデル(.NET)、CORBAコンポーネントモデルなどがあります。これらのモデルは、インタフェースの定義方法や、インタフェース定義に含めるべき要素を指定します。
主な技術
ソフトウェアコンポーネントに関連する技術は多岐にわたります。
ビジネスオブジェクト技術: Newi
特定領域向けのコンポーネントベースのソフトウェアフレームワーク: Earth System Modeling Framework (ESMF)
コンポーネント指向プログラミング: OSGi Service Platform で定義された
バンドルなど
ウェブプラットフォーム: Component - js、ccs など
言語: Eiffel言語, Oberon言語や Component Pascal
ライブラリ: Visual Component Library (VCL), Lazarus Component Library (LCL) など
Microsoft: .NET における System.ComponentModel, Visual Basic Extension, OCX/ActiveX/COM, DCOM
その他: Unity3D, UNO, XPCOM, TECS
複合文書技術: Oberonにおける Active Documents, Bonobo, KParts, Object Linking and Embedding (OLE), OpenDoc, Fresco
分散コンピューティング: .NET Remoting, Windows Communication Foundation (WCF), 9P, CORBA, D-BUS, DCOP, DCOM, DSOMとSOM, Jakarta EE, Universal Network Objects (UNO)
Webサービス: Representational State Transfer (REST), Zope
*
その他: ジェネリックプログラミング, インタフェース記述言語 (IDL), 制御の反転 (IoC), パイプとフィルター
まとめ
ソフトウェアコンポーネントは、
ソフトウェア開発の効率と柔軟性を高める上で不可欠な概念です。コンポーネントの再利用性を高めることで、開発コストを削減し、
ソフトウェアの信頼性を向上させることができます。本記事で紹介した知識を基に、コンポーネント指向の
ソフトウェア開発を実践してみてください。