【发布时间】:2011-07-18 05:55:58
【问题描述】:
我被要求维护一些不像我想要的那样遗留的代码,并且它充斥着编译器指令,使其几乎不可读并且几乎可以维护。举个例子:
#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 类,该类根据最终包含的程序集提供两种不同的实现:
protected virtual void BeforeAdd(TEntity entity) {}
或
protected virtual void BeforeAdd(AbstractBusinessEntity entity) {}
此代码从公司过去一段时间创建的一组库中获取其依赖项,并且从那时起一直在“升级”。他们现在拥有这组库的 4 个不同版本,具有冲突的命名空间和不同的实现。全部以与使用(非常)旧版本的应用程序的“向后兼容性”的名义。
结论
我最终选择了@Oded 的答案,因为它作为一种通用方法最有意义(K.I.S.S. 等等)。不过在这种情况下我不能使用它;你在这里看到的只是冰山一角。我不想亲吻。这个代码,如果它付钱给我。
【问题讨论】:
-
我敢打赌,写这篇文章的人认为他们非常聪明......
-
如果它还活着,我会告诉你在疾病杀死它接触到的任何东西之前把它拿出来并射杀它。
-
为什么会有两种不同的方法?在什么场景下使用?
-
@Lasse - 它们位于公司开发的一组库的两个不同版本中,因此根据调用应用程序编译的库版本来使用它们。删除其中任何一个都会破坏公司其他地方运行的多个应用程序。
-
您确定不能使用 DVCS 或类似的分支来处理这个问题? IE。为common创建一个分支,为type 1创建一个分支,为type 2创建一个分支,将代码添加到common并在common时合并到两个分支中,而不是在一个或另一个分支中开发?
标签: c# .net-3.5 c#-3.0 compiler-directives