コンピュータプログラミングにおいて、名前付きパラメータ、名前付きパラメータ引数、名前付き引数、またはキーワード引数とは、関数呼び出しにおいて、各引数を関数呼び出し内の特定のパラメータに明確に関連付けるための、コンピュータ言語の機能を指します。
名前付きパラメータを使用する関数呼び出しは、通常の関数呼び出しとは異なり、引数を順序付きリストとして渡すのではなく、各引数をパラメータ名に関連付けて渡すという点で異なります。
例えば、名前付きパラメータを使用しないJavaまたはC#のメソッド呼び出しを考えてみましょう。
window.addNewControl ( " Title" , 20 , 50 , 100 , 50 , true ) ;Pythonで名前付きパラメータを使用すると、呼び出しは次のように記述できます。
window.add_new_control ( title = "タイトル" , x_position = 20 , y_position = 50 , width = 100 , height = 50 , drawing_now = True )PHPで名前付きパラメータを使用すると、呼び出しは次のように記述できます。
$window -> addNewControl ( title : "タイトル" , xPosition : 20 , yPosition : 50 , width : 100 , height : 50 , drawingNow : true );位置引数を用いるバージョンはより暗黙的であり、パラメータに名前を付けるバージョンはより明示的である。状況によっては、プログラマーはどちらか一方の方が読みやすいと感じるかもしれない。
名前付きパラメータは、多くの言語で明示的にサポートされています。例として、Ada [ 1 ]、 C# 4.0+ [ 2 ] 、Ceylon、ColdFusion Markup Language (CFML) 、Common Lisp [ 3 ]、Fortran、IDL、Kotlin [ 4 ] 、 Mathematica、Nim [ 5 ] 、 PL/SQL、PowerShell、Python [ 6 ]、R [ 7 ]、PHP [ 8 ]、Ruby [ 9 ]、Scala [ 10 ]、Smalltalk、Swift [ 11 ]、Visual Basic [ 12 ]などが挙げられます。Objective -Cには名前付きパラメータはありません (メソッド名の一部が名前付きパラメータのように見える場合でも)。[ 13 ] C++では、 C++20以降[ 14 ]指定初期化子を使用することで、次のように名前付きパラメータを実現できます。
struct A { int a {}, int b {} };void foo ( A bar ) { std :: println ( "Aa = {}, Ab = {}" , 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 ({ xPosition : 20 , yPosition : 50 , width : 100 , height : 5 , drawingNow : true });MyFunctionCall ({ width : 100 , height : 5 , xPosition : 20 , yPosition : 50 , drawingNow : true });C99と比較:[ 15 ]
struct MyParam { int xPosition ; int yPosition ; int width ; int height ; unsigned char drawingNow ; }; … MyParam parameters = { . xPosition = 20 , . yPosition = 50 , . width = 100 , . height = 5 , . drawingNow = TRUE }; MyFunctionCall ( & parameters );PerlおよびRuby 2.0 より前のバージョンでは、同様の慣習が存在し(一般にハッシュまたはオプションハッシュ[ 16 ]と呼ばれる)、関数呼び出し内の区切り文字を省略するための特別なサポートがあります。例として、コアモジュール Net::FTP のnew関数は、オプション引数のハッシュを受け入れます。[ 17 ]
オブジェクト指向プログラミング言語では、メソッドチェーンを使用して、流暢なインターフェースの一形態として、名前付きパラメータをシミュレートすることが可能です。各名前付きパラメータ引数は、「arguments」オブジェクトのメソッドに置き換えられ、そのメソッドはオブジェクトを変更してから返します。C++ では、これは名前付きパラメータ イディオムと呼ばれます。[ 18 ]その後、オブジェクトは、そのオブジェクトに含まれる引数を使用する関数に渡されます。
メソッドチェーンは、ビルダーパターンと組み合わせて、ビルダークラスによって提供されるデフォルト値を上書きする方法としてよく使用されます。