我正面临一个相当烦人的软件设计问题,它已经困扰了我很长一段时间了。问题是对象的初始化,并且使用了很多 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 中获取变量。您对清洁解决方案有何建议?如果您知道与问题相关的特定设计模式,您能否具体解释一下如何在上述情况下应用它?提前致谢。