在我最近观看的一个视频中,Kate Gregory建议如果一个函数有一个巨大的参数列表(例如 4 个以上的参数),那么应该将所有这些参数放入一个struct
(即使它们成为结构的成员)并在初始化struct
,将其传递给所述函数(显然这也需要重构函数本身)。
我有一个带有 5 个参数的实用函数,您可以在下面看到:
bool convert_str_to_valid_ints( const std::string_view inputStr, const std::span<int> result_ints,
const std::size_t expectedTokenCount, const std::vector<int>& specificTokensIndices,
const std::pair<int, int> acceptableRange =
std::pair<int, int>( std::numeric_limits<int>::min( ), std::numeric_limits<int>::max( ) ) );
正如所料,在任何调用站点调用此函数都会引入大量可怕的代码!
以上可以变成这样:
// In a header file
struct ParameterList
{
std::string_view inputStr;
std::span<int> result_ints;
std::size_t expectedTokenCount;
std::vector<int> specificTokensIndices;
std::pair<int, int> acceptableRange = std::pair<int, int>( std::numeric_limits<int>::min( ),
std::numeric_limits<int>::max( ) );
};
bool convert_str_to_valid_ints( const ParameterList& pl );
.
.
.
// in any source file that includes the said header file
const ParameterList pl { /* arguments go here */ };
bool isValid { convert_str_to_valid_ints( pl ) }; // much more readable, and possibly more performant?
我试图将它分解成更小的部分(例如,两个较小的函数,每个函数都有更少的参数),但我没有这样做,因为这个函数的作用在逻辑上不能分成两部分,而且没有多大意义。所以我想寻求帮助,看看Gregory的方法在这种特殊情况下是否是一个有效的选择。
现在如果有人说这是一个有效的选择,那么我应该把这个特殊用途的定义放在哪里struct
(我的猜测是在声明大函数的头文件中,以便其他源文件可以通过包含大函数的头文件来访问该结构和然后调用函数)?