条件代码的更好方法

本文关键字:方法 更好 代码 条件 | 更新日期: 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),这样你就不需要每次都实例化工厂类。

你可以修改我的代码,并在构造函数或属性中传递一个接口给类,并使用正确的解决方案。