Я определяю пользователем многие функции, и некоторые из них имеют шесть, десять или даже больше аргументов. Чтение моего кода становится трудным, когда я забываю, каковы аргументы функции или в каком порядке они идут. Я придумал способ справиться с этим, заменив все аргументы одним массивом и используя ключи массива в качестве меток для каждый аргумент. Так, например, вместо
function MyFunction(string $sSayThis, int $nRepeatTimes, bool $bLoud = $false) {...}
теперь у меня есть
function MyFunction(array $args)
{$sSayThis = $args['sSayThis']); CheckType($sSayThis, 'string');
$nRepeatTimes = $args['nRepeatTimes']); CheckType($nRepeatTimes, 'int');
$bLoud = (IsSet($args['bLoud']) ? $args['bLoud'] : false); CheckType($bLoud, 'bool');
...
}
Вызов этой функции вместо
MyFunction('Hello', 3, true);
теперь выглядит
MyFunction(array('sSayThis' => 'Hello', 'nRepeatTimes' => 3, 'bLoud' => true));
Это вряд ли необходимо, когда есть только три аргумента, как в этом примере, но это может быть очень полезно при чтении кода функции с шестью или десятью аргументами! Кроме того, если мне нужно передать значение только для десятого аргумента и использовать значения по умолчанию для всех необязательных аргументов до этого, я могу просто опустить эти другие аргументы из вызова вместо передачи для них серии , ''
.
Это хак, и он выглядит довольно уродливым. Но это помогает сделать мой код самодокументируемым и более легким для чтения.
Я знаю, что есть IDE, которые дают мне подсказки аргументов, но я использую Notepad++, который этого не делает.
Эта идея обсуждается в аналогичном вопросе, заданном в прошлом году, Аргументы функции PHP - Использовать массив или нет?, но этот вопрос не показывает, как выглядят вызовы функций, что является наиболее важной частью вопроса. Некоторые люди в ответ на этот вопрос сказали, что функция никогда не должна нуждаться в десяти аргументах, а наличие такого количества указывает на плохой дизайн. Я понимаю эту озабоченность, но иногда алгоритму просто нужно много информации.
Что-то не так с этим подходом, или есть лучший способ самостоятельно документировать эти вызовы функций?