我正面临一个相当烦人的软件设计问题,这个问题一直困扰着我很长一段时间。问题是对象的初始化,并且使用了许多getter来实现它。我碰到了Allen Holub的一篇文章[1],关于为什么许多吸气剂和制定者通常表示设计不佳。我在下面列出了其他一些文章,也讨论了这个设计问题。
现在关于我的问题。我目前正在进行流体模拟。我有一个Simulation类,其中包含与模拟流体相关的函数和变量。起初,这个类只有一个名为timeStep()的公共函数,它执行模拟的时间步。现在,我想模拟几个众所周知的流程,人们可以将它们视为场景。这通常归结为正确初始化模拟。例如,我有Taylor-Green涡流。模拟不需要知道它是模拟特定的流程,它只需要执行模拟算法,所以我创建了一个单独的类TaylorGreenVortex。 TaylorGreenVortex类必须以与Taylor-Green涡流相对应的方式初始化Simulation。现在遇到麻烦:泰勒 - 格林涡流的初始化方程需要许多变量,这些变量也是模拟所需的,因此存在于该类中。因此,结果是我在Simulation类中添加了许多getter来获取这些变量。然而,这也是不希望的,因为所有这些吸气剂使Simulation类非常暴露,并且还在Simulation和TaylorGreenVortex之间产生高耦合。此外,初始化器(TaylorGreenVortex)首先构造一个Simulation对象也很烦人,因此它可以获取相关变量,然后重置Simulation对象的其他变量,以便模拟Taylor-Green涡流。 / p>
我已经考虑了几种解决方案,但所有这些解决方案并没有真正解决问题,只是将问题转移到另一个类别或使设计更糟糕。例如,如果我遵循'信息专家'模式,那么我应该删除TaylorGreenVortex类并将其所有功能移到Simulation类。然而,当模拟必须支持许多不同的流时,这会使Simulation类变得笨重。我还可以介绍一些具有TaylorGreenVortex和Simulation所需变量的Data类,但是我必须在这个Data类中添加很多getter,以便Simulation和TaylorGreenVortex从Data获取变量。您对清洁解决方案有何建议?如果您知道与问题相关的特定设计模式,请您具体解释一下如何在上述情况下应用它?提前谢谢。
答案 0 :(得分:2)
为了给出更好的建议我想我应该看到代码,但从描述中看起来你需要一个builder。但是你描述的TaylorGreenVortex
类似乎正在做构建器工作,所以也许它不是你想要的东西,这让我感到困惑。恕我直言有一个负责模拟的类和不同的构建器类,知道如何配置该模拟以表示不同的场景是一个很好的设计。我将从Simulation
类中的构造函数开始,该构造函数接受模拟所需的所有参数,然后让每个特定构建器根据特定的模拟需求传递构造函数参数。如果参数太多,那么您可能会认为有些东西没有建模,Simulation
类有多个责任(参见SRP)。在这种情况下,你可能想要重构Simulation
类,但是再一次,如果不看代码就很难说:(。你能发贴一些片段吗?
HTH
答案 1 :(得分:0)
我不太了解主题或您的设计,因此我无法完全评论您尝试实现的内容(请更多代码段),但声音就像你试图在一个位置保持状态(Simulation
)以及在另一个位置如何处理该状态(TaylorGreenVortexFlow
),并且在将它们解耦时遇到问题两个需要进行互动。
您是否完全放弃了从公共Simulation
对象继承的想法?覆盖timeStep()
函数以反映Taylor-Green涡流过程中发生的情况?如果由于缺少正确的引用传递而使用Java,这可能是您唯一明智的选择。