2012-06-13 2 views
4

가정하자 나는 다음과 같은 코드가 있습니다델파이 -에 할당 된 값 'x'를 사용한 적이

function DoSomething:Boolean; 
var obj : TMyObject; 
i : Integer; 
begin 
    Result := False; //We haven't executed GetValue() correctly yet 
    obj := TMyObject.Create(); 
    try 
    //perform some code that may produce an exception   
    i := obj.GetValue(); 
    //Set the return to True as we executed GetValue() successfully 
    Result := True; 
    finally 
    //do some cleanup 
    obj.Free; 
    end; 
end; 

델파이 컴파일러는 결과에 할당 된 값이 첫 번째 줄에 사용되지 않습니다 불평됩니다.

나는 분명히 뭔가 빠졌지 만 컴파일러가 최적화를 수행하는 이유는 알지 못한다.

저는 항상 자신의 값이 무엇인지 혼란스럽지 않게 명시 적으로 변수를 설정하도록 가르쳐 왔습니다. 또한 GetValue() 함수가 예외를 생성하면 Result := True; 행이 실행되지 않습니다. 그래서 우리는 델파이가 변수를 초기화했는지의 자비에 있습니다.

이렇게 안전하고 수용 가능한 코드는 무엇입니까? 메서드의 첫 번째 줄을 단순히 제거해야합니까? 이렇게하면 읽는 것이 훨씬 어려워 집니까? 특정 컴파일러 경고를 해제해야하지만,이 경고 메시지는 유용한 정보를 제공 할 수 있으므로이를 수행하는 것을 주저합니다.

+0

초기화하지 않으면 컴파일러가 '결과'로 수행하는 작업에 대한 생각은 대답이 ** ** 없습니다. [결과 변수가 함수의 첫 번째 줄에서 정의 되었습니까?] (http://stackoverflow.com/q/10084043/576719)를 참조하십시오. –

답변

15

컴파일러는 맞습니다. False를 Result에 대입하면 함수가 반환 할 수있는 유일한 값은 True입니다.

두 가지 가능한 실행 경로는 다음과 같습니다

  1. 기능은 예외를 발생하고 True를 반환하지 않습니다.
  2. 이 함수는 예외를 발생 시키므로 결과 값을 전혀 반환하지 않습니다.

해결 방법은 간단합니다. 결과를 False로 설정하는 코드 줄을 제거하십시오. 어느 시점에서 반환 값이 아무런 도움이되지 않으며 함수를 프로 시저로 변환 할 수 있다는 것이 완전히 명확 해집니다.

4

함수에는 두 가지 결과 만 있습니다. True을 반환하거나 예외를 발생시켜 경고가 사라지게하는 대신 프로 시저로 바꿀 수 있습니다.

당신이 GetValue() 당신이 DoSomething에 그 예외를 캡처하고 False에 반환 값을 설정해야 예외가 발생하면 함수의 결과가 False로합니다. 이 경우 반환 값을 True으로 초기화하는 함수를 시작해야합니다. 이 같은

뭔가 :

function DoSomething:Boolean; 
var 
    obj : TMyObject; 
    i: Integer; 
begin 
    Result := True; 
    obj := TMyObject.Create(); 
    try 
    try 
     i := obj.GetValue(); 
    except 
     Result := False; 
    end; 
    finally 
    obj.Free; 
    end; 
end; 
+0

그래서 나는 거기에 중첩 된'try..except'을 가지고 있어야합니다 : ( – Simon

+0

당신이 원한다면 호출자에게 예외를 발생시킬 때'DoSomething' 함수에서 리턴 값을 사용해서는 안됩니다. 'False'에 대한 결과는 절대로 사용해서는 안됩니다. DoSomething에서 예외를 처리하거나 더 높은 값으로 처리하십시오. –

+0

+1 Thanks Mikael – Simon