Я настоятельно предпочитаю exist
вместо nargin
по двум причинам.
1.
После прочтения большого количества кода от людей, которых никогда не учили оглядываться на свой собственный код, я только почувствовал себя сильнее, поскольку exist
делает код читабельным.
Например, я однажды столкнулся с такой функцией. Для вашего удобства я дал переменным разумные имена:
[model, accuracy] = epicModelingFunction (dataMatrix, responseVector, indicatorForCategoricalVariables, optionsForInternalFunctions, typeOfDistanceCalculation, notationForMissingValues, isClassificationAndNotRegression, scalingMethod, shouldPlotAllIntermediateStuff)
% EPICMODELINGFUNCTION is actually a horrible function to read and not epic at all
% ...
Затем следовало if nargin < n
для каждой переменной, отличной от первых двух. Единственная причина, по которой я мог понять, каким должен быть nargin(n)
, не считая ввод заголовка, заключается в том, что за if nargin < n
всегда следовало (только иногда несколько строк кода и) объявление отсутствующего ввода со значением по умолчанию. Для больших кусков кода в if nargin < n
я бы определенно потерял след.
2. exist
на самом деле не проверяет полное рабочее пространство при вызове из функции . Конечно, сравнение двух чисел обходится дешевле, чем сравнение нескольких строк, но если оно используется в начале функции для заполнения значений по умолчанию для не заданных параметров, это нормально. Рассмотрим следующую функцию:
function testExist(C)
if exist('B', 'var')
disp('''exist'' in a function checks the workspace.')
elseif exist('C', 'var')
disp('''exist'' in a function ignores the variables in the workspace, but checks the function space.')
else
disp('''exist'' is broken or no parameter was given.')
end
end
И затем выполнить следующее:
A = magic(3);
B = magic(4);
testExist(A)
приводит к выводу:
'exist' in a function ignores the variables in the workspace, but checks the function space.