コンピューティングにおいて、主体指向プログラミングはオブジェクト指向ソフトウェアパラダイムであり、オブジェクトの状態(フィールド)と動作(メソッド)はオブジェクト自体に固有のものではなく、オブジェクトのさまざまな主観的認識(「主体」)によって提供される。この用語と概念は、1993 年 9 月に会議論文[ 1 ]で初めて発表され、後に 1986 年から 1996 年の間に会議で発表された最も影響力のある 3 つの論文の 1 つとして認められた[ 2 ]。この論文で示されているように、「現実の」オブジェクトの特性に関するプラトンとカントの哲学的見解の対比との類推が、ソフトウェアオブジェクトに適用されている。例えば、私たちは皆、木には高さ、重さ、葉の質量など、測定可能なものがあると認識するかもしれないが、鳥の視点から見ると、木には食料や営巣場所としての相対的な価値という尺度があるかもしれないし、税務査定官の視点から見ると、特定の年に課税対象となる価値があるかもしれない。鳥や税務査定官が持つこうした追加的な状態情報は、必ずしも木に内在するものではなく、鳥や税務査定官の認識によって付け加えられたものであり、カントの分析によれば、私たちが内在的だと考える特性についても同じことが言えるかもしれない。
主題指向プログラミングは、オブジェクトを記述するクラスを「主題」に組織化し、それらを組み合わせてより大きな主題を形成することを提唱しています。フィールドやメソッドへのアクセスポイントでは、複数の主題の貢献を組み合わせることができます。これらのポイントは、主題の結合点[ 3 ]として特徴付けられました。たとえば、木が切り倒される場合、関連するメソッドは、鳥と税務査定官の主題の振る舞いを、木自身の振る舞いと結合する必要があるかもしれません。したがって、これは基本的に、アルゴリズム的(手続き型)または表現隠蔽(オブジェクト)的性質とは対照的に、ソフトウェア開発の構成的性質に関する見解です。
1997年にアスペクト指向プログラミングが導入されたことで[ 4 ]、主体指向プログラミングとの関係や、主体とアスペクトの違いについて疑問が生じました。これらの疑問はしばらくの間未解決でしたが、1999年に出願されたアスペクト指向プログラミングに関する特許[ 5 ]で取り上げられ、その特許では、従来の技術との特徴的な違いとして2つの点が明らかになりました。
主観的視点では、クロスカットはアスペクト(主観)とは別に配置され、動作はアスペクトによって強制されるのではなく、構成の規則によって制御されます。Hindsight [ 6 ]では、クエリのようなポイントカットの概念を導入して活用することで、アスペクトが一般的に使用する結合点を外部から強制し、アスペクト指向プログラミングを区別することも可能になります。
主題指向プログラミングの説明では、ジョインポイントはフィールドアクセスとメソッド呼び出しに意図的に制限されていました。これは、適切に設計されたフレームワークが機能拡張を受け入れるように設計されているポイントがそれらであるという理由からです。外部から課せられたポイントカットの使用は重要な言語機能ですが、アスペクト指向プログラミングの最も議論の的となる機能の1つです。[ 7 ]
2000年代初頭には、多くの研究グループが、個別にパッケージ化された状態と機能の組み合わせや付加を利用してオブジェクトを形成するさまざまな技術を追求していることが明らかになった。[ 8 ]共通の関心分野を、特定の特許定義を持つアスペクト指向プログラミングと区別し、構成技術がソフトウェア開発のコーディング段階だけにとどまらないことを強調するために、これらの技術はアスペクト指向ソフトウェア開発という用語の下にまとめられ、[ 9 ]このテーマに関する国際会議の組織化とシリーズが始まった。アスペクト指向プログラミングと同様に、主題指向プログラミング、構成フィルタ、機能指向プログラミング、適応メソッドは、アスペクト指向ソフトウェア開発アプローチとみなされている。
主題指向プログラミングの当初の定式化では、関数とデータ型の空間をどちらの方向にも拡張できるパッケージング技術として意図的に構想されていました。最初の実装はC++ [ 10 ]とSmalltalk [ 11 ]向けでした。これらの実装では、ソフトウェアラベルと構成ルールの概念を利用して主題の結合を記述しました。
ソフトウェアの分析と構成のためのより良い基盤を、パッケージングだけでなく、これらのパッケージが対処するさまざまな懸念事項の観点から提供する必要があるという懸念に対処するために、懸念事項がそれを実装するソフトウェアユニットに関連付けられる多次元「マトリックス」の観点から資料の明示的な組織化が開発されました。この組織化は関心の多次元分離と呼ばれ、それを記述した論文[ 12 ]はICSE 1999会議で最も影響力のある論文として認められています。[ 13 ]
この新しい概念は、Hyper/Jというツール名を使用してJavaソフトウェアを構成するために実装されました。 [ 14 ]
構成と主体の概念は、要求仕様やドキュメントなど、実行可能な意味を持たないソフトウェア成果物にも適用できます。Eclipse の研究用ツールであるConcern Manipulation Environment (CME) が説明されています[ 15 ] 。このツールでは、クエリ、分析、モデリング[ 16 ]、および構成のためのツールが、適切なプラグインアダプタを使用して表現を操作することにより、あらゆる言語または表現の成果物に適用されます。
Hyper/J 合成エンジン[ 17 ]の後継として、合成エンジンのいくつかの要素に対して一般的なアプローチを採用した CME の一部として開発されました。
Hyper/JとCMEはそれぞれalphaWorks [ 18 ]またはsourceforge [ 19 ]から入手可能ですが、どちらも積極的にサポートされていません。
オブジェクト指向プログラミングにおけるメソッドディスパッチは、実行されるコードがメソッド名と対象オブジェクトの両方に依存するという意味で「二次元」と考えることができます。これは、プロシージャ名が直接的、つまり一次元的にサブルーチンに解決される手続き型プログラミングや、送信者または対象もディスパッチに関係し、第三の次元を構成する対象指向プログラミングとは対照的です[20]。