OOP 设计 - 将类成员变量作为类中的方法参数传递

OOP Design - Passing class member variables as method arguments within class

本文关键字:参数传递 方法 变量 设计 成员 OOP      更新时间:2023-10-16

这里有简单的示例代码,它不是最好的:

使用成员而不在参数中传递它:

class Car
{
public:
  void doSomething()
  {
    // doing something
    onEngineFailure();
  }
private:
  void onEngineFailure()
  {
    // Operate on m_Engine
  }
private:
  Engine m_Engine;
};

将成员作为参数传递:

class Car
{
public:
    void doSomething()
    {
        // doing something
        onEngineFailure(m_Engine);
    }
private:
  void onEngineFailure(const Engine& engine)
  {
    // Operate on engine
  }
private:
  Engine m_Engine;
};

在第一个示例中,方法 onEngineFailure 直接对类成员变量 m_Engine 进行操作。将其作为函数参数传递是没有意义的,因为汽车只能有一个引擎,而onEngineFailure运行的引擎将始终m_Engine

在第二个示例中,方法 onEngineFailure 在通过参数传递的引擎上运行。无论如何,这将永远m_Engine

那么,哪一个在设计上更正确呢?如果方法已经可以访问成员变量并且它总是只对它进行操作,那么为什么要将其作为参数传递。但是,全局变量也可以这样说,但应尽可能少地使用全局变量。

那么,哪一个在设计上更正确呢?如果方法已具有访问权限 到成员变量,它将始终只对它进行操作,那么为什么 将其作为参数传递。

完全。1

然而,对于全局变量也可以这样说,

除了绑定到特定对象实例的变量与其他实例分开,它们的一致性在对象级别进行管理。借助封装,您可以将它们隐藏起来并确保正确使用它们。

以此类推,所有变量都驻留在 RAM 中,但它们是否因此而成为全局变量?不,因为它们之间的逻辑区别很重要。


1在这个例子中,它可能没有多大意义。但是,如果函数的功能足够通用,可供其他类使用,则将其设置为自由函数或静态公共函数是有意义的。使函数静态的能力有时也很重要,因为其他原因,在这些情况下,显式(有时直接this)参数使它成为可能/更容易。

第一个代码片段是优雅而干净的方式。由于成员函数可以访问数据成员,因此不需要将数据成员作为参数传递。

如果要根据外部输入更改数据m_Engine成员的状态,则需要(引擎)类型的参数。 它将按以下方式完成。

void doSomething(Engine engine)
{
    // doing something
    onEngineFailure(engine);
}
void onEngineFailure(const Engine& engine)
{
  // copy it here say m_Engine.model=engine.model;
}