1

ステータス(合格/不合格など)が変化するたびにメッセージを1回ログに記録する(ログが乱雑にならないようにする)必要があるdo-whileループがありますが、ループを通過するたびに他のことを行う必要があります. 単純なブール変数を使用すると、基本的に、そのメッセージを既にログに記録しているかどうかがわかります。これは、既知の状態になると機能します。ただし、どちらの場合 (合格/不合格) でも初めてメッセージを出力したい場合は、それを考慮する必要があります。たとえば、条件をデフォルトで に設定しtrue、実際に初めて true である場合、「True」メッセージをログに記録しません b/c 既に true であると見なします (ic false の場合はその逆)。 .

これは、ic=Null を使用したnull 許容ブール値に適しているように思えますが、それらが存在しない言語では、どうすればよいでしょうか?

私が考えることができる最も簡単な解決策は、「firstTime = True」のような追加のブール変数を使用することですが、それを使用することは、それを処理するためのより繊細な方法があるべきだと感じるときの基本的な回避策として常に私を悩ませます. 別のオプションは、条件として使用している変数の初期条件として do-while のブレークアウト条件を使用することですが、誰かが を読んだときに混乱する可能性がint status = STATUS_QUITあり、確かに よりも多くの説明コメントが必要ですbool firstTime = true。3 番目のオプションは、bool の代わりに列挙型を使用し、{firstTime, true, false} などを使用することです。

どちらかを使用する他の理由はありますか、またはこれを行うためのより良い方法はありますか?

私が思いついた2つのオプションのコード例:

使用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ループの「ブレークアウト条件」をチェック変数の初期条件として使用します: (
statusdo-while の最後で更新されるため、 の場合、doセクションは二度と実行されません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++ にはほとんど null 可能なブール値boost::optional<bool>があり、私が信じているトリックを行うでしょう。

C++ でこれを行う一般的な方法の 1 つは、適切なコンテキストで作成するストリーム ラッパーです。たとえば、フラッシュされた回数を記憶し、それ以上のログが発生しないようにします。通常どおりログを記録し、ラップされたストリームに送信するかどうかをストリームに決定させるだけです。

于 2012-02-13T17:07:47.720 に答える