2012-01-29 2 views
11

올바른 연산자 사용 '에서'

if (N = 6) or (N = 8) or (N = 10) 
    then ShowMessage('OK'); 

코드가 더 작고 쉽게 읽을

procedure InTests; 
var 
    N, K: Integer; 

begin 
    N:= 1111; 
    if N in [6, 8, 10]   // this is correct, readable and effective code 
    then ShowMessage('OK'); 

    K:= 11; 
    if N in [6, 8, 10, K]  // this is correct but less effective 
    then ShowMessage('OK'); // (compiler creates local 16-bytes set var) 

    K:= 1111; 
    if N in [6, 8, 10, K]  // this is a bug (K > 255) 
    then ShowMessage('OK'); 
end; 

in 연산자 대신 if 체인의 다음 절차를 고려하지만, 델파이 문서는 그것에 대해 침묵하고, 잠재적 인 문제점을 알고 있어야합니다.

문제는 예를

if N in [6, 8, 10] 
    then ShowMessage('OK'); 

만 괄호 안의 상수와 in 운영자의 사용은, 델파이 좋은 방법을 생각해야 하는가?

+4

네,하지만 당신이 보여주고있다 리터럴이 아닌 상수. 즉, 나는'MEANINGFULNAME = 6; '을 const 섹션의 어딘가에서 선언하고'in' 조건에서 사용합니다. 리터럴을 사용하는 것은 좋은 습관 (검색하기가 어렵고 값을 변경해야 할 때를 놓칠 가능성이 높습니다)을 고려해야합니다. 당신은 진정한 순수한 프로그래머 : –

+0

난 그냥 리터럴을 사용하여 코드에 의해 너무 많은 몇 번을 찔렀다 ... – kludg

+0

있습니다 @MarjanVenema –

답변

1

은 당신이 여기에있는 것은 set of byte입니다. 자신에게 질문해야 할 질문은 set of byte이 실제로 귀하의 전화 번호가 나타내는 것인가? 여기서 "매직 넘버"를 가지고 있고, 나는 그냥 샘플 것을 이해하면서, 당신은

if Token in [TokenString, TokenNumber, TokenChar] then 

동안 ... 좋은 연습으로 간주 될 것이라고이 고려해야합니다

if N in [2, 12, 14, 19] then 

합니다. ..하지 않을 것입니다.

type TokenSet = (TokenNone, TokenString, TokenChar,...) 

그런 다음 첫 번째 샘플은 확실히하는 것이 좋습니다 :

그러나 첫 번째 경우 (이름 토큰)에서, 명시 적 세트의 형태가 훨씬 더 좋은 방법이 될 것입니다.

+0

질문은 마술 번호에 관한 것이 아닙니다. 마법 번호를 삭제하기 위해 편집 할 수 있습니다. – kludg

+0

"type TokenSet ="대신 "const TokenSet ="을 읽지 않아야합니까? –

+0

@Uwe은, 아니, 그것은 세트의 형태 (http://delphi.about.com/od/beginners/a/delphi_set_type입니다.htm) –

4

그것은 가장 확실히 좋습니다. 코드를 훨씬 쉽게 읽을 수있게 해주고 논리적 연산자, 괄호 등을 제거합니다. 난 항상 in 같은 테스트를 사용합니다.

유일한 단점은 (더 이상 256 이상의 값을 가질 수있다 기재 순서 타입) sets 델파이의 매우 제한된 지원이다. 그러나 당신이 그 한계에 구속되지 않는 곳에 당신은 in를 사용하는데 망설임이 없어야합니다.