2013-09-20 5 views
-2

Я из C++ фона и я путать с одним из заявления, как этотКак реорганизовать оценка короткого замыкания

if TUtils.CheckValue(objData, LChan) and 
     (LChan.Int.Value = (aObject as TomDBChan).Int.Value) then 
    begin 
      //Operation 
    end; 

это нормально, чтобы преобразовать это в

  LChan.Int.Value = (aObject as TomDBChan).Int.Value ; 
      if TUtils.CheckValue(objData, LChan) then 
      begin 
      //Operation 
      end; 

или должен я также проверьте, имеет ли значение LChan.Int.Value в нем?

+3

Ваш реорганизованный код не компилируется. Какова ваша цель? –

+3

Я также не понимаю ссылку на C++. Логические операторы в C++ также оцениваются по короткому замыканию слева направо. –

+4

Мое самое лучшее предположение заключается в том, что вы путаетесь между назначением C++ и операторами равенства, = и == соответственно. В Delphi эквиваленты: = и =. Как только вы поняли, что используют операторы, и тот факт, что есть только сравнение, и нет назначения, вы поймете и узнаете, что вы ничего не должны менять. –

ответ

2

Если ваша цель состоит в том, чтобы предотвратить какую-либо оценку короткого замыкания, просто убедитесь, что составные части выражения вычисляются отдельно:

b1 := TUtils.CheckValue(objData, LChan); 
b2 := (LChan.Int.Value = (aObject as TomDBChan).Int.Value); 

if b1 and b2 then 
begin 
    //Operation 
end; 

Это гарантирует, что любые побочные эффекты в CheckValue() или .Value методы будут выполнены..

+2

Я не уверен, что получается из угадывания вопроса. Поскольку вопрос в настоящее время не имеет смысла, я не понимаю смысла этого. Возможно, апеллятор хочет избежать короткого замыкания. Возможно, искатель хочет сломать длинное выражение без изменения семантики. Последний лучше подходит для рефакторинга. Но кто знает? –

1

Чтобы сделать яснее: ваш предлагаемый рефактор не в порядке.

Заявление: «LChan.Int.Value = (aObject как TomDBChan) .Int.Value» возвращает либо true, либо false, и не имеет смысла помещать его вне условия if.

Вы не можете слепо провести проверку короткого замыкания рефакторинга. Это потому, что правая сторона не оценивается, если левая сторона ложна. При этом ваша логика программы меняется.

Я не могу сказать, какие контрольные значения, но что, если он проверяет нулевой указатель? Если бы реорганизовать его:

b1 := TUtils.CheckValue(objData, LChan); 
b2 := (LChan.Int.Value = (aObject as TomDBChan).Int.Value); 

И получается LChan будет нулевым, тогда ваша программа будет вызывать исключение на b2: = ... потому что LChan.Int не существует там, где это было бы ранее не вызывать исключение.

LChan.Int.Value = (aObject как TomDBChan) .Int.Value проверяет, равны ли они, он не присваивает (aObject как TomDBChan) .Int.Value to LChan.Int.Value.

Смежные вопросы