【问题标题】:Removing preprocessor branching in C#在 C# 中删除预处理器分支
【发布时间】:2014-08-10 09:34:47
【问题描述】:

我正在重构一些源代码,并获得了一项删除预处理器编译的任务。我现在已经在互联网上搜索了几天,但还没有找到任何好主意。我对 C# 也很陌生。

所以问题来了,我对每个设备都有不同的接口(类),“ControlLogic”类当时只需要使用其中一个。在程序运行时选择设备。 到目前为止,很多地方都使用了“设备”变量(也全局使用),并且考虑重命名对我来说没有意义。此外,所有设备接口(类)都派生自基类,但接口类确实为它们实现了不同的方法。

public class ControlLogic
{
#if FIRST_DEVICE
        public FirstDeviceInterace device = null;
#elif SECOND_DEVICE
        public SecondDeviceInterface device = null;
#elif THIRD_DEVICE
        public ThirdDeviceInterface device = null;
#endif

// One example method
public void startDevice()
{
    if (device != null)
    {
#if (FIRST_DEVICE || SECOND_DEVICE)
         device.startDevice();
#endif

#if THIRD_DEVICE
         device.startThirdDevice();
#endif
     }
}

// More code.....
}

那么去除预处理器编译的最佳方法是什么?

【问题讨论】:

  • 您能告诉我们关于FirstDeviceInterace 和其他人的哪些信息?您可以更改该代码吗?
  • 您有一个旨在与某些特定设备一起使用的程序,并在编译时做出决定。如果要删除编译时分支,请使程序足够智能以在运行时识别设备类型,以便同一程序可以与任何受支持的设备一起使用。您可以保留类成员变量,例如设备类型,而不是编译时常量。
  • 你应该从一个抽象基类开始,找到共性。 StartDevice() 已经是你的第一个虚拟方法,当然还有更多。
  • 是的,我可以更改 FirstDeviceInterface 和其他接口。实际上,该设备在运行时被识别,我有可用于此的全局变量。但问题是我如何根据它选择特定的设备接口(类)?

标签: c# c-preprocessor


【解决方案1】:

几个月前我遇到了类似的任务:大型 C# 代码库和大量预处理器指令的使用。手动重构在那里看起来像是一项长期无聊的猴子工作。 由于 #region 等 C# 语法细节,我在使用 unifdefunifdefcoan C 工具时失败了。从长远来看,我已经制作了自己的工具undefine。它使用正则表达式来解析预处理器指令和 sympy python 库来简化逻辑表达式。它适用于我的大型 10M 行代码库。

【讨论】:

    【解决方案2】:

    我了解这三种设备类型没有共同的基类或接口。您不能只在运行时选择这三个变量中的一个,然后将所有变量都键入一个基类型。

    这里有几个选项:

    1. 找到一种通用基本类型的方法。
    2. 如果您无法修改类(或者由于某种原因不合适),请编写一个包装器。该包装器可以具有您喜欢的任何结构。您可以为每个设备类使用一个具有通用基类型的包装器。
    3. 使用 dynamic。这可以是一种快速修复,但需要较少的工具帮助(更少的自动完成、更少的手头文档、更少的快速静态错误检查)。

    使用#if 来解决这个问题是很不寻常的。这是有问题的,因为甚至确保代码编译的测试量现在已经增加了两倍。您还需要多个二进制文件。

    【讨论】:

    • 在提供完整的自助解决方案之前,您不认为应该给 OP 澄清的机会吗?
    • @HenkHolterman 你可能是对的。另一方面,这个答案将对许多未来的访问者有用。在许多情况下,这里都有一些东西。
    • 您好!实际上这三种设备类型(实际上还有更多)具有共同的基类,但每种类型都有一些其他设备类型没有的额外方法。
    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多