機能指向プログラミングまたは機能指向ソフトウェア開発 (FOSD)は、ソフトウェア製品ラインにおけるプログラム合成の一般的なパラダイムです。機能指向プログラミングのページが推奨されています。このページでは、ドメインの FOSD モデルが 0 項関数 (値と呼ばれる) のタプルと 1 項 (単項) 関数のセット (機能と呼ばれる) である仕組みについて説明しています。このページでは、複雑なプログラムのコンパクトな仕様にとって重要な、FOSD モデルの多次元一般化について説明します。
折り紙
メタモデルの基本的な一般化は折り紙です。基本的な考え方は、プログラムの設計は単一の式で表現する必要はなく、複数の式を使用できるということです。[1] [2] [3] これには、複数の直交GenVocaモデルの使用が含まれます。
- 例: T をツール モデルとします。このツール モデルには、機能 P (解析)、H (収集)、D (ドックレット)、J (Java への変換) があります。P は値で、残りは単項関数です。Java 方言言語で記述されたファイルを解析し、純粋な Java に変換するツール T1 は、T1 = J•P でモデル化されます。また、Javadoc のようなツール T2 は、Java 方言でファイルを解析し、コメントを収集し、収集したコメントを HTML ページに変換します。T2 = D•H•P です。したがって、ツール T1 と T2 は、T の製品ラインの製品です。
- 言語モデル L は、Java 方言のファミリー (製品ライン) を記述します。これには、B (Java 1.4)、G (ジェネリック)、S (ステート マシン) の機能が含まれます。B は値で、残りは単項関数です。したがって、ジェネリック (Java 1.5 など) を持つ Java L1 方言は、L1 = G•B です。ステート マシンの言語サポートを持つ Java L2 方言は、L2 = S•B です。したがって、方言 L1 と L2 は、L の製品ラインの製品です。
- ステート マシンを持つ Java 方言の javadoc のようなツール (E) を記述するには、2 つの式が必要です。1 つは E のツール機能 (T モデルを使用) を定義し、もう 1 つは Java 方言 (L モデルを使用) を定義します。
E = D•H•P -- ツール方程式 E = S•B -- 言語方程式
- モデル L と T は直交する GenVoca モデルです。1 つは E ツールの機能ベースの構造を表現し、もう 1 つはその入力言語の機能ベースの構造を表現します。モデル T と L は、次の意味で抽象的であることに注意してください。T の機能の実装は、ツールの方言 (L で表現) に実際に依存し、(対称的に) L の機能の実装は、ツールの機能 (T で表現) に実際に依存します。したがって、E を実装できる唯一の方法は、T と L の両方の方程式を知ることです。
U=[U 1 ,U 2 ,...,U n ]をn個の特徴を持つGenVocaモデルとし、W=[W 1 ,...W m ]をm個の特徴を持つGenVocaモデルとします。2つの直交モデルUとWの関係は、 Origami行列と呼ばれる行列UWで 、各行はUの特徴に対応し、各列はWの特徴に対応します。エントリUW ijは、特徴U iとW jの組み合わせを実装する関数です 。
- 注: UW はU と W のテンソル積です(つまり、UW = U×W)。
- 例: モデル T=[P,H,D,J] および L=[B,G,S] を思い出してください。折り紙行列 TL は次のようになります。
- ここで、PB は Java のパーサーを実装する値、PG はジェネリックを解析するために Java パーサーを拡張する単項関数、PS は状態マシン仕様を解析するために Java パーサーを拡張する単項関数です。HB は、Java コードに対するコメントのハーベスターを実装する単項関数です。HG はジェネリック コードに対するコメントのハーベスターを実装する単項関数、HS は状態マシン仕様に対するコメントのハーベスターを実装する単項関数、などです。
複数の方程式を使用してプログラムを合成する方法を確認するには、モデル U と W を再度検討します。プログラム F は、モデルごとに 1 つずつ、2 つの方程式で記述されます。F の方程式は、次のように、名前で機能を参照するか、インデックス位置で機能を参照するかの 2 つの異なる方法で記述できます。
- — FのU表現
- — FのW表現
UW モデルは、モデル U と W の実装方法を定義します。プログラム F を合成するには、不要な列と行の UW を投影し、集約 (テンソル収縮とも呼ばれます) します。
折り紙行列の基本的な特性である直交性は、次元を縮小する順序は重要ではないということです。上記の式では、最初に U 次元 (インデックス i) を合計するか、最初に W 次元 (インデックス j) を合計するかは重要ではありません。もちろん、直交性は検証する必要がある特性です。折り紙行列 (またはテンソル/n 次元配列) が直交していることを検証するための効率的な (線形) アルゴリズムが開発されています。[4] 直交性の重要性は、ビューの一貫性の 1 つです。特定の次元に沿って集約 (縮小) すると、プログラムの「ビュー」が提供されます。異なるビューは一貫している必要があります。つまり、1 つのビューでプログラムのコードを修復すると (または 1 つのビューでプログラムに関するプロパティを証明した場合)、それらの修復またはプロパティの正しさはすべてのビューで保持される必要があります。
一般に、製品ラインの製品は、n 個の直交抽象GenVoca モデル G 1 ... G nからの n 個の式で表すことができます。Origami 行列 (またはキューブまたはテンソル) は、n 次元配列 A です。
この積直線の積 H は、A から不要な行や列などを削除し、n 立方体をスカラーに集約 (縮小) することによって形成されます。
- 例。プログラム E とモデル T=[P,H,D,J] を思い出してください。E=D•H•P=T 2 •T 1 •T 0。同様に、モデル L=[B,G,S] での E の表現は E=S•B=L 2 •L 0です。折り紙モデル TL が与えられた場合に E を合成すると、次の式が評価されます。
アプリケーション
Origami を使用して開発された製品ライン アプリケーションはいくつかあります。その中には次のようなものがあります。
- AHEAD ツール スイートと拡張可能な Java プリプロセッサ
- 表現の問題か拡張性の問題か
- 改良と多次元的な関心の分離
さらに多くのアプリケーションが提供されます。
参照
参考文献
- ^ 「製品ファミリーの製品ラインの生成」(PDF)。
- ^ 「改良と多次元の関心の分離」(PDF)。
- ^ 「高度なモジュール化テクノロジの機能のサポートの評価」(PDF)。
- ^ 「多次元プログラム構造の設計と分析」(PDF)。
