更好的条件代码方法

时间:2015-09-04 22:23:34

标签: c# conditional-compilation

我有一些代码在#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块来解决此问题,但我需要同时保留长字段和短字段名称定义,同时确保添加新的字段名称定义非常困难不正确。我还希望将更改次数保持在最低限度 - 这是很多用户使用的大型应用程序,我不想引入重大变化 - 这些字段在很多地方使用。 / p>

目前这就是我的想法:

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时遇到问题,但这感觉很脏,如果有更清洁的解决方案,我更喜欢。

1 个答案:

答案 0 :(得分:3)

是的,有!! (总是)

恕我直言,我认为您可以使用类似工厂模式(http://www.oodesign.com/factory-pattern.html)或使用DI(依赖注入 - https://en.wikipedia.org/wiki/Dependency_injection

这样你应该删除公共静态C类,你可以使用下面的另一个解决方案。

这样您就不会将解决方案与#if debug每个字符串绑定在一起,并且您使用工厂模式来实例化“正确”常量,这样您就不必担心每个字符串。

您的代码将被编译,因为接口要求每个类正确实现,而没有set的属性将不允许程序员更改内容。

在使用你的常数的类中,你可以做到。

write( pfd[ 1 ], &childTotal, sizeof( childTotal ));

PS。:我没有测试这段代码,但它应该有效。

您将在配置文件中配置Depedency注入解决方案,系统应如何实现接口类(IConstantClass),因此您不需要每次都要实例化Factory类。

您可以更改我的代码并将接口传递给构造函数中的类或具有正确解决方案的属性。