条件代码的更好方法
本文关键字:方法 更好 代码 条件 | 更新日期: 2023-09-27 18:11:12
我有一些代码在#if DEBUG... #else
块内定义了大量常量;比如:
public static class C
{
#if DEBUG
public const string FIELDAAA = "VeryLongDescriptiveFieldName";
public const string FIELDBBB = "AnotherLongDescriptiveFieldName";
public const string FIELDCCC = "YetAnotherLongFieldName";
// ... many more field definitions
#else
public const string FIELDAAA = "F1";
public const string FIELDBBB = "F2";
// Notice that FIELDCCC is missing - whoever added it to the
// DEBUG block, forgot to add it here.
#endif
}
这些字段用于构建对第三方服务器的文本请求——服务器可以接受两种形式的字段名。但是,使用简短形式效率更高,因为每个消息都有大小限制,当请求变得太大时,必须将其分解为几个消息。每条消息都有成本,所以我们的软件应该在生产中使用短字段名,在开发中使用长字段名(用于调试)。
有许多这样的源文件,其中大多数在debug块和else块中有不匹配的常量。由于这些不匹配,由于缺少常量,该应用程序的某些部分无法在发布模式下构建。
我试图通过删除巨大的DEBUG
块来解决这个问题,但我需要保持长和短字段名称定义,同时确保很难添加一个新的错误。我还想把更改的数量保持在最低限度——这是在一个有很多用户使用的大型应用程序中,我不想引入一个破坏性的更改——这些字段在很多地方使用。
目前我的想法是:
public static class C
{
public const string FIELDAAA =
#if DEBUG
"VeryLongDescriptiveFieldName";
#else
"F1";
#endif
public const string FIELDBBB =
#if DEBUG
"AnotherLongDescriptiveFieldName";
#else
"F2";
#endif
public const string FIELDCCC =
#if DEBUG
"YetAnotherLongFieldName";
#else
"F3";
#endif
// more constants
}
我不知道我是否有思维障碍,但我想不出任何明显更好的东西。有没有一种更好的方法,可以让我做我想做的,但不那么混乱的设置?我使用#if DEBUG
没有问题,但感觉很脏,如果有更干净的解决方案,我更喜欢。
有!!(always)
IMHO我认为你可以使用像工厂模式(http://www.oodesign.com/factory-pattern.html)或使用DI(依赖注入- https://en.wikipedia.org/wiki/Dependency_injection.
这样,你应该删除公共静态C类,你可以使用下面的另一个解决方案。
这样你就不会把你的解决方案只与#if调试每个字符串联系在一起,而且你使用工厂模式来实例化"正确的"常量,所以你不需要在每个字符串之间担心。
你的代码可以编译,因为接口要求每个类都正确地实现,而没有set的属性将不允许程序员更改内容。
在使用常量的类中,你可以这样做。
public class UsingClass
{
IConstantClass constants;
public UsingClass(){
constants f = new FactoryConstants();
}
}
public class FactoryConstant
{
public FactoryConstant()
{
}
public IConstantClass GetConstant()
{
#if DEBUG
return new ConstantsDebugMode();
#else
return new ConstantsProduction();
#endif
}
}
public interface IConstantClass
{
public string FIELDAAA {get;set;}
public string FIELDBBB {get;set;}
}
public class ConstantsProduction : IConstantClass
{
public string FIELDAAA
{
get { return "ProductionString"; }
set { }
}
public string FIELDBBB
{
get { return "ProductionString2"; }
set { }
}
}
public class ConstantsDebugMode : IConstantClass
{
public string FIELDAAA
{
get { return "ReallyLongStringDebugMode"; }
set { }
}
public string FIELDBBB
{
get { return "ReallyLongStringDebugMode2222"; }
set { }
}
}
p。:我没有测试这段代码,但它应该可以工作。
依赖注入解决方案,你将在配置文件中配置系统应该如何实现接口类(IConstantClass),这样你就不需要每次都实例化工厂类。
你可以修改我的代码,并在构造函数或属性中传递一个接口给类,并使用正确的解决方案。