当每次循环都重新分配 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;
两者都
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;