コンピュータ プログラミングでは、名前付きパラメーター、名前付きパラメーター引数、名前付き引数、またはキーワード引数は、関数呼び出し内の 特定のパラメーターに各引数を明確に関連付けるためのコンピュータ言語の関数呼び出しのサポートを指します。
概要
名前付きパラメータを使用する関数呼び出しは、引数の順序付きリストを提供するのではなく、各引数をパラメータ名に関連付けて渡すという点で、通常の関数呼び出しとは異なります。
たとえば、名前付きパラメータを使用しない 次のJavaまたはC#メソッド呼び出しを考えてみましょう。
window .addNewControl ( "タイトル" 、20 、50 、100 、50 、true ) ;
Pythonで名前付きパラメータを使用すると、呼び出しは次のように記述できます。
window.addNewControl ( title = " Title" 、xPosition = 20 、yPosition = 50 、幅= 100 、高さ= 50 、drawingNow = True )
PHPで名前付きパラメータを使用すると、呼び出しは次のように記述できます。
$window -> addNewControl ( title : "タイトル" 、
x位置: 20 、
y位置: 50 、
幅: 100 、
高さ: 50 、
描画現在: True );
位置引数を使用するバージョンはより暗黙的です。パラメータに名前を付けるバージョンはより明示的です。状況によっては、プログラマーはどちらか一方が読みやすいと感じるかもしれません。
プログラミング言語での使用
名前付きパラメータは多くの言語で明示的にサポートされています。網羅的ではない例としては、Ada、[1] C# 4.0+、[2] Ceylon [引用が必要]、ColdFusion Markup Language (CFML) [引用が必要]、Common Lisp、[3] Fortran [引用が必要]、IDL [引用が必要]、Kotlin、[4] Mathematica [引用が必要]、PL/SQL [引用が必要]、PowerShell [引用が必要]、Python、[5] R、[6] PHP、[7] Ruby、[8] Scala、[9] Smalltalk [引用が必要]、Swift [10]、Visual Basic [11] などがあります。Objective -Cには名前付きパラメータはありません(メソッド名の一部が名前付きパラメータのように見える場合もあります)。[12]
C++
では、C++20以降では指定初期化子を使用することで名前付きパラメータを実現できます。 [13]次のようにします。
構造体A { int a {}, int b {} };
void
foo ( A bar ) { std :: cout << bar . a << bar . b ; } foo ({ . a = 1 , . b = 3 });
パラメータの順序
名前付きパラメータをサポートしていない言語では、関数呼び出しにおける引数の順序は必然的に固定されます。これは、どの引数がどのパラメータに使用されるかを言語が識別できる唯一の方法だからです。
名前付きパラメータを使用すると、各引数に付けられたパラメータ名がその目的を識別するため、通常は引数を任意の順序で提供できます。これにより、プログラムの各部分間のつながりが減ります。いくつかの言語では名前付きパラメータがサポートされていますが、引数を特定の順序で提供する必要があります。
オプションパラメータと位置パラメータ
名前付きパラメータは、オプション パラメータと組み合わせて使用されることがよくあります。名前付きパラメータがない場合、省略された値を判断する方法が他にないため、オプション パラメータはパラメータ リストの最後にのみ表示されます。ただし、名前付きオプション パラメータをサポートする言語では、プログラムは使用可能なパラメータの任意のサブセットを提供でき、名前を使用して提供された値を判断します。
OCamlなどのオプションの名前付きパラメータと部分適用の両方をサポートする言語では、さらに複雑な問題が生じます。一般に、部分的に適用された関数と、パラメータのサブセットが提供されている関数を区別することは不可能です。OCaml は、すべてのオプションの名前付きパラメータ引数の後に位置引数を要求することでこの曖昧さを解決します。位置引数の有無によって、関数が完全に適用されたか部分的に適用されたかが判断されます。すべてのパラメータがオプションである場合、実装者は、型unitのダミー位置パラメータを追加することでこの問題を解決できます。
エミュレート
名前付きパラメータをサポートしていない言語では、他の方法で同様の利点の一部を実現できます。
ドキュメント付き
ドキュメントとしての価値は、 Javaなどの言語の統合開発環境(IDE) のツールチップや、Cのコメントによって再現できます。
MyFunctionCall (
20 , /* x 座標 */ 50 , /* y 座標 */ 100 , /* 幅 */ 5 , /* 高さ */ TRUE /* 描画中か? */ );
このようなコメントは正確性はチェックされず、引数の順序は依然として重要です。
データ構造
引数の順序の制限を削除し、一部の値を未指定のままにしておく機能は、レコードまたは連想配列を渡すことによって実現できます。
たとえば、JavaScriptでは、次の 2 つの呼び出しは同等です。
MyFunctionCall ({ x位置: 20 、y位置: 50 、幅: 100 、高さ: 5 、drawingNow : true });
MyFunctionCall ({幅: 100 、高さ: 5 、x位置: 20 、y位置: 50 、描画現在: true });
C99と比較: [14]
struct MyParam { int xPosition ; int yPosition ; int width ; int height ; unsigned char drawingNow ; } ; … MyParamパラメータ= { .xPosition = 20 , .yPosition = 50 , .width = 100 , .height = 5 , .drawingNow = TRUE } ; MyFunctionCall ( & parameters ) ;
特別サポート
PerlとRuby 2.0より前のバージョンにも同様の規則があり(一般的にハッシュまたはオプションハッシュ[15]と呼ばれる)、関数呼び出し内の区切り文字を省略するための特別なサポートがあります。例として、コアモジュールのNet::FTPの新規関数は、オプションの引数のハッシュを受け入れます。[16]
連鎖メソッド呼び出し
オブジェクト指向プログラミング言語では、メソッド連鎖を使用して、流暢なインターフェースの形式として名前付きパラメータをシミュレートすることができます。名前付きパラメータの各引数は、オブジェクトを変更して返す「引数」オブジェクトのメソッドに置き換えられます。C++では、これを名前付きパラメータイディオムと呼びます。[17]その後、オブジェクトは、それに含まれる引数を使用する関数に渡されます。
メソッド チェーンは、ビルダー クラスによって提供されるデフォルト値をオーバーライドする方法として、 ビルダー パターンと組み合わせて使用されることがよくあります。
参照
- ヘルプ:名前付きパラメータと位置パラメータのテンプレート。
- 流暢なインターフェース
- タグ(プログラミング)
参考文献
- ^ Adaプログラミング言語リファレンスマニュアル。米国国防総省。1983年。
- ^ BillWagner. 「名前付き引数と省略可能な引数 - C# プログラミング ガイド」。Microsoft Learn。2021年 6 月 16 日閲覧。
- ^ 「関数」。Common Lisp クックブック。 2021 年 10 月 28 日閲覧。
- ^ 「関数 | Kotlin」。Kotlinヘルプ。2021 年 6 月 16 日閲覧。[リンク切れ ]
- ^ 「8. 複合文 - 8.7. 関数定義」。Pythonドキュメント。2021 年 10 月 28 日閲覧。
- ^ 「10.3 名前付き引数とデフォルト」。R入門。包括的なRアーカイブネットワーク。 2021年10月28日閲覧。
- ^ 「PHP: 関数の引数 - マニュアル - 名前付き引数」。PHP 。 2021年6月16日閲覧。
- ^ Anderson, Ian C. (2014年7月21日). 「Ruby 2 キーワード引数」. thoughtbot . 2021年10月28日閲覧。
- ^ 「名前付き引数」。Scalaドキュメント。2021年 6 月 16 日閲覧。
- ^ 「関数」。Swiftプログラミング言語(Swift 5.1)。2020年1月27日閲覧。
- ^ KathleenDollard. 「位置と名前による引数の受け渡し - Visual Basic」。Microsoft Learn。2021年 6 月 16 日閲覧。
- ^ 開発者ライブラリ - クラスの実装は内部動作を提供します
- ^ 「指定された初期化文言」(PDF)。
- ^ 「指定された init (GNU コンパイラ コレクション (GCC) の使用)」。
- ^ Perl 2.9 プログラミング: ハッシュ
- ^ Perl コアモジュール Net::FTP
- ^ C++ FAQ、10.20 「名前付きパラメータイディオム」とは何ですか?
外部リンク
- https://web.archive.org/web/20070502112455/http://plg.uwaterloo.ca/~rgesteve/cforall/named_pars.html
- C++ではこのパラダイムは簡単に実装できます: Boostパラメータライブラリ
- Rosetta Codeのさまざまなプログラミング言語における名前付きパラメータ
