当每次循环都重新分配 while 循环的布尔表达式时,如何避免违反 DRY 原则?

How to avoid violating the DRY principle when the boolean expression of a while loop is reassigned every loop pass?

两者都

while MyFunction(1, 2, 3) > 0 do
  begin
    Temp := MyFunction(1, 2, 3);
    ShowMessage(IntToStr(Temp));
  end;

Temp := MyFunction(1, 2, 3);
while Temp > 0 do
  begin
    ShowMessage(IntToStr(Temp));
    Temp := MyFunction(1, 2, 3);
  end;

违反了 DRY principle 因为有两次调用 MyFunction 而只需要一次。

Temp := 1;
while Temp > 0 do
begin
   //...
end;

或重复直到

简单,

  function dotemp(a,b,c:integer;var value : integer):boolean;
  begin
    value:a*b+c;
    result:=value>0; 
  end;

  begin
    while dotemp(a,b,c,temp) do
        begin
           Operateontemp(temp);
         end;
  end;

Pascal 没有左值赋值,但它有 var 参数。

我不太明白问题所在。你为什么不反转逻辑并忘记 Break:

repeat
  Temp := MyFunction(1, 2, 3);
  if Temp <= 0 then
  begin
    //code which uses Temp, for example:
    ShowMessage(IntToStr(Temp));
  end;
until Temp > 0;

这与您的第一个示例完全相同,即 while True do 代码片段,但既没有调用该函数两次,也不需要使用赋值作为表达式(在 [=27 中不可能) =]), 也不需要提前退出 Break.

在 C 语言中,您可以使用

do
{
    ...
} while (temp <= 0);

请注意,每

if (condition) then 
  Break;

可以替换为

if not (condition) then
  // rest of original loop.
end;

循环的其余部分。

有可能使用无限循环和Break:

while True do
  begin
    Temp := MyFunction(1, 2, 3);
    if Temp <= 0 then Break;
    ShowMessage(IntToStr(Temp));
  end;