私が望んでいるほどレガシーではないコードを維持するように依頼されましたが、それはコンパイラ指令であふれていて、ほとんど判読できず、ほとんど同じように維持しやすくなっています。適例:
#if CONDITION_1
protected override void BeforeAdd(LogEntity entity)
#else
protected override void BeforeAdd(AbstractBusinessEntity entity)
#endif
{
#if CONDITON_1
entity.DateTimeInsert = DateTime.Now;
#else
((LogEntity) entity).DateTimeInsert = DateTime.Now;
#endif
base.BeforeAdd(entity);
}
using
ディレクティブはさらにきれいです:
#if CONDITION_1
using CompanyName.Configuration;
#endif
#if CONDITION_2||CONDITION_1
using CompanyName.Data;
using CompanyName.Data.SqlBuilders;
#else
using CompanyName.Legacy.Database;
using CompanyName.Legacy.Database.SQLBuilders;
using CompanyName.Legacy.Database.SQLBuilders.parameterTypes;
#endif
やってみようと思っConditionalAttribute
たのですが、この状況ではうまくいきません
このコンパイラ ディレクティブの悪夢から抜け出す方法はありますか?
コードは に対してコンパイルされ.NET 3.5
ます。
更新:
Oded は、BeforeAdd
メソッドの周りのコンパイラ ディレクティブを削除してオーバーロードすることを提案すると答えました。残念ながら、どちらのメソッドもAbstractBusiness
最終的に含まれるアセンブリに応じて 2 つの異なる実装を提供するクラスをオーバーライドすることになっているため、これは機能しません。
protected virtual void BeforeAdd(TEntity entity) {}
また
protected virtual void BeforeAdd(AbstractBusinessEntity entity) {}
このコードは、会社が過去に作成した一連のライブラリから依存関係を取得し、それ以来「アップグレード」しています。現在、名前空間が衝突し、実装が異なるライブラリ セットの 4 つの異なるバージョンがあります。すべては、(非常に) 古いバージョンを使用するアプリケーションとの「後方互換性」の名のもとに行われています。
結論
一般的なアプローチ( KISSなど)として最も理にかなっているため、@Odedの回答を選択することになりました。ただし、この場合は使用できませんでした。ここに表示されているのは氷山の一角にすぎません。お金を払ってくれるなら、このコードにキスしたくありません。