使用 C++ 类处理常用参数

问题描述

我的团队使用 C++ 开发 HTTP 网络服务器。代码库随着时间的推移而老化,并且存在向每个函数传递 12 多个参数的普遍问题。

一个假的例子:我们需要建造一辆汽车,但为了做到这一点,我们有以下功能

MaybeBuildCar(engine_params,steering_params,interior_params,fuel_params,available_inventory,parts,&debug);

我们团队中有人提议我们创建一个包装器 CarBuilder 类,其构造函数接收参数和“有状态”对象,例如 available_inventory,然后为 BuildCar 提供一个单独的函数作为如下:

CarBuilder car_builder(engine_params,&debug);

auto car = car_builder.BuildCar(parts);

就我个人而言,我认为拥有一个始终被调用的具有单个公共函数的类没有多大价值。我们将始终需要这些参数,我们将始终需要零件,因此这只会增加更多的步骤来制造汽车。它甚至会增加混淆,因为现在 CarBuilder用户必须知道构造它并调用 BuildCar

诚然,这简化了 car_builder.cc 中的辅助函数,因为它们也需要传递这些参数,但对我来说,这滥用了类的用途:维护状态。

创建这个 CarBuilder 是对类的滥用,还是简单地清理函数签名是一种有效的用途?有人对如何解决这个问题有任何建议吗?

解决方法

最小化函数参数对于在性能敏感的环境中频繁使用的函数来说是一种福音:

如果给一个函数传递 6 个引用,也就是 6 个指针副本压入堆栈;
如果您传递单个 CarBuilder,则它是一个“reference-that-c​​ontains-6-other-references”。

这取决于你的情况。

,

你可以定义一个包含所有参数的类,并且在每个函数中只传递这个对象。

struct CarComponent
{
 public:
    EngineParams engine_params;
    SteeringParams steering_params;
    InteriorParams interior_params;
    FuelParams fuel_params;
    AvailableInventory available_inventory
};

MaybeBuildCar(car_component);
other_function(car_component);

优势:

  • 函数的签名与结构(CarComponent)的改变成员分离。易于更改
  • 使用特定对象重构每个函数中的所有参数。它可以防止重复,并且更容易阅读代码。