拡張性とは、将来の成長を見据えたソフトウェアエンジニアリングおよびシステム設計の原則です。拡張性とは、システムを拡張する能力と、その拡張を実現するために必要な労力のレベルを示す指標です。拡張は、新しい機能の追加、または既存の機能の変更によって行うことができます。この原則は、既存のシステム機能を損なうことなく、機能強化を可能にします。
拡張可能なシステムとは、内部構造やデータフローが新しい機能や変更された機能によってほとんど、あるいは全く影響を受けないシステムのことです。例えば、システムの動作を開発者や他のプログラマーが変更する場合、元のソースコードを再コンパイルしたり変更したりする必要がない場合があります。 [ 1 ]ソフトウェアシステムは長寿命であり、ユーザーが要求する新機能や追加機能のために変更されるため、拡張性によって開発者はソフトウェアの機能を拡張または追加することができ、体系的な再利用が容易になります。そのアプローチには、ユーザー独自のプログラムルーチンを挿入できる機能や、新しいデータ型や新しい書式マークアップタグを定義できる機能などがあります。[ 2 ]
ソフトウェアエンジニアリングにおける拡張可能な設計とは、すべてを事前に設計できるわけではないことを受け入れることです。代わりに、変更を可能にする軽量なソフトウェアフレームワークが提供されます。拡張性の要素を失わないように小さなコマンドが作成され、作業要素を理解可能な単位に分離するという原則に従って、凝集度の低さや結合度の高さといった従来のソフトウェア開発の問題を回避し、継続的な開発を可能にします。変更を受け入れることは拡張可能な設計に不可欠であり、追加は継続的に行われます。システムの各部分はあらゆる変更に対応でき、追加による変更という考え方がシステム全体の設計の中心となります。拡張可能な設計は頻繁な優先順位の見直しをサポートし、要求に応じて小さなステップで機能を実装することを可能にします。これは、アジャイル手法や反復開発で推奨されている原則です。拡張性により、開発中の依存関係が少なくなり、よりクリーンになり、結合度が減り、より凝集性の高い抽象化と明確に定義されたインターフェースが実現します。[ 3 ]
ソフトウェアは人間によって開発および保守される「進化する実体」であるため、ソフトウェアの仕様と実装に継続的なシステム変更が生じることから、人間の現象により、すべてのソフトウェアの根底には気まぐれさが存在します。ソフトウェアのコンポーネントは、多くの場合、無関係の当事者によって独立して開発および展開されます。外部ベンダーのコンポーネントは、製造元以外のサードパーティのユーザーを考慮に入れると、既製品として特定の展開シナリオに適合する可能性が低いため、適応可能なソフトウェアコンポーネントが必要です。多くのソフトウェアシステムとソフトウェア製品ラインは、共通のソフトウェアアーキテクチャ、または場合によっては機能と実装の大部分を共有するベースシステムから派生していますが、拡張可能なベースシステムを必要とする異なるコンポーネントを備えている可能性があります。[ 4 ]
独立して拡張可能なソフトウェアシステムを構築することは重要な課題です。独立して拡張可能なシステムでは、2人が独立してシステムの拡張機能を開発できるだけでなく、グローバルな整合性チェックなしに2つの拡張機能を組み合わせることもできます。[ 5 ]
ソフトウェアの拡張性には、ホワイトボックス拡張性、グレーボックス拡張性、ブラックボックス拡張性の3つの異なる形態があり、これらは変更される成果物とその変更方法に基づいています。
この拡張性では、ソースコードを修正することでソフトウェアシステムを拡張でき、最も柔軟で制約の少ない形式です。変更の適用方法に応じて、オープンボックス拡張性とグラスボックス拡張性の2つのサブ形式があります。
オープンボックス型の拡張可能なシステムでは、変更は侵襲的に行われます。つまり、元のソースコードに直接手を加えることになります。そのため、利用可能なソースコードと、変更が許可されているソースコードライセンスが必要です。オープンボックス型の拡張性は、バグ修正、内部コードのリファクタリング、またはソフトウェア製品の次期バージョンの開発に最も適しています。
グラスボックス型の拡張性(アーキテクチャ駆動型フレームワークとも呼ばれる)では、利用可能なソースコードを用いてソフトウェアシステムを拡張できますが、コード自体の変更は許可されない場合があります。拡張機能は、元のシステムに影響を与えないように、元のシステムから分離する必要があります。この拡張性の一例として、オブジェクト指向アプリケーションフレームワークが挙げられます。オブジェクト指向アプリケーションフレームワークは、通常、継承と動的バインディングを用いて拡張性を実現します。
ブラックボックス拡張性(データ駆動型フレームワークとも呼ばれる)では、システムの実装に関する詳細はデプロイメントや拡張の実装には使用されず、インターフェース仕様のみが提供されます。このタイプのアプローチは、さまざまなホワイトボックスアプローチよりも制限があります。ブラックボックス拡張は通常、システム構成アプリケーション、またはコンポーネントインターフェースを定義するアプリケーション固有のスクリプト言語の使用によって実現されます。
グレーボックス拡張性は、ソースコードの公開に完全に依存しない、純粋なホワイトボックスと純粋なブラックボックスのアプローチの中間的な妥協案です。プログラマーには、改良に利用可能なすべての抽象化と、拡張機能の開発方法に関する仕様を一覧表示するシステムの特殊化インターフェースが提供される場合があります。[ 6 ]
拡張性と再利用性には、低結合性、モジュール性、高リスク要素がさまざまなソフトウェアシステム向けに構築できる能力など、多くの共通する重要な特性があります。これは、ソフトウェアシステムが共通要素を共有することが多いという観察に基づいています。再利用性と拡張性を組み合わせることで、開発と保守の時間を短縮し、信頼性と一貫性を向上させながら、テクノロジーを別のプロジェクトに移行できます。[ 7 ]
現代のオペレーティングシステムは、デバイスドライバやロード可能なカーネルモジュールを通じて拡張性をサポートしています。多くの現代のアプリケーションは、プラグイン、拡張言語、アプレットなどを通じて拡張性をサポートしています。拡張性の向上傾向は、ソフトウェアのセキュリティに悪影響を及ぼします。[ 8 ]
CGI(Common Gateway Interface)は、Webサーバーが拡張性を提供する主要な手段の1つです。CGIスクリプトを「巨大なセキュリティホール」と見なす人もいます。[ 9 ]
Wiktionaryにおける拡張性の辞書定義