1

我有一个 do-while 循环,每次它的状态(例如通过/失败)发生变化时需要记录一次消息(所以它不会使日志混乱),但每次通过循环时仍然需要做其他事情. 使用一个简单的布尔变量基本上可以告诉您是否已经记录了该消息,一旦您处于已知条件,该消息就会起作用。但是,如果您希望在任何一种情况下都第一次打印消息(通过/失败),您必须考虑到这一点。例如,如果您将条件默认为true,并且实际上第一次为真,则它不会记录它认为已经为真的“真”消息 b/c(反之亦然 ic 假) .

对于 ic=Null 的可空布尔值来说,这似乎是一个好地方,但是在那些不存在的语言中,该怎么办?

我能想到的最简单的解决方案是使用一个额外的布尔变量,比如“firstTime = True”,但是当我觉得应该有一种更微妙的方法来处理它时,使用它作为一种基本的解决方法总是困扰着我。另一种选择是使用 do-while 的突破条件作为您用作条件的任何变量的初始条件,但是当有人阅读时这可能会令人困惑int status = STATUS_QUIT,而且它肯定需要比bool firstTime = true. 第三种选择是使用枚举而不是 bool 并具有 {firstTime, true, false} 或其他内容。

是否有其他原因使用其中一个,或者有更好的方法吗?

我想出了两个选项的代码示例:

使用bool firsttime

bool firstTime = true, infoFound = false;
do
{
    if (getInfo())
    {
        if (!infoFound)
        {
            // log it (ONCE)(important)
            infoFound = true;
        }
        // use info (every time)
    }
    else if (infoFound || firstTime)
    {
        // log it (ONCE)(important)
        infoFound = false;
        firstTime = false;
    }
// FYI, WaitForStatusUpdate is a blocking call...
} while (STATUS_QUIT != WaitForStatusUpdate());

使用while循环“中断条件”作为检查变量的初始条件:
(status在 do-while 结束时更新,因此该do部分将不再执行 if status == breakOutCondition;我们可以在这里利用它来发挥我们的优势最初设置status = breakOutContition- 第一次通过它,breakOutCondition但任何后续循环都会是别的东西......仍然不确定我是否喜欢这个,因为它是一种黑客......

bool infoFound = false;
int status = STATUS_QUIT;
do
{
    if (getInfo())
    {
        if (!infoFound)
        {
            // log it (ONCE)(important)
            infoFound = true;
        }
        // use info (every time)
    }
    else if (infoFound || firstTime)
    {
        // log it (ONCE)(important)
        infoFound = false;
    }
    status = WaitForStatusUpdate();
} while (STATUS_QUIT != status);

(我将其标记为 c++,因为这就是我正在使用的,但这确实适用于任何具有类似结构的语言)

4

2 回答 2

2

枚举不是更清楚吗?

enum State { Unknown, Pass, Fail };
State state = Unknown;
...
State newState = getInfo() ? Pass : Fail;
if (newState != state) { log();  state = newState; }
于 2012-02-13T17:39:55.657 回答
1

C++ 几乎有可以为空boost::optional<bool>的布尔值,我相信会做到这一点。

在 C++ 中执行此操作的一种常见方法是在适当的上下文中创建流包装器,它会记住例如刷新多少次并防止发生进一步的日志记录。您只需照常进行日志记录,然后让流决定是否将其发送到包装的流。

于 2012-02-13T17:07:47.720 回答