Можно ли вообще знать, приведет ли размещение кейса в цикле for к неправильной сборке. Меня интересует в основном Delphi, но это интересный вопрос программирования, как с точки зрения стиля, так и производительности.
Вот мой кодез!
case ResultList.CompareType of
TextCompareType:
begin
LastGoodIndex := -1;
for I := 1 to ResultList.Count -1 do
if (LastGoodIndex = -1) and (not ResultList[I].Indeterminate) then
LastGoodIndex := I
else if not ResultList[I].Indeterminate then
begin
if (StrComp(ResultList[LastGoodIndex].ResultAsText,
ResultList[I].ResultAsText) > 0)
and (Result FalseEval) then
Result := TrueEval
else
Result := FalseEval;
LastGoodIndex := I;
end;
end;
end;
NumericCompareType:
begin
//Same as above with a numeric comparison
end;
DateCompareType:
begin
//Same as above with a date comparison
end;
BooleanCompareType:
begin
//Same as above with a boolean comparison
end;
в качестве альтернативы я мог бы написать
begin
LastGoodIndex := -1;
for I := 1 to ResultList.Count -1 do
if (LastGoodIndex = -1) and (not ResultList[I].Indeterminate) then
LastGoodIndex := I
else if not ResultList[I].Indeterminate then
begin
case ResultList.CompareType of
TextCompareType:
begin
if (StrComp(ResultList[LastGoodIndex].ResultAsText,
ResultList[I].ResultAsText) > 0)
and (Result FalseEval) then
Result := TrueEval
else
Result := FalseEval;
LastGoodIndex := I;
end;
NumericCompareType:
begin
//Same as above with a numeric comparison
end;
DateCompareType:
begin
//Same as above with a date comparison
end;
BooleanCompareType:
begin
//Same as above with a boolean comparison
end;
end;
end;
end;
Мне не нравится второй способ, потому что я задаю вопрос, на который я знаю ответ в цикле for, и мне не нравится первый способ, потому что я повторяю код, который я использую, чтобы выяснить, какой из мои объекты содержат достоверную информацию.
Возможно, кто-то может предложить схему проектирования, которая бы обошла все это вместе.