3

要件が前後に変化するため、コード内で const を使用する if/else ブロックがいくつかあります。たとえば、次のようになります。

const bool DisplayAverageValues = true;
if(DisplayAverageValue)
{
  // Do this
}
else
{
  // Do that
}

要件が再び変更される可能性があるため、現在使用されていないコードは削除したくありません。来週必要になる可能性があります。また、リファクタリングの一部にしたいので、未使用のコードをコメントアウトしたくありません。ブール値を変更するだけで、いつでもコンパイルできるようになります。

問題は、到達できないコードに対して警告が表示されることです。そのため、標準の if/else ブロックをプリプロセッサ #if/#else に置き換えることを考えていました。

#define DisplayAverageValues
#if DisplayAverageValue
  // Do this
#else
  // Do that
#endif

私が今直面している問題は、プリプロセッサ シンボルを false に設定できず、定義または未定義しかできないことです。次から変更する方がはるかに明白です。

#define DisplayAverageValues true

#define DisplayAverageValues false

それ以外の

#undef DisplayAverageValues

また

//#define DisplayAverageValues

(同じシンボル名が他の場所で使用されていると、問題が発生する可能性があります)。

より良い方法はありますか?

4

3 に答える 3

2

プリプロセッサ ディレクティブは、コード アーキテクチャにプレサイス スライスがあり、1 つのコードがコンパイル可能で、他のコードと交差しない必要がある場合に適しています。あなたの場合、コード実行フローに沿って要件と何らかの形で交差する可能性のあるさまざまなオプションに直面しているようです。

Options私の意見では、これを管理する最善の方法は、アプリケーションの実行時の動作に影響を与えるすべてのプロパティを保持する、RuntimeConfigurations、またはその他のクラスを定義し、そのクラスのインスタンス( の場合もあるSingletone) をさまざまな実行オプションを考慮する必要があるアプリケーション。

ダニエルが言った別のオプションは、そのコードを別のモジュール、必要に応じてプラグインに抽出し、それらを動的にロードすることです。ただし、実装できる場合とできない場合があります。ちなみに、アーキテクチャで以前に考慮されていなかった場合、一般に、このレベルの柔軟性を実現するには、無関係ではない時間を費やす必要があります。

于 2013-05-06T10:21:51.017 に答える
1

プロセッサ ディレクティブは、そのような場合のために設計されていないようです。SOLID の観点から、次のことを行う必要があります。

1) いくつかのインターフェースを作成します:

public interface IDoingSomething {
  void Do();
}

2) このインターフェースの 2 つの実装を作成します。

public class DoingThis : IDoingSomething {
  public void Do() {
    // Do this
  }
} 

public class DoingThat : IDoingSomething {
  public void Do() {
    // Do that
  }
} 

3) アプリケーションの開始点のどこかで構成を読み取り、使用する実装を決定します。

IDoingSomething doerSomething;

if(DisplayAverageValue) {
  doerSomething = new DoingThis();
} else {
  doerSomething = new DoingThat();
}

4) コードでインターフェイス オブジェクトを使用して、何かを実行します。

doerSomething.Do();

これは一種の戦略パターンであり、複数の実装を 1 か所で切り替えることができ、具体的なインターフェイスの実装を持つクラスを除いてコードを変更する必要はありません。これは、コードのメンテナンス、スケーラビリティなどに適しています。

于 2015-12-30T08:22:55.520 に答える
0

コメントと Tigran の回答にはいくつかの良い提案がありましたが、今のところ、まだ理解しやすいシンプルなソリューションにとどまります。シンボル名を削除することで、必要に応じてコードを変更する方法に疑いの余地はありません。

#if true
  // Display average values
  ...
#else
  // Do not display average values
  ...
#endif
于 2013-05-07T13:49:35.443 に答える