スケルトンプログラミングとは、単純な高水準プログラム構造と、いわゆるダミーコードに基づいたコンピュータプログラミングの手法です。プログラムスケルトンは擬似コードに似ていますが、コードの解析、コンパイル、テストが可能です。ダミーコードは、処理をシミュレートし、コンパイルエラーメッセージを回避するために、プログラムスケルトンに挿入されます。これには、空の関数宣言や、コードの期待される応答が既知の単純なテストケースでのみ正しい結果を返す関数などが含まれます。
スケルトンプログラミングは、トップダウン設計アプローチを容易にします。このアプローチでは、完全な高レベル構造を備えた部分的に機能するシステムが設計およびコーディングされ、その後、プロジェクトの要件を満たすようにシステムが段階的に拡張されます。プログラムのスケルトンは、アルゴリズムの高レベル記述にも使用されることがあります。また、プログラムのスケルトンは、幅広い問題で一般的に使用される構文と構造を反映したテンプレートとしても利用できます。
オブジェクト指向プログラミングで使用されるテンプレートメソッド設計パターンでは、スケルトンプログラムが利用されます。オブジェクト指向プログラミングでは、ダミーコードは抽象メソッド、メソッドスタブ、またはモックオブジェクトに対応します。Javaリモートメソッド呼び出し(Java RMI)の用語では、スタブはクライアント側でサーバー側のスケルトンと通信します。[ 1 ]
クラススケルトンとは、ソフトウェアエンジニアリングで使用されるクラスのアウトラインのことです。クラスの役割の説明や、変数とメソッドの目的の説明が含まれていますが、それらを実装するわけではありません。クラスは後でスケルトンを基に実装されます。ポリモーフィックパラダイムを採用する言語では、スケルトンはインターフェースまたは抽象クラスとも呼ばれます。
現代のソフトウェア[ 2 ]は、さまざまな理由から複雑になることがよくあります。これは、1人のプログラマーだけでは開発できない場合や、他のモジュールや部品を個別にインポートする必要がある場合があることを意味します。プログラム自体が複雑すぎる場合もあり、複数のメソッドが同時に単一の変数にアクセスしたり、ディスプレイ用のピクセルを生成したりするものもあります。スケルトンコードは、コンパイル時にエラーを最小限に抑えてプログラマーがコードを開発するのを支援するために使用されます。
スケルトンコードは並列プログラミングで最もよく見られますが、プログラミング言語のドキュメントなど、他の状況でも使用されます。これは、混乱を招く可能性のあるメソッドのコア機能を簡素化するのに役立ちます。また、より大きなプログラム内の小さな関数が一時的に完全な機能なしで動作できるようにするためにも使用できます。このプログラミング方法は、完全な関数を記述するよりも簡単です。これらのスケルトン関数は主要な機能を含める必要がなく、代わりに開発中に使用するためにハードコーディングできます。通常、メソッドを紹介するための構文的に正しいコードと、プログラムの動作を示すコメントが含まれます。テキストの断片をスケルトンコードと呼ぶために、必ずしもこれが必要というわけではありません。

擬似コードは、新しいソフトウェアの構造を開発する際によく見られます。これは、より大きなシステム内の特定の機能を平易な英語で表現したもので、プログラム全体を表現することもできます。擬似コードはスケルトンプログラミングに似ていますが、擬似コードは主に非公式なプログラミング方法であるという点で異なります。[ 3 ]ダミーコードもこれに非常によく似ており、コードは単にプレースホルダーとして、またはクラスやインターフェース内のメソッドの存在を示すために使用されます。
コンピュータプログラマーは擬似コードに極めて依存しており、その依存度は彼らの精神に測定可能な影響を与えている。[ 3 ]一般的なプログラマーは、擬似コードやスケルトンコードを書いたり、図を描いたりするなど、何らかの方法で簡略化されたコードを書くという考え方に非常に慣れており、これが最終的な実装をどれだけうまく書けるかに測定可能な影響を与えている。これは、さまざまな言語やさまざまなプログラミングパラダイムで作業するさまざまなプログラマーによる、多くのアプリケーションで発見されている。
このプログラム設計方法は、多くの場合、紙とペンで行われるため、実際に実装される内容からテキストが乖離してしまう。スケルトンプログラミングはこれに倣っているが、統合開発環境( IDE )やテキストエディタで記述される点が異なる。これにより、初期設計段階後のプログラム開発が容易になる。また、スケルトンプログラムは、実行時に単純な機能のみを動作させることができる。
スケルトンプログラミングは、さまざまなプログラミングアプリケーションで実装できます。
ほとんど、あるいは全てのプログラミング言語には、組み込み関数やメソッドの定義を支援するためのスケルトンコードが用意されています。これにより、初心者プログラマーは、記述されたメソッドの構文と意図された実装を簡単に理解することができます。
オブジェクト指向言語であるJava は、Java パッケージの各オブジェクト部分に対して完全に分離されたメソッドを備えた構造化されたドキュメント ページに重点を置いています。[ 4 ]オブジェクト指向言語は、他の言語に見られるような単純なトップダウンのアプローチではなく、実装に階層ベースの構造に重点を置いています。「オブジェクト」はデータと変数を格納し、通常より効率的なプログラムを作成できます。これらのオブジェクトには、メソッドとして知られる内部変数にアクセスできる個別の関数があります。
各メソッドは同じ形式で定義されており、メソッド名と統合開発環境で使用する構文がブロックの先頭に明確に表示されています。Javaはスコープ、データ型、継承を重視しているため、この構文は初心者プログラマーにとって非常に役立ちます。続いて、メソッドの動作に関する詳細な説明があり、その下にエラーが表示されます。
Python も組み込みメソッドのドキュメント化に同様のアプローチを採用していますが、スコープやデータ型にこだわらないという言語の特徴を反映しています。[ 5 ]このドキュメントには、各メソッドの構文、簡単な説明、およびメソッドまたは関数の典型的な使用例が記載されています。例に示されているスケルトンコードにより、プログラマーは関数を一目で理解できます。
主にライブラリの一部としてサードパーティ開発者によって作成されたクラスも、スケルトンコードの形でプログラミングを紹介します。これは、ライブラリを初めて使用する人に、関数とメソッドがどのように動作するかを知らせるのに役立ちます。P5.Jsは、ドキュメント ページでこの形式を使用して、含まれている特定の関数の意図された使用方法を説明しています。[ 6 ]ただし、これは、メソッドのすべての可能な使用方法ではなく、パラメータを表示するためにスケルトン コードを使用するプログラミング言語のドキュメントとは異なります。
自然言語インターフェース(NLI)は、プログラマーが入力(通常は口語的に(プログラミング言語固有の専門用語を使用せずに))を受け取り、それを使用してプログラムやメソッドを作成しようとする状況で最もよく見られます。この実装では、バックグラウンドで実行される関数を暗示するために、小さなスケルトンコードセットを使用します。[ 7 ]
他の形式のNLIは、異なる言語を話す他のユーザーからジェスチャーベースの入力まで、さまざまな形式の入力を使用して、非常に似た結果を生成します。プログラミング言語は主に英語で開発および記述されているため、他の言語を話す人々は新しいソフトウェアを開発するのが困難です。NLIは、このような状況にある人々を支援するためにいくつかの研究[ 8 ]で使用されています。この研究では、NLIを使用してJavaで記述されたクラスが示されました。これにより、構文規則を学習する必要がなくなりましたが、クラスは基本的なスケルトンコードセットを使用して記述されました。
ポリモーフィズムはオブジェクト指向プログラミングパラダイムに由来するイデオロギーであり、メソッドをオーバーライドまたはオーバーロード(子クラスに同じ名前のメソッドがあり、親クラスに記述されたメソッドよりも優先される)することができます。メソッドの定義は、言語の構文によって定義されたスケルトンフレームワークに基づいています。 [ 9 ]
クラスの実装と非常によく似た方法で、スケルトンコードを使用してインターフェースの一部であるメソッドを定義できます。インターフェースは基本的にクラスの設計図であり、 Javaなどの厳密なオブジェクト指向言語では、内部関数を完全に理解する必要なく、異なるパッケージのクラスを使用できます。インターフェースは、クラス内に存在しなければならないメソッドを定義するだけで、他の誰もがメソッドを使用したり、個人的なニーズに合わせてクラスを実装したりできるようになります。
public skeletonExample ();抽象クラスはクラス実装とほぼ同じですが、言語によっては、少なくとも1つのメソッドが抽象メソッドとして定義されます。これは、このクラスの子クラス(拡張または実装するクラス)には、このクラスに対応するメソッドが定義されている必要があることを意味します。抽象クラスの定義スタイルはインターフェースと非常によく似ていますが、子クラスで実装する必要があることを示すために、通常はキーワード「abstract」が使用されます。
public abstract skeletonExample ();これらの例ではJava構文を使用しています。
並列プログラミングは、複数の関数を同時に実行することで、効率を高めるために最も一般的に使用されます。これらのプログラムは、その複雑さと対象となるハードウェアとの相互接続性のため、通常、開発が最も難しいタイプのプログラムです。多くの開発者がこのコア機能を備えたプログラムを作成しようと試みてきましたが、[ 10 ]、結果は様々でした。
アルゴリズムのスケルトンフレームワークは、並列プログラミングにおいて、後々の開発のために対象となるメソッドを抽象的に記述するために使用されます。フレームワークは単一のタイプに限定されず、それぞれのタイプは開発者のプログラムの効率を高めるために異なる目的を持っています。これらは、データ並列、タスク並列、および解決の 3 つの主要なタイプに分類できます。[ 10 ]
これらの基本アルゴリズムは、大規模データに基づくソフトウェア上で動作するプログラムを開発するために使用され、通常は後で使用するためにデータ間の関連性を特定します。データ並列アルゴリズムには、「マップ」、「フォーク」、「リデュース」または「スキャン」などがあります。
これらの操作は、その名の通り、タスクに対して実行されます。タスク間の動作の違いにより、この分類に含まれる各アルゴリズムはそれぞれ異なります。タスク並列アルゴリズムには、「シーケンシャル」、「ファーム」、「パイプ」、「if」、「for」、「while」などがあります。
これらのスケルトンは、上記で紹介した典型的なスケルトンとは大きく異なります。「解決」アルゴリズムは、特定の問題を解決するために複数の手法を組み合わせて使用します。アルゴリズムに与えられる問題は、「問題のファミリー」である可能性があります。[ 10 ]これらのスケルトンには、「分割統治」または「烙印と束縛」の2つの主要なタイプがあります。