首先我重构了a
和b
局部变量。
int TestTimeOut(unsigned long Timed_Val1, unsigned long Timed_Val2)
{
Timed_Val2 = Timed_Val1 + (Timed_Val2 * 200);
const int a = (Timed_Val1 > Timed_Val2) && (sys_msec < Timed_Val1) && (sys_msec > Timed_Val2);
const int b = (Timed_Val1 < Timed_Val2) && ((sys_msec < Timed_Val1) || (sys_msec > Timed_Val2));
return a || b;
}
现在,这是有趣的,Timed_Val2
基于Timed_Val1
,他们都是unsigned
所以Timed_Val2
总是>= Timed_Val1
。起初,我看不出任何方式a
可能是真实的,但正如马克威尔金斯指出的那样,如果环绕它的话也是可以的。
但也有只有一种情况,他们是相同的,但是,当我要解压出来作为一个特殊情况,以帮助可读性。然后,我可以将两个>
/<
语句分解为if
。
int TestTimeOut(unsigned long Timed_Val1, unsigned long Timed_Val2)
{
if (Timed_Val2==0) return FALSE;
{
Timed_Val2 = Timed_Val1 + (Timed_Val2 * 200);
if (Timed_Val1 > Timed_Val2)
{ //this happens when it wraps around past 2^32
return (sys_msec < Timed_Val1) && (sys_msec > Timed_Val2);
}
else
{
return (sys_msec < Timed_Val1) || (sys_msec > Timed_Val2);
}
}
}
所以,我要说这个返回true,当且仅当(当且仅当)sys_msec
为Timed_Val1
之前或之后Timed_Val1 + Timed_Val2 * 0.2 seconds
。
作为最后阶段,现在我会重命名变量并对其进行注释。
//Returns true iff time is before startTime_msec or after timeoutPeriods of 0.2 seconds
//startTime_msec - millisecond value compariable to sys_msec
//timeoutPeriods - the number of timeout periods of 0.2 seconds each
int TestTimeOut(const unsigned long startTime_msec, const unsigned long timeoutPeriods)
{
if (timeoutPeriods==0) return FALSE;
{
const unsigned long maxTime_msec = startTime_msec + (timeoutPeriods * 200);
if (startTime_msec > maxTime_msec)
{ //this happens when it wraps around past 2^32
return (sys_msec < startTime_msec) && (sys_msec > maxTime_msec);
}
else
{
return (sys_msec < startTime_msec) || (sys_msec > maxTime_msec);
}
}
}
这并不是说没有更好的方法来做到这一点,但至少现在它是可读的。
是的,那太疯狂了。我会重构它以使用更多的行和一些临时变量。应该变得更清楚。 – weston