科学模拟中适当的类成员访问
Proper class member access in scientific simulation
我目前正在开发一个程序,一个科学模拟,结构如下(第一级 - 逻辑分组,第二级 - 实现类,第三级 - 实现子类):
-
输入数据
-
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
定义的计算,因此需要访问Sample
和ParModelX
对象的各种参数。
由于Simulation
类只触发Model
提供的公共计算函数,只有Sample
和Parameter
两者都必须与Model
通信。
我应该...
- 成员是否宣布
private
并提供get
职能?(我读到对getter/setter的严重依赖可能是设计有缺陷的标志。太多的获取函数调用可能是充足的for
循环中的问题,还是分别是"糟糕的风格"? - 成员是否声明为"公共"但
const
(他们不需要更改!),以便"模型"可以在没有函数调用的情况下访问它们?(在我看来,风格不太好... - 让
Model
构造函数从给定的Sample
和Parameter
对象中提取参数,并将它们存储在自己的成员中以便快速访问(这将使Parameter
类变得多余! -
friend
Sample
和Parameter
(等)与根据Model
- 其他选择...?
我关心速度(即使它在我的特定计算中可能并不重要,我想知道什么是好的编程风格!)和我的程序结构。例如,我不希望模型与模拟/计算过程混合。输入数据和模型的分离对我来说似乎很好,因为一个模型可能有很多参数集......
所有这些都取决于很多情况,因此请谨慎考虑以下一般注意事项。
只要你不知道你正面临性能问题,我肯定会更喜欢结构良好的设计而不是性能优化——如果你需要回到这段代码,比如,如果你需要以某种方式扩展它,你会感谢自己。将数据结构与对其进行操作的对象分开当然听起来是一个有价值的想法。引入常量值,希望获得更好的性能,同时牺牲在计算中使用不同值集的能力,听起来像是一个坏主意。就个人而言,我喜欢getters和setter,因为它们提供了一个用于访问数据的接口,同时抽象了数据在内部的表示方式。我不希望它们对性能造成重大影响,它们甚至可能被编译器"优化"。friend
关键字是一个访问修饰符,(除了一些特定于编译器的黑魔法)可能不会对性能产生太大影响——我只在单元测试的上下文中使用过它。
在考虑方案中的性能瓶颈时,我的直觉告诉我,宁愿注意诸如按值传递大数据结构和不必要的重新计算之类的事情,而不是重用中间结果。如果您真的对性能见解感兴趣,请停止猜测,使用其中一个分析工具并开始测量!
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间