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

疑似コードは、新しいソフトウェアの構造を開発するときに最もよく見られます。これは、より大きなシステム内の特定の機能を平易な英語で表現したもので、プログラム全体を表現することもできます。疑似コードはスケルトンプログラミングに似ていますが、疑似コードは主に非公式なプログラミング方法であるという点で異なります。[3]ダミーコードもこれに非常に似ており、コードは単なるプレースホルダーとして、またはクラスまたはインターフェイス内のメソッドの存在を示すために使用されます。
コンピュータプログラマーは疑似コードに非常に依存しており、その依存度が彼らの精神に測定可能な影響を与えています。[3]典型的なプログラマーは、疑似コードやスケルトンコードを書く、あるいは単に図を描くなど、何らかの方法で簡略化されたコードを書くという考え方に非常に慣れているため、最終的な実装をどれだけうまく書けるかに測定可能な影響を及ぼします。これは、さまざまなプログラマーがさまざまな言語やさまざまなプログラミングパラダイムで作業している多くのアプリケーションで確認されています。
このプログラム設計方法も、ほとんどの場合はペンと紙で行われ、テキストは実際に実装されるものからさらに離れます。スケルトン プログラミングはこれを模倣していますが、統合開発環境またはテキスト エディターで一般的に記述される方法が異なります。これは、最初の設計段階後のプログラムのさらなる開発に役立ちます。スケルトン プログラムでは、実行時に単純な関数も操作できます。
実装
スケルトン プログラミングは、さまざまなプログラミング アプリケーションに実装できます。
プログラミング言語ドキュメント
ほとんどすべてのプログラミング言語には、組み込み関数とメソッドの定義を支援するために使用されるスケルトン コードがあります。これにより、初心者のプログラマーは、記述されたメソッドの構文と意図された実装を簡単に理解できるようになります。
オブジェクト指向言語であるJavaは、Javaパッケージの各オブジェクト部分に対して完全に分離されたメソッドを備えた構造化されたドキュメントページに重点を置いています。[4]オブジェクト指向言語は、他の言語に見られる単純なトップダウンアプローチではなく、実装に対する階層ベースの構造に重点を置いています。「オブジェクト」にはデータと変数が格納され、通常、より効率的なプログラムを書くことができます。これらのオブジェクトには、メソッドと呼ばれる内部変数にアクセスできる個別の関数があります。
各メソッドは同じ形式で定義され、メソッドの名前と統合開発環境で使用される構文がブロックの先頭に明確に表示されます。Java はスコープ、データ型、継承に重点を置いているため、この構文はすべてのプログラマーではないにしても、初心者にとって非常に便利です。その後に、メソッドの動作の詳細な説明が続き、その下にエラーが示されています。
Python にも組み込みメソッドをドキュメント化する同様のアプローチがありますが、言語のスコープとデータ型への固定化がない点を模倣しています。[5]このドキュメントには、各メソッドの構文、簡単な説明、およびメソッドまたは関数の一般的な使用例が記載されています。例で提供されているスケルトンコードにより、プログラマーは一目で関数をよく理解できます。
クラス定義
サードパーティの開発者が主にライブラリの一部として作成したクラスも、スケルトンコードの形式でプログラミングを紹介しています。これは、ライブラリを初めて使用する人に、関数やメソッドの動作方法を伝えるのに役立ちます。P5.Jsは、ドキュメントページでこの形式を使用して、特定の関数の使用目的を説明しています。[6]ただし、これはプログラミング言語のドキュメントとは異なり、スケルトンコードを使用して、メソッドのすべての可能な使用方法ではなく、 パラメータを表示します。
自然言語インターフェース(NLI)は、プログラマーが入力(通常は口語で呼ばれる)を受け取り、それを使ってプログラムやメソッドを作成しようとする状況で最もよく見られます(プログラミング言語特有の専門用語は使用しません)。これを実装するには、小さなスケルトンコードセットを使用して、関数がバックグラウンドで実行されていることを示します。[7]
他の形式の NLI では、異なる言語を話す他のユーザーからジェスチャー ベースの入力まで、さまざまな形式の入力を使用して、非常に類似した結果を生成します。プログラミング言語は主に英語で開発および記述されているため、他の言語を話す人々は新しいソフトウェアを開発するのが困難です。NLI は、このような状況にある人々を支援するためにいくつかの研究[8]で使用されています。この研究では、NLI を使用して Java で記述されたクラスが示されました。これにより、構文規則を学習する必要がなくなりましたが、クラスは基本的なスケルトン コード セットを使用して記述されることを意味しました。
ポリモーフィズムベースの定義
ポリモーフィズムはオブジェクト指向プログラミング パラダイムに従うイデオロギーであり、メソッドをオーバーライドまたはオーバーロードすることができます(子クラス内の同じ名前のメソッドは、親クラスで記述されたメソッドよりも優先されます)。メソッドの定義は、言語の構文によって定義されたスケルトンフレームワークに基づいています。 [9]
クラスの実装と非常によく似ていますが、スケルトン コードを使用して、インターフェイスの一部であるメソッドを定義できます。インターフェイスは基本的にクラスの設計図であり、厳密なオブジェクト指向言語 ( Javaなど) が内部関数を完全に理解することなく、さまざまなパッケージのクラスを使用できるようにします。インターフェイスは、クラス内に存在する必要があるメソッドを定義するだけで、他のユーザーがメソッドを使用したり、個人的なニーズに合わせてクラスを実装したりできるようになります。
パブリックスケルトン例();
抽象クラスはクラス実装とほぼ同じですが、言語によっては、少なくとも 1 つのメソッドが抽象として定義されます。これは、このクラスのすべての子 (拡張または実装するすべてのクラス) に、これに対して定義されたメソッドが必要であることを意味します。抽象クラスの定義スタイルはインターフェイスと非常に似ていますが、通常、子クラスで実装する必要があることを識別するには、キーワード「abstract」が使用されます。
パブリック抽象スケルトン例();
これらの例では Java 構文を使用します。
並列プログラミング
並列プログラミングは、複数の機能を同時に操作するもので、効率を上げるために最も一般的に使用されます。これらは、その複雑さとハードウェアとの相互接続性のため、通常、開発が最も難しいタイプのプログラムです。多くの開発者がこのコア機能を備えたプログラムの作成を試みてきましたが、[10]結果はさまざまです。
アルゴリズムのスケルトンフレームワークは、並列プログラミングにおいて、後の開発のために問題のメソッドを抽象的に記述するために使用されます。フレームワークは単一のタイプに限定されず、これらのタイプはそれぞれ開発者のプログラムの効率を高めるために異なる目的を持っています。これらは、データ並列、タスク並列、および解決の3つの主要なタイプに分類できます。[10]
データ並列
これらのスケルトン アルゴリズムは、大規模なデータベース ソフトウェアで動作するプログラムを開発するために使用され、通常は後で使用するためにデータ間の接続を識別します。データ並列アルゴリズムには、「マップ」、「フォーク」、「削減」または「スキャン」が含まれます。
- 「マップ」は最も一般的に使用されるデータ並列アルゴリズムであり、通常は大規模なデータセットに対して単一の操作が実行されます。効率性を高めるために、複数のデータセットに同時にこの操作が適用され、最後にデータが再び構造化されます。
- 「フォーク」は「マップ」に似ていますが、特定のデータ型に対して異なる操作を使用します。これは複数データ並列処理として知られています。[10]
- 「Reduce」または「Scan」は、データ セットにプレフィックスを適用してから、データに操作を適用するために使用されます。これらは、メソッド自体の実行中に部分的な結果のセットを取得するため、「maps」とは異なります。
タスク並列
これらの操作は、その名前が示すように、タスクに対して機能します。この下にある各タイプのアルゴリズムは、タスク間の動作が変化するため異なります。タスク並列アルゴリズムには、「シーケンシャル」、「ファーム」、「パイプ」、「if」、「for」、「while」などがあります。
- 「Sequential」は、ネストされたスケルトン アルゴリズムのセットを閉じて終了します。スケルトンの一部であるメソッドとプログラムは、閉じる前にプログラムの終了要素として組み込まれます。
- 「ファーム」は、タスクのグループ、ワーカー、または別の関数のマスターまたはスレーブとして知られています。タスクを複数のスレッドに複製し、同時に実行することで、指定されたタスクを完了します。これにより、特定のスレッドの負荷が分割され、スレッド間にマスター/スレーブ関係が効果的に作成されます。
- 「パイプ」は、各メソッドまたは関数が順番に実行される、より伝統的な形式のアルゴリズムです。これは、プログラマがコードを記述した順序に従います。これは、通常は入力である一連のデータに対してさまざまなタスクを同時に計算することで並列化され、パフォーマンスと速度が向上します。各同時計算はステージと呼ばれます。パイプ アルゴリズムはネスト可能で、1 つのアルゴリズムが別のアルゴリズム内に配置され、各アルゴリズムが責任を分割して速度とステージ数を増加させます。
- 「If」は、プログラムにタスクの条件付き分割を与え、スケルトン コードのセットを 2 つのメイン セクションに分割します。条件文がプログラムに与えられ、従うべき特定のアルゴリズムが与えられます。
- 「For」は、プログラマーによって指定された回数だけタスクを実行し、より効率的なコード セットを可能にします。コードが実行される回数は事前設定された値であり、実行時に変更できないことを示します。指定された回数だけタスクを完了する必要があります。
- 「While」は、タスクが複数回完了する「for」アルゴリズムの動作に非常によく似たアルゴリズムです。ただし、「while」アルゴリズムでは、条件文が満たされる前にプログラムはタスクを複数回計算します。つまり、「while」アルゴリズムは、実行されるたびにタスクを異なる回数実行できます。
解像度スケルトン
これらのスケルトンは、上記の典型的なスケルトンとは非常に異なります。「解決」アルゴリズムは、特定の問題を解決するために複数の方法を組み合わせて使用します。アルゴリズムの特定の問題は、「問題のファミリー」である可能性があります。[10]これらのスケルトンには、「分割統治」または「ブランドとバウンド」の2つの主要なタイプがあります。
- 「分割統治」はマップ スケルトンを基礎として使用し、これを while スケルトンと組み合わせて問題を解決します。マップ アルゴリズムでは、データに対する関数が同時に適用されます。「分割統治」では、提供されたデータ セットにマップ スケルトンを使用して関数が適用されますが、これは「while」アルゴリズムを使用して再帰的に適用できます。「while」は、問題全体が解決された場合にのみ解除されます。
- 「分岐限定法」もマップ アルゴリズムを使用するアルゴリズムですが、「while」アルゴリズムを適用してタスクを同時に実行する代わりに、このアルゴリズムはタスクを分岐に分割します。各分岐には特定の目的、つまり「境界」があり、条件文によって分岐が停止します。
参考文献
- ^ フリーマン、エリック; フリーマン、エリザベス; キャシー、シエラ; バート、ベイツ (2004)。ヘンドリクソン、マイク; ルーキデス、マイク (編)。Head First Design Patterns (ペーパーバック)。第 1 巻。オライリー。p. 440。ISBN 978-0-596-00712-6. 2012年8月28日閲覧。
- ^ Lowery, Jeff (2019年11月2日). 「ソフトウェア開発はなぜ難しいのか?」. Medium . 2020年11月15日閲覧。
- ^ ab Bellamy, Rachel KE (1994 年 6 月 1 日)。「疑似コードは何をするのか? 熟練プログラマによる疑似コードの使用に関する心理学的分析」。ヒューマン・コンピュータ・インタラクション。9 (2): 225–246。doi : 10.1207 /s15327051hci0902_3。ISSN 0737-0024 。
- ^ 「Object (Java Platform SE 8)」. docs.oracle.com . 2020年10月2日閲覧。
- ^ 「組み込み関数 — Python v3.0.1 ドキュメント」。docs.python.org。2009 年 2 月 14 日。2020年10 月 3 日閲覧。
- ^ "reference | p5.js". p5js.org . 2020年11月15日閲覧。
- ^ グレンジャー、クリス(2020年11月18日)。「私たちが取り組んでいる新しいものを初めて覗いてみよう」。Twitter 。 2020年11月19日閲覧。
- ^ Özcan, E. (2004). 「自然言語インターフェースを使用した Java クラス スケルトンの生成」。第1 回自然言語理解と認知科学に関する国際ワークショップの議事録。1。SciTePress - 科学技術出版物: 126–134。doi : 10.5220 / 0002683301260134。ISBN 972-8865-05-8。
- ^ Benaya, Tamar; Zur, Ela (2008)、「上級プログラミングコースにおけるオブジェクト指向プログラミングの概念の理解」、情報科学教育 - 計算思考のサポート、コンピュータサイエンスの講義ノート、vol. 5090、ベルリン、ハイデルベルク: Springer Berlin Heidelberg、pp. 161–170、doi :10.1007/978-3-540-69924-8_15、ISBN 978-3-540-69923-1、 2020年11月18日閲覧
- ^ abcd González- Vélez , Horacio; Leyton, Mario (2010 年 11 月 1 日)。「アルゴリズム スケルトン フレームワークの調査: 高レベルの構造化並列プログラミング イネーブラー」。ソフトウェア:実践と経験。40 (12): 1135–1160。doi :10.1002/spe.1026。ISSN 0038-0644。S2CID 16211075 。
