Именованный параметр
Эта статья нуждается в дополнительных цитатах для проверки . ( август 2014 г. ) |
В компьютерном программировании , именованные параметры аргумент аргументы именованных параметров , именованные аргументы или аргументы ключевых слов относятся к поддержке компьютерного языка для вызовов функций, чтобы четко связать каждый с данным параметром в вызове функции.
Обзор
[ редактировать ]Вызов функции с использованием именованных параметров отличается от обычного вызова функции тем, что аргументы передаются путем связывания каждого из них с именем параметра вместо предоставления упорядоченного списка аргументов.
Например, рассмотрим этот вызов метода Java или C# , который не использует именованные параметры:
window.addNewControl("Title", 20, 50, 100, 50, true);
Используя именованные параметры в Python , вызов можно записать так:
window.addNewControl(title="Title",
xPosition=20,
yPosition=50,
width=100,
height=50,
drawingNow=True)
Используя именованные параметры в PHP , вызов можно записать так:
$window->addNewControl(title: "Title",
xPosition: 20,
yPosition: 50,
width: 100,
height: 50,
drawingNow: True);
Версия с позиционными аргументами более неявная. Версии с именами параметров более явны. В зависимости от обстоятельств программист может найти тот или иной вариант более простым для чтения.
Использование в языках программирования
[ редактировать ]Именованные параметры явно поддерживаются на многих языках. Неисчерпывающий набор примеров включает Ada , [1] С# 4.0+ , [2] Цейлон [ нужна ссылка ] , Язык разметки ColdFusion (CFML) [ нужна ссылка ] , Общий Лисп , [3] Фортран [ нужна ссылка ] , МВУ [ нужна ссылка ] , Котлин , [4] Математика [ нужна ссылка ] , ПЛ/SQL [ нужна ссылка ] , PowerShell [ нужна ссылка ] , Питон , [5] Р , [6] PHP , [7] Руби , [8] Скала , [9] Смолток [ нужна ссылка ] , Быстрый [10] и Visual Basic . [11] Objective-C не имеет именованных параметров (хотя части имени метода могут выглядеть как именованные параметры). [12]
В C++ вы можете получить именованные параметры, используя назначенные инициализаторы, начиная с C++20 . [13] вот так:
struct A {int a{}, int b{} };
void
foo(A bar)
{
std::cout << bar.a << bar.b;
}
foo({ .a = 1, .b = 3 });
Порядок параметров
[ редактировать ]В языках, которые не поддерживают именованные параметры, порядок аргументов в вызове функции обязательно фиксирован, поскольку это единственный способ определить, какой аргумент для какого параметра предназначен для использования.
При использовании именованных параметров обычно можно указывать аргументы в любом порядке, поскольку имя параметра, прикрепленное к каждому аргументу, определяет его назначение. Это уменьшает согласованность между частями программы. Некоторые языки поддерживают именованные параметры, но по-прежнему требуют указания аргументов в определенном порядке.
Дополнительные параметры и позиционные параметры
[ редактировать ]Именованные параметры часто используются вместе с необязательными параметрами. Без именованных параметров необязательные параметры могут появляться только в конце списка параметров, поскольку нет другого способа определить, какие значения были опущены. Однако в языках, поддерживающих именованные необязательные параметры, программы могут предоставлять любое подмножество доступных параметров, и имена используются для определения того, какие значения были предоставлены.
Дополнительные сложности возникают в таких языках, как OCaml , которые поддерживают как необязательные именованные параметры, так и частичное применение . В общем, невозможно отличить частично примененную функцию от функции, которой предоставлено подмножество параметров. OCaml разрешает эту двусмысленность, требуя позиционный аргумент после всех необязательных аргументов именованных параметров: его наличие или отсутствие используется для принятия решения о том, была ли функция применена полностью или частично. Если все параметры являются необязательными, разработчик может решить проблему, добавив фиктивный позиционный параметр типа unit .
В MediaWiki коды (переменные) {{{1}}}
, {{{2}}}
в шаблонах и т. д. будут заменены первым, вторым и т. д. безымянным параметром (или значением параметра с именем 1
, 2
, и т. д.); они известны как позиционные параметры s.
Подражание
[ редактировать ]В языках, которые не поддерживают именованные параметры, некоторых из тех же преимуществ можно достичь другими способами.
С документацией
[ редактировать ]Их ценность как документации может быть воспроизведена с помощью всплывающих подсказок в интегрированных средах разработки (IDE) для таких языков, как Java , или с помощью комментариев (в C ):
MyFunctionCall(
20, /* x coordinate */
50, /* y coordinate */
100, /* width */
5, /* height */
TRUE /* drawing now? */
);
Корректность таких комментариев не проверяется, и порядок аргументов остается важным.
Со структурами данных
[ редактировать ]Снять ограничение порядка аргументов и возможность оставить некоторые значения неуказанными можно путем передачи записи или ассоциативного массива .
Например, в JavaScript эти два вызова эквивалентны:
MyFunctionCall({ xPosition: 20, yPosition: 50, width: 100, height: 5,
drawingNow: true });
MyFunctionCall({ width: 100, height: 5, xPosition: 20, yPosition: 50,
drawingNow: true });
Сравните с C99: [14]
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(¶meters);
Специальная поддержка
[ редактировать ]В Perl до 2.0 и Ruby существует аналогичное соглашение (обычно называемое хешем или хэшем опций). [15] ), со специальной поддержкой пропуска разделителей в вызовах функций. Например, новая функция Net::FTP основного модуля принимает хэш необязательных аргументов. [16]
С цепочками вызовов методов
[ редактировать ]В объектно-ориентированных языках программирования можно использовать цепочки методов для имитации именованных параметров как форму гибкого интерфейса . Каждый аргумент именованного параметра заменяется методом объекта «аргументы», который изменяет, а затем возвращает объект. В C++ это называется идиомой именованного параметра . [17] Затем объект можно передать функции, которая использует содержащиеся в нем аргументы.
Цепочка методов часто используется в сочетании с шаблоном построителя как способ переопределить значения по умолчанию, предоставленные классом построителя.
См. также
[ редактировать ]- Справка:Шаблон для именованных и позиционных параметров.
- Свободный интерфейс
- Тег (программирование)
Ссылки
[ редактировать ]- ^ Справочное руководство по языку программирования Ada . Министерство обороны США. 1983.
- ^ БиллВагнер. «Именованные и необязательные аргументы — Руководство по программированию на C#» . Microsoft Learn . Проверено 16 июня 2021 г.
- ^ «Функции» . Поваренная книга Common Lisp . Проверено 28 октября 2021 г.
- ^ «Функции | Котлин» . Котлин в помощь . Проверено 16 июня 2021 г. [ мертвая ссылка ]
- ^ «8. Составные операторы – 8.7. Определения функций» . Документация Python . Проверено 28 октября 2021 г.
- ^ «10.3 Именованные аргументы и значения по умолчанию» . Введение в Р. Комплексная сеть архивов R. Проверено 28 октября 2021 г.
- ^ «PHP: Аргументы функции — Руководство — Именованные аргументы» . PHP . Проверено 16 июня 2021 г.
- ^ Андерсон, Ян К. (21 июля 2014 г.). «Аргументы ключевых слов Ruby 2» . мыслибот . Проверено 28 октября 2021 г.
- ^ «Именованные аргументы» . Документация Скала . Проверено 16 июня 2021 г.
- ^ «Функции» . Язык программирования Swift (Swift 5.1) . Проверено 27 января 2020 г.
- ^ Кэтлин Доллард. «Передача аргументов по позиции и имени — Visual Basic» . Microsoft Learn . Проверено 16 июня 2021 г.
- ^ Библиотека разработчика — реализация класса обеспечивает его внутреннее поведение.
- ^ «Назначенная формулировка инициализации» (PDF) .
- ^ «Назначенные инициализации (с использованием коллекции компиляторов GNU (GCC))» .
- ^ Программирование Perl 2.9: Хэши
- ^ Основной модуль Perl Net::FTP
- ^ Часто задаваемые вопросы по C++, 10.20 Что такое «идиома именованных параметров»?
Внешние ссылки
[ редактировать ]- https://web.archive.org/web/20070502112455/http://plg.uwaterloo.ca/~rgesteve/cforall/named_pars.html
- В C++ эту парадигму можно легко реализовать: Библиотека параметров Boost.
- Именованные параметры на различных языках программирования в Rosetta Code