56

私はいくつかのレガシーコードを読みました:

if ( 1 || !Foo() )

書かない理由はありますか:

if ( !Foo() )
4

4 に答える 4

134

2つは同じではありません。が を短絡するFoo()ため、最初のものは決して評価されません。1||

then完了した理由 - おそらく、誰かがデバッグ目的でブランチへのエントリを強制しようとして、そこに残したのでしょう。これはソース管理の前に書かれたものである可能性もあるため、コードが失われることを望んでおらず、今のところバイパスされている可能性があります。

于 2013-10-10T09:44:00.423 に答える
10

質問は適切に回答されました - 違いは or 操作の右側が短絡されていることです。これは、if ブロックへのエントリを強制するためのデバッグ コードであることを示唆しています。

しかし、ベスト プラクティスの利益のために、少なくともベスト プラクティスでの私の大まかな刺し傷として、優先度の高い順に代替案を提案します (ベストが最後です)。

注: 例をコーディングした後、これは C++ の質問であることに気付きました。例は C# です。翻訳できることを願っています。誰かが私を必要とする場合は、コメントを投稿してください。

インラインコメント:

if (1 /*condition*/) //temporary debug

行外コメント:

//if(condition)
if(true) //temporary debug

名前指示関数

//in some general-use container
bool ForceConditionForDebug(bool forcedResult, string IgnoredResult)
{
      #if DEBUG
          Debug.WriteLine(
              string.Format(
                  "Conditional {0} forced to {1} for debug purposes",
                  IgnoredResult,
                  forcedResult));
          return forcedResult;
      #else
          #if ALLOW_DEBUG_CODE_IN_RELEASE
              return forcedResult;
          #else
              throw new ApplicationException("Debug code detected in release mode");
          #endif
      #endif
}

//Where used
if(ForceConditionForDebug(true, "condition"))...

//Our case
if(ForceConditionForDebug(true, "!Foo()"))...

また、非常に堅牢なソリューションが必要な場合は、リポジトリ ルールをソース管理に追加して、ForceConditionForDebug を呼び出したチェックイン コードを拒否することができます。このコードは、明らかに意図を伝えていないため、そのように記述すべきではありません。チェックインするべきではありません (またはチェックインを許可する必要があります) (ソース管理? ピア レビュー?) そして、現在の形式で本番環境で実行することは絶対に許可されるべきではありません。

于 2013-10-10T13:33:44.407 に答える