У меня есть следующий код. Это выглядит ужасным, если значение равняется одному из следующего значения, затем делают что-то.
var
Value: Word;
begin
Value := 30000;
if (Value = 30000) or (Value = 40000) or (Value = 1) then
do_something;
end;
Я хочу осуществить рефакторинг код следующим образом:
var
Value: Word;
begin
Value := 30000;
if (Value in [1, 30000, 40000]) then // Does not work
do_something;
end;
Однако пересмотренный код не работает. Я предполагаю, что допустимый набор в Delphi принимает только элементы с байтом типа. Если там какая-либо хорошая альтернатива для рефакторинга моего исходного кода (помимо использования случая)?
Думаю, что-то вроде этого?
case value of
1, 30000, 40000: do_somthing
end;
Как насчет использования открытого массива?
function ValueIn(Value: Integer; const Values: array of Integer): Boolean;
var
I: Integer;
begin
Result := False;
for I := Low(Values) to High(Values) do
if Value = Values[I] then
begin
Result := True;
Break;
end;
end;
Пример (псевдокод):
var
Value: Integer;
begin
Value := ...;
if ValueIn(Value, [30000, 40000, 1]) then
...
end;
Существует класс для больших битовых наборов, см. Classes.TBits.
Несмотря на то, что он нелегко справляется с постоянными выражениями, он может быть полезен в некоторых других случаях.