在科学模拟中适当的 class 成员访问
Proper class member access in scientific simulation
我目前正在研究一个程序,一个科学模拟,具有以下结构(第一级 - 逻辑分组,第二级 - 实现 classes,第三级 - 实现子class es):
- 输入数据
Sample
Parameter
(抽象基础class,声明虚函数)
ParModel1
ParModel2
- ...
- 物理模型
Model
(抽象基础class,声明虚函数)
Model1
Model2
- ...
- 模拟
Simulation
Model
子classes(例如ModelX
)在virtual Calculation(int x)
函数中定义某些算法,代表要描述的物理模型X。此计算中使用的参数将由 Sample
对象和相应的 ParModelX
对象提供。
Simulation
class 通常知道如何处理 Model
并且最终会 执行 给定 x
的计算(通过调用 public Calculation(int x)
函数)...在 biiig for
循环中。
我们接近实际问题...在每次迭代期间,将执行ModelX
定义的计算,因此Sample
和ParModelX
对象的各种参数需要被访问。
由于Simulation
class只触发了Model
提供的public计算函数,所以只有Sample
和Parameter
这两个必须与 Model
.
沟通
我应该...
- 成员是否声明了
private
并提供了 get
功能? (我读到对 getters/setters 的严重依赖可能是设计缺陷的标志。在充足的 for
循环中太多的 get 函数调用是否会成为问题,或者分别是 "bad style"?)
- 成员是否已声明 'public' 但
const
(他们不需要更改!)以便 'Model' 无需函数调用即可访问它们? (我觉得风格不太好...)
- 让
Model
构造函数从给定的 Sample
和 Parameter
对象中提取参数并将它们存储在自己的成员中以便快速访问(这将使 Parameter
class多余!)
friend
Sample
和 Parameter
(等)与相应的 Model
s
- 其他选项...?
我关心速度(即使它在我的特定计算中可能不重要,但我想知道什么是好的编程风格!)和我的程序结构。例如,我不希望模型与 simulation/calculating 过程混合。输入数据和模型的分离对我来说似乎很好,因为一个模型可能有许多参数集...
所有这些都取决于很多情况,因此请谨慎考虑以下一般注意事项。
只要您不知道您正面临性能问题,我肯定会更喜欢结构良好的设计而不是性能优化——如果您曾经遇到过,您会感谢自己需要返回此代码,例如,如果您需要以某种方式扩展它。将数据结构与操作它们的对象分开听起来确实是一个有价值的想法。引入常量值,希望获得更好的性能,同时牺牲在计算中使用不同值集的能力,这听起来是个坏主意。就个人而言,我喜欢 getter 和 setter,因为它们提供了一个用于访问数据的接口,同时抽象了数据在内部的表示方式。我不希望它们对性能造成很大的影响,它们甚至可能被编译器获得“optimized away”。 friend
关键字是一个访问修饰符(除了一些特定于编译器的黑魔法)可能不会对性能产生很大影响——我只在单元测试的上下文中使用过它。
在考虑您的方案中的性能瓶颈时,我的直觉告诉我要注意诸如按值传递大数据结构和不必要的重新计算之类的事情,而不是重用中间结果。如果您真的对性能洞察感兴趣,请停止猜测,抓住其中之一 profiling tools 并开始衡量!
我目前正在研究一个程序,一个科学模拟,具有以下结构(第一级 - 逻辑分组,第二级 - 实现 classes,第三级 - 实现子class es):
- 输入数据
Sample
Parameter
(抽象基础class,声明虚函数)ParModel1
ParModel2
- ...
- 物理模型
Model
(抽象基础class,声明虚函数)Model1
Model2
- ...
- 模拟
Simulation
Model
子classes(例如ModelX
)在virtual Calculation(int x)
函数中定义某些算法,代表要描述的物理模型X。此计算中使用的参数将由 Sample
对象和相应的 ParModelX
对象提供。
Simulation
class 通常知道如何处理 Model
并且最终会 执行 给定 x
的计算(通过调用 public Calculation(int x)
函数)...在 biiig for
循环中。
我们接近实际问题...在每次迭代期间,将执行ModelX
定义的计算,因此Sample
和ParModelX
对象的各种参数需要被访问。
由于Simulation
class只触发了Model
提供的public计算函数,所以只有Sample
和Parameter
这两个必须与 Model
.
我应该...
- 成员是否声明了
private
并提供了get
功能? (我读到对 getters/setters 的严重依赖可能是设计缺陷的标志。在充足的for
循环中太多的 get 函数调用是否会成为问题,或者分别是 "bad style"?) - 成员是否已声明 'public' 但
const
(他们不需要更改!)以便 'Model' 无需函数调用即可访问它们? (我觉得风格不太好...) - 让
Model
构造函数从给定的Sample
和Parameter
对象中提取参数并将它们存储在自己的成员中以便快速访问(这将使Parameter
class多余!) friend
Sample
和Parameter
(等)与相应的Model
s- 其他选项...?
我关心速度(即使它在我的特定计算中可能不重要,但我想知道什么是好的编程风格!)和我的程序结构。例如,我不希望模型与 simulation/calculating 过程混合。输入数据和模型的分离对我来说似乎很好,因为一个模型可能有许多参数集...
所有这些都取决于很多情况,因此请谨慎考虑以下一般注意事项。
只要您不知道您正面临性能问题,我肯定会更喜欢结构良好的设计而不是性能优化——如果您曾经遇到过,您会感谢自己需要返回此代码,例如,如果您需要以某种方式扩展它。将数据结构与操作它们的对象分开听起来确实是一个有价值的想法。引入常量值,希望获得更好的性能,同时牺牲在计算中使用不同值集的能力,这听起来是个坏主意。就个人而言,我喜欢 getter 和 setter,因为它们提供了一个用于访问数据的接口,同时抽象了数据在内部的表示方式。我不希望它们对性能造成很大的影响,它们甚至可能被编译器获得“optimized away”。 friend
关键字是一个访问修饰符(除了一些特定于编译器的黑魔法)可能不会对性能产生很大影响——我只在单元测试的上下文中使用过它。
在考虑您的方案中的性能瓶颈时,我的直觉告诉我要注意诸如按值传递大数据结构和不必要的重新计算之类的事情,而不是重用中间结果。如果您真的对性能洞察感兴趣,请停止猜测,抓住其中之一 profiling tools 并开始衡量!