Может ли вообще быть известно, приведет ли размещение case внутри цикла 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, и мне не нравится первый способ, потому что я повторяю код, который использую, чтобы выяснить, какие из моих объектов содержат достоверная информация.
Возможно, кто-то может предложить шаблон проектирования, который позволит обойти это все вместе.