我一直在使用 C++ 做一个小项目(尽管这个问题可能被认为与语言无关)并且我正在尝试编写我的程序,以便它尽可能高效和封装。我是一名自学成才且缺乏经验的程序员,但在使用接口和 OOP 实践时,我正在尝试教自己养成良好的习惯。在访问充当另一个类的子系统的对象的方法时,我主要对典型的“最佳”实践感兴趣。
首先,让我解释一下我的意思:
一个实例ClassGame
想要ClassRenderer
使用ClassEngine
. ClassGame
只能访问 的接口ClassEngine
,并且ClassRenderer
应该是 ClassEngine 的子系统(在抽象层之后)。
我的问题是基于 ClassGame 对象可以间接利用 ClassRenderer 的功能,同时仍然保持快速并在抽象层后面的方式。从我在课程和其他人的代码示例中看到的内容来看,似乎有两种基本方法:
我通过一系列关于 OOP 设计的在线讲座学到的第一种方法是让一个类在内部将任务委托给它的私有成员对象。[在这个例子中,ClassGame 会调用一个属于 ClassEngine 的方法,而 ClassEngine 会通过调用其中一个方法“秘密地”将该请求传递给它的 ClassRenderer 子系统。] 一种函数调用的“菊花链”。这对我来说很有意义,但似乎它可能比一些替代选项慢。
我在其他人的代码中看到的另一种方法是使用访问器方法,该方法返回指向特定子系统位置的引用或指针。[因此,ClassGame 将调用 ClassEngine 中的一个简单方法,该方法将返回一个指向构成其 ClassRenderer 子系统的对象的引用/指针]。这条路线对我来说似乎很方便,但它似乎也消除了让私有成员充当更大类的子组件的意义。当然,这也意味着编写更少的“无意识”函数来简单地传递特定任务,因为您可以简单地为每个独立的子系统编写一个 getter 函数。
考虑到面向对象设计的各个重要方面(抽象、封装、模块化、可用性、可扩展性等),同时还要考虑速度和性能,将任务委托给子组件是使用第一种方法还是第二种方法更好?