我现在需要用一个新的(布尔)参数来扩展我的应用程序中经常使用的函数的API。我还预见到,随着更多的功能添加到程序中,相同的功能可能(还不确定)需要更多的功能,这些功能(如果需要)可以由布尔参数控制。只有新的函数调用才需要额外的功能,现有的函数调用不需要。
因此,为了在将来简化它的扩展,我计划在它的API中添加两个或三个额外的枚举参数,这样就可以添加新的功能,而不需要每次添加东西时都追逐和编辑所有的函数调用。因此,不要扩展到这一点:
function(currparams..., bool option1, bool option2, bool option3, bool option4);
它将扩展到以下内容:
typedef enum{
noopt,
opt1,
opt2,
opt3,
...
}APIoptions;
function(currparams..., APIoptions option1, APIoptions option2);
只要我现在添加的枚举参数足以满足将来的需要,这应该会使扩展API变得更容易。然而,我不记得在野外见过这种类型的编程,我想了解它的缺点和潜在的问题,以及为什么它不会被更频繁地使用。
提前谢谢。
发布于 2017-07-19 22:35:25
添加无意义的参数,你计划有一天实现(也许永远不会实现)是很容易出错的。假设你有一个被函数忽略的参数option4
,而你的程序运行得很好。在一段时间之后,您为该参数添加了含义,并且由于某种未知原因,您的程序变得不稳定。如果你在某些地方调用你的函数,给这个参数一些随机值,而它在过去被忽略了,因为option4
被忽略了,这种情况可能会发生。现在,您如何找出它在哪些调用中具有良好的值,以及在哪些调用中,它是您在实现它之前错误地赋予它的值?此外,如果不只有一个这样的论点,而是几个这样的论点,那该怎么办?
创建一个包含所有额外参数并将其传递给函数的结构似乎是一个更好的解决方案:
struct args_ex
{
bool foo;
bool bar;
bool spam;
// add more later
};
void your_function (... , const struct args_ex * extra)
{
...
if (extra)
// Do something with an extra arguments
}
稍后,您将向该结构中添加成员并修改函数。在调用此函数时只传递了一些参数的地方,将整个结构初始化为零以及所需的成员。
struct args_ex extra =
{
.foo = true,
.bar = true,
};
your_function (... , & extra);
发布于 2017-07-19 23:53:37
为了避免一次性传递所有参数,您可以创建一个对象。然后,您可以遵循此pdf中的建议,这样您就可以编写
MyObject myObject(someParams);
myObject.setOption1(foo);
myObject.setOption2(bar);
myObject.doFunction();
https://stackoverflow.com/questions/45192937
复制相似问题