関数を呼び出して値を取得するときは、通常、関数が失敗するか何も返さない場合に備えて、変数を初期化し、初期化されていない変数の処理を避けたいと考えています。文字列、整数、またはその他の型についても同じことを行います。
整数変数の例:
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
...
すべてが失敗した場合に Function が 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 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
行..)とおそらく他の不要なものを行う必要があります。