0

我正面临一个相当烦人的软件设计问题,它已经困扰了我很长一段时间了。问题是对象的初始化,并且使用了很多 getter 来实现这一点。我偶然发现了 Allen Holub [1] 的一篇文章,关于为什么很多 getter 和 setter 通常表明设计不佳。我在下面列出了其他几篇文章,它们也讨论了这个设计问题。

现在关于我的问题。我目前正在研究流体模拟。我有一个 Simulation 类,其中包含与模拟流体相关的函数和变量。起初,这个类只有一个名为 timeStep() 的公共函数,它执行模拟的时间步长。现在,我想模拟几个众所周知的流程,可以将它们视为场景。这通常归结为正确初始化模拟。例如,我有 Taylor-Green 涡流。模拟不需要知道它是在模拟一个特定的流,它只需要执行模拟算法,所以我创建了一个单独的类 TaylorGreenVortex。TaylorGreenVortex 类必须以与 Taylor-Green 涡流相对应的方式初始化 Simulation。现在麻烦来了:Taylor-Green 涡流的初始化方程需要许多变量,这些变量也是模拟所需的,因此存在于该类中。所以,结果是我在 Simulation 类中添加了很多 getter 来获取这些变量。然而,这也是不希望的,因为所有这些吸气剂使 Simulation 类非常暴露,并且还在 Simulation 和 TaylorGreenVortex 之间产生了高度耦合。此外,初始化器(TaylorGreenVortex)先构造一个 Simulation 对象,这样它就可以得到相关的变量,然后再重新设置 Simulation 对象的其他变量,这样它就会模拟一个 Taylor-Green 涡流,这也很烦人。结果是我在 Simulation 类中添加了很多 getter 来获取这些变量。然而,这也是不希望的,因为所有这些吸气剂使 Simulation 类非常暴露,并且还在 Simulation 和 TaylorGreenVortex 之间产生了高度耦合。此外,初始化器(TaylorGreenVortex)先构造一个 Simulation 对象,这样它就可以获取相关变量,然后再重新设置 Simulation 对象的其他变量,这样它就会模拟一个 Taylor-Green 涡流,这也很烦人。结果是我在 Simulation 类中添加了很多 getter 来获取这些变量。然而,这也是不希望的,因为所有这些吸气剂使 Simulation 类非常暴露,并且还在 Simulation 和 TaylorGreenVortex 之间产生了高度耦合。此外,初始化器(TaylorGreenVortex)先构造一个 Simulation 对象,这样它就可以获取相关变量,然后再重新设置 Simulation 对象的其他变量,这样它就会模拟一个 Taylor-Green 涡流,这也很烦人。

我考虑过几种解决方案,但所有这些解决方案都没有真正解决问题,而只是将问题转移到不同的类或使设计变得更糟。例如,如果我遵循“信息专家”模式,那么我应该删除 TaylorGreenVortex 类并将其所有功能移至 Simulation 类。然而,当模拟必须支持许多不同的流程时,这会使模拟类变得庞大。我还可以引入某种 Data 类,它具有 TaylorGreenVortex 和 Simulation 所需的变量,但是我必须在这个 Data 类中添加很多 getter,以便 Simulation 和 TaylorGreenVortex 从 Data 中获取变量。您对清洁解决方案有何建议?如果您知道与问题相关的特定设计模式,您能否具体解释一下如何在上述情况下应用它?提前致谢。

  1. http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html
  2. http://martinfowler.com/bliki/GetterEradicator.html
  3. http://pragprog.com/articles/tell-dont-ask
4

2 回答 2

2

为了提供更好的建议,我想我应该看到代码,但从描述中听起来你需要一个builder。但是TaylorGreenVortex,您描述的课程似乎在做建造者的工作,所以也许它不是您要找的,这让我有点困惑。恕我直言,拥有一个负责模拟的类和知道如何配置该模拟以表示不同场景的不同构建器类是一个很好的设计。我会首先在Simulation类中有一个构造函数,它接受模拟所需的所有参数,然后让每个特定的构建器根据特定的模拟需要传递构造函数参数。如果参数太多,那么您可能会认为有些东西您没有建模并且Simulation类有多个职责(参见SRP)。在这种情况下,您可能想要重构Simulation该类,但同样,如果不查看代码就很难判断:(。您能发布一些片段吗?

高温高压

于 2012-12-20T12:44:06.737 回答
0

我对主题或您的设计知之甚少,因此我无法完全评论您要实现的目标(请提供更多片段),但听起来您正试图将状态(Simulation)保持在一个位置以及如何处理TaylorGreenVortexFlow另一个状态( ),并且在两者需要交互时遇到问题将它们解耦。

Simulation您是否完全放弃了从公共对象继承的想法?重写timeStep()函数以反映泰勒-格林涡流期间发生的情况?如果由于缺少正确的传递引用而使用 Java,这可能是您唯一明智的选择。

于 2012-12-20T12:57:17.220 回答