代码之家  ›  专栏  ›  技术社区  ›  calofr

使用预定义(枚举)选项列表而不是单个参数进行api扩展的缺点

  •  1
  • calofr  · 技术社区  · 8 年前

    目前,我需要用一个新的(布尔)参数扩展应用程序中经常使用的函数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);
    

    提前谢谢。

    2 回复  |  直到 8 年前
        1
  •  1
  •   user5368518 user5368518    8 年前

    添加您计划有朝一日(或可能永远不会)实现的无意义的参数很容易出现错误。想象一下你有一场争论 option4 选项4

    创建包含所有额外参数的结构并将其传递给函数似乎是更好的解决方案:

    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);
    
        2
  •  1
  •   Paul Floyd    8 年前

    为了避免一次性传递所有参数,可以创建一个对象。然后你可以按照下面的建议 pdf ,这样你就可以写了

    MyObject myObject(someParams);
    myObject.setOption1(foo);
    myObject.setOption2(bar);
    
    myObject.doFunction();