1

我正在尝试使用 OOP 范例设计一些简单的实时模拟。我面临的问题是,由于我缺乏这种方法的经验,我不知道如何以自然的方式定义“正确”的对象及其关系。因此,我的问题更接近于软件架构,而不是更技术性的“如何实现这个或那个”。请注意,我正在做这个练习正是为了了解这个编程范式。

模拟试图解决空二维空间中粒子之间的相互作用(碰撞、吸引力等)。我想到的第一个对象是Particle。我已经用位置、速度、质量等实现了这个类。我创建了启动它们的方法,更新它们的位置(根据一些物理规则)甚至在画布中绘制它们。现在,我的问题出现在设置物理常数或绘图参数(画布大小、窗口数、每秒帧数等)时。现在我正在使用全局变量,例如重力或画布大小。这就是在非 OOP 方法中会做的事情,并且它仍然有效。但我一直在努力思考纯 OOP 如何处理粒子之间的共享参数。我可以预见各种选择。

  1. 我可以Canvas使用图形参数和Universe重力等常量创建类。然后,该类Particle将是一个扩展类。但我应该从哪个继承?尽管如此,类会得到扩展,但对象本身不会......
  2. 另一种选择是创建UniverseParticle作为独立的类。然后,我将通过创建一个独特的 Universe 对象来关联它们。每个粒子都包含一个指向此类 Universe 对象的指针,因此它们可以访问物理参数。我不确定这种指针方法是否甚至是 OOP ......

尽管我知道有很多方法可以做到这一点,但我想知道至少从学术角度来看,是否有一种更直观和“标准”的方法。我想它不包含在我提出的解决方案中,因此任何关于如何在这种简单模拟中设计结构的提示都将非常受欢迎。

4

1 回答 1

1

这是一个更实际的看法,主要来自我自己的经验,并且在基本设计考虑的层面上进行了严格的尝试。我也会对反馈感兴趣。

首先,从设计的角度来看,您的“画布”和“宇宙”似乎不同:我可以想象画布参数可能需要更改,而物理常数可能不会。

假设Canvas实体可能会改变,对我来说这将是一个单独的类。我不认为您希望您的Particle从中继承;在我的理解中,这些在逻辑上是完全独立的实体。至于在画布上放置粒子的便利性,我会在不同的层次上处理它,而不是通过继承。

粒子本身可以很好地使用类层次结构来实现,但这取决于您的项目以及您是否有不同种类(或行为)的粒子。

至于固定参数,我在C++项目中使用了带有显式名称空间的单独头文件。我看不出这在 Fortran 中不是一个可行的设计的理由,即使用带有常量的单独模块。从这个意义上说,它们是全球性的,但可以在使用中进行控制,这就是它们的本质。这种方法也有灵活性,以防你的常量集发展得比仅仅几个数字更复杂。此外,如果有需要,您可以稍后将其提升为一个类。

然后是这些与其他类的关系如何,以及如何编写它们的许多细节的问题。这将把问题带到别处,而且我对 Fortran 的全部 OO 功能(除了编写类)并不熟悉。

所以我想说:“ Canvas ”是一个类,“ Universe ”是一个模块,两者都与Particle分开。

于 2016-03-08T05:19:24.710 回答