我应该在公共接口的结构中对相关参数进行分组吗?

时间:2015-02-26 06:39:08

标签: c++ api dll

我计划导出一个可以将报告保存为JPEG图像的API

DECLARE_INTERFACE_(IImageSaving, IUnknown) 
{
    ...
    HRESULT SaveReport(
        const wchar_t* imageFilepath,
        unsigned int imageFormat,
        float imageQuality,
        bool imageAlphaSupport,

        unsigned int reportDetailLevel,
        long long reportTime,
        const wchar_t* reportAuthor,
    );
    ...
}

我担心此API中的参数太多。我应该导出两个结构并将这些相关参数放在struct中吗?像这样

struct ImageDesc
{        
    const wchar_t* imageFilepath;
    unsigned int imageFormat;
    float imageQuality;
    bool imageAlphaSupport;
};

struct ReportDesc
{        
    unsigned int reportDetailLevel;
    long long reportTime;
    const wchar_t* reportAuthor;
};

DECLARE_INTERFACE_(IImageSaving, IUnknown) 
{
    ...
    HRESULT SaveReport(
        const ImageDesc& imageDesc,
        const ReportDesc& reportDesc
    );
    ...
}

当函数需要太多参数时,我更喜欢将组相关参数放入一个结构中。更清楚地说明这些参数是什么。但我不知道边界地区是否存在问题(维护,可用性等)。

1 个答案:

答案 0 :(得分:1)

这里唯一的强制信息是文件名,所以我要做的第一件事就是把它作为一个单独的参数传递。

我宁愿为所有其他参数和特定函数设置默认值来更改它们。

如果您要使用两个结构,您将强制用户指定他/她可能没有任何线索或不需要指定的值,或者必须提供将这些结构初始化为默认值的函数( àLOSIX,这是一个大约1990年的C界面,但现在是2015年。)

你也可以有一个约定,你可以传递NULL ptrs来获取默认值,但这往往会产生丑陋的代码,如do_something (whatever, NULL, NULL);

之类的调用

无论如何,分组参数已经比单独传递它们有了很大的改进。我们不需要其他Microsoft API:)。