1

我的项目中有三个课程。让我们称它们为 MainWindow 、 ProcessUserInput 、 InitialUIPreparer 。

MainWindow 的工作只是通过按钮、文本、组合框等与用户对话。,

ProcessUserInput 将使用取自 MainWindow 和 calc 之后的值进行一些计算。完成它会将一些处理后的数据发送回MainWindow,

并且 InitialUIPreparer 将计算应该在 MainWindow 上绘制的某些形状的位置,它只会传递坐标而不是绘制它们。但它还需要获取一些数据,如窗口大小等。

好的问题开始于 MainWindow 需要从每个类获取数据,而类需要从 MainWindow 获取数据。这导致循环依赖。我通过将 MainWindow.h 包含到 "ProcessUserInput" 和 "InitialUIPreparer" 来解决问题。但只是在 MainWindow 中使用前向 decleration,如“class ProcessUserInput”和“class InitialUIPreparer”。

当然,我仍然可以继续开发。但是就像我的情况需要多次前向减速,表明设计是否糟糕,我应该重新考虑未来项目的设计吗?

4

2 回答 2

2

一般来说,前向声明一个类本身并不表示设计不好:当您的运行时依赖层次结构是双向的时,这种情况经常发生。然而,当依赖图非常密集时(即几乎每个类都依赖于几乎所有其他类),这是一个开始担心的正当理由:

循环依赖

在您的情况下,您可能会受益于以与模型-视图-控制器设计模式一致的方式分离您的类。具体来说,您可能想要引入另一个类,我们称之为它Model,它将保留需要在其他类之间共享的所有信息。每个类都会从 shared 中提取它需要Model的信息,并将它产生的信息也放入模型中。这样,各个类将能够用对类的单个依赖项替换对所有类的依赖Model项:

模型依赖

于 2013-10-30T12:59:04.343 回答
1

前向声明的存在本身并不是代码异味。然而,需要前向声明的原因可能是。

在您的情况下,您需要前向声明才能构建循环依赖。 是你的代码味道。循环依赖的存在总是一种代码味道——这并不是说它总是一种设计缺陷,但它是应该被关注的。

尤其是在小程序中,循环依赖实际上可能是一个理论上的设计缺陷,但可能不值得修复。在您的情况下,您有两个直接相互通信的类。在大型生产系统中,我通常将此设计归类为“损坏;需要修复”。我将解决它的方法是引入某种消息总线,或与两个类分开的接收器/提供器机制,并让每个类与其通信,而不是彼此通信。构建这个系统要么需要花费大量工作,要么需要花费大量资金(购买一个),并为一系列新的错误和挑战开辟了道路。在小型系统的情况下,我什至可能不会打扰。

于 2013-10-30T12:56:00.930 回答