考虑以下程序
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 = 6) or (N = 8) or (N = 10)
then ShowMessage('OK');
使代码更加紧凑和可读,但Delphi文档对此保持沉默,您应该意识到潜在的问题。
问题是:in
运算符只能在括号中使用常量,例如
if N in [6, 8, 10]
then ShowMessage('OK');
被认为是德尔福的一个好习惯吗?
答案 0 :(得分:4)
这绝对是一种很好的做法。它使代码更具可读性,并且不需要逻辑运算符,括号等。我会一直使用in
进行这样的测试。
唯一的缺点是Delphi对sets的支持非常有限(基本序数类型不能超过256个值)。但是,如果您不受这些限制的约束,那么您应该毫不犹豫地使用in
。
答案 1 :(得分: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,... )
然后第一个样本绝对是一个好习惯。