Когда я вызываю функции для получения значения, я обычно инициализирую varible, в случае, если функция терпит неудачу или ничего не возвращает, и я хочу избежать использования неинициализированной переменной. Я делаю то же самое для строки, целого или любого другого типа.
Пример для целочисленных переменных:
vPropValue := 0;
vPropValue := GetPropValue(vObject,'Height');
IF vPropValue > 0 Then
...
это самый распространенный способ использования.
Я знаю, что могу использовать:
If GetPropValue(vObject,'Height') > 0 Then
...
но с первым примером я избегаю нескольких вызовов для функции, если мне нужно снова получить результат в коде.
То же самое для строки (хотя я знаю, что локальные строки инициализируются пустой строкой, а целые числа не могут содержать любое значение)
vName := '';
vName := GetObjectName(vObject,'ObjectName');
IF Trim(vPropStrValue) <> '' Then
...
Я знаю, что могу предпринять шаги, чтобы избежать дублирования присвоения значений, например, чтобы удостовериться, что функция возвращает 0, если все не удается. Но у меня есть 100 функций, и я не могу полагаться. Я никогда не ошибался, поскольку функции обрабатывают все, и я уверен, что некоторые из них не возвращают 0, если все не удается.
Я пытаюсь понять, почему это нежелательная практика и как ее лучше избегать.
ИЗМЕНИТЬ
Вот пример, когда функция не возвращает правильное значение или 0:
function GetValue(vType:integer):integer;
begin
if vType=1 then
Result:=100
else if (vType>2) and (vType<=9) then
Result:=200;
end;
procedure TForm1.Button1Click(Sender: TObject);
var vValue:integer;
begin
vValue:=GetValue(11);
Button1.Caption:=IntToStr(vValue);
end;
В этом случае значение, возвращаемое функцией, является случайным числом.
В этом случае инициализация представляется действительным. ИЛИ НЕ?
ИЗМЕНИТЬ 2:
Как указал Дэвид в своем ответе, правильно, было предупреждение
[dcc32 Warning] Unit1.pas(33): W1035 Return value of function 'GetValue' might be undefined
но я проигнорировал это, без всякой причины, просто не смотрел. Поскольку это позволило мне скомпилировать его, я подумал, что все в порядке. Итак, я искал предупреждение, и я "исправил" несколько функций, которые имели схожую проблему, поскольку все IFs Result могут не быть определены.
ИЗМЕНИТЬ 3 и ЗАКЛЮЧЕНИЕ:
Я надеюсь, что это добавит рамки вопроса и объяснения:
Может быть, пример другого поворота, который я использую в большинстве моих функций, также объясняет, почему я думал, что моя инициализация переменной необходима, заключается в том, что я не был уверен, что мои функции будут вести себя правильно все время, особенно в случае вложенной функции. Маты из них все еще настроены следующим образом:
function GetProperty(vType:integer):integer;
begin
Try
if vType = 99 then
Result:=GetDifferentProperty(vType)// <-- Call to another Function, that could return whatever...
else
begin
if vType=1 then
Result:=100
else if (vType>2) and (vType<=9) then
Result:=200;
end;
except
end;
end;
Теперь я обращаюсь к этим Try Except End;
, но некоторым функциям исполняется 10 лет, и ожидать, что они будут работать на 100%, основываясь на моем опыте, не на что положиться.
Как единственный разработчик в этом проекте, я полагаю, что должен доверять своим функциям (и остальным моим кодам), но я не могу представить в нескольких средах разработчиков, что все функции настроены правильно.
Итак, мой вывод: поскольку я не заботился об основных принципах - правильно разработанных Функции, мне нужно иметь все эти проверки (переменная инициализация, Try Except
строки..) и, вероятно, некоторые другие ненужные вещи.