科学模拟中适当的类成员访问

Proper class member access in scientific simulation

本文关键字:成员 访问 模拟      更新时间:2023-10-16

我目前正在开发一个程序,一个科学模拟,结构如下(第一级 - 逻辑分组,第二级 - 实现类,第三级 - 实现子类):

  • 输入数据
    • Sample
    • Parameter(抽象基类,声明虚函数)
      • ParModel1
      • ParModel2
  • 物理模型
    • Model(抽象基类,声明虚函数)
      • Model1
      • Model2
  • 模拟
    • Simulation

Model子类(例如 ModelX)定义virtual Calculation(int x)函数中的某些算法,代表要描述的物理模型X。此计算中使用的参数将由Sample对象和相应的ParModelX对象提供。Simulation类通常知道如何处理Model,并最终执行给定x的计算(通过调用公共Calculation(int x)函数)...在 biiig for 循环中。

我们接近实际问题...在每次迭代期间,将执行ModelX定义的计算,因此需要访问SampleParModelX对象的各种参数。

由于Simulation类只触发Model提供的公共计算函数,只有SampleParameter两者都必须与Model通信。

我应该...

  1. 成员是否宣布private并提供get职能?(我读到对getter/setter的严重依赖可能是设计有缺陷的标志。太多的获取函数调用可能是充足的for循环中的问题,还是分别是"糟糕的风格"?
  2. 成员是否声明为"公共"但const(他们不需要更改!),以便"模型"可以在没有函数调用的情况下访问它们?(在我看来,风格不太好...
  3. Model 构造函数从给定的SampleParameter对象中提取参数,并将它们存储在自己的成员中以便快速访问(这将使Parameter类变得多余!
  4. friend SampleParameter(等)与根据Model
  5. 其他选择...?

我关心速度(即使它在我的特定计算中可能并不重要,我想知道什么是好的编程风格!)和我的程序结构。例如,我不希望模型与模拟/计算过程混合。输入数据和模型的分离对我来说似乎很好,因为一个模型可能有很多参数集......

所有这些都取决于很多情况,因此请谨慎考虑以下一般注意事项。

只要你不知道你正面临性能问题,我肯定会更喜欢结构良好的设计而不是性能优化——如果你需要回到这段代码,比如,如果你需要以某种方式扩展它,你会感谢自己。将数据结构与对其进行操作的对象分开当然听起来是一个有价值的想法。引入常量值,希望获得更好的性能,同时牺牲在计算中使用不同值集的能力,听起来像是一个坏主意。就个人而言,我喜欢getters和setter,因为它们提供了一个用于访问数据的接口,同时抽象了数据在内部的表示方式。我不希望它们对性能造成重大影响,它们甚至可能被编译器"优化"。friend关键字是一个访问修饰符,(除了一些特定于编译器的黑魔法)可能不会对性能产生太大影响——我只在单元测试的上下文中使用过它。

在考虑方案中的性能瓶颈时,我的直觉告诉我,宁愿注意诸如按值传递大数据结构和不必要的重新计算之类的事情,而不是重用中间结果。如果您真的对性能见解感兴趣,请停止猜测,使用其中一个分析工具并开始测量!