Когда я вызываю функции для получения значения, я обычно инициализирую переменную на случай, если функция не работает или ничего не возвращает, и я хочу избежать работы с неинициализированной переменной. Я делаю то же самое для строки, целого числа или любого другого типа.
Пример для целочисленных переменных:
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, если все терпит неудачу. Но у меня есть сотни функций, и я не могу полагаться на то, что я никогда не ошибался в том, как функции обрабатывают все, и я уверен, что некоторые из них не возвращают 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
но, я проигнорировал это, без всякой причины, просто не посмотрел туда. Поскольку он позволил мне скомпилировать его, я подумал, что все в порядке. Итак, я искал предупреждение и «исправил» довольно много функций, у которых была похожая проблема, из-за всех IF Результат мог быть не определен.
РЕДАКТИРОВАНИЕ 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
строк...) и, возможно, некоторые другие ненужные вещи.
StrToInt()
. Чтобы использовать их правильно, вы должны использовать кадрtry/except
, где вы обрабатываете случай исключения. В обработчике исключения вы можете установить значение после вызова функции (или сделать что-то совершенно другое). Как правило, вам следует избегать этой конструкции, если есть альтернативы. Код может быть трудночитаемым, а исключения могут снизить производительность. В приведенном примере предпочтительны такие альтернативы, какStrToIntDef
илиTryStrToInt
. - person LU RD   schedule 26.11.2015vType=2
. Вы должны сделать значение по умолчанию ВНУТРИ функции, как я описал в моей ссылке выше. См. обновленный образец pastebin.ca/3272690. - person Arioch 'The   schedule 26.11.2015