在过去,您经常有一个“低级”的数据模块,不依赖于任何其他模块,但可以被它们引用,例如获取整个系统使用的枚举。
现在我们在模块之间有了面向对象的接口,包括调用和事件。我的问题是,我们不应该在一个地方定义整个系统中使用的枚举,并且每个需要它们的接口都应该引用这些枚举吗?
我见过在每个接口上重新定义基本相同的枚举的软件,当它被传递到另一个模块时具有翻译功能。
例如,接口 IModule1 可能有
enum module1_state
{
Unknown,
NotRunning,
Running
}
和接口 IModule2 可能有
enum module2_state
{
Unknown,
NotRunning,
Running
}
例如,模块 1 收集数据,模块 2 执行一些逻辑,然后将数据进一步传递给第三个模块,例如 GUI。
在许多情况下,枚举会完全不同,因为例如,第二个模块可以抽象出第三个模块不需要的一些信息,并传递一个简化版本。
但在某些情况下,它们并没有什么不同,在我看来,枚举仍然在每个接口上重新定义是错误的。一个示例是作为几个不同用例的一部分执行的操作。动作是一样的,但是根据用例的不同,几个小细节是不一样的。携带用例详细信息的枚举通过接口传递到高级逻辑模块,然后通过另一个接口传递到低级模块。它在每个接口上重新定义,因此必须在高级逻辑模块中进行翻译。
还有一些其他模块只是将较旧的现有接口转换为较新的接口,并且再次,两个接口都重新定义了相同的枚举。
谁能告诉我哪个是最佳实践?