我应该将相关参数分组在 public 接口的结构中吗?

Should I group related parameters in a struct at public Interface?

我打算导出一个 API 可以将报告保存成这样的 JPEG 图片

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 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
    );
    ...
}

当函数中需要太多参数时,我更喜欢将相关参数组合到一个结构中。说清楚这些参数是什么就更清楚了。但是我不知道边界区域是否会出现问题(维护,可用性等)。

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

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

如果您要使用两个结构,您将强制用户指定值 he/she 可能不知道或没有兴趣指定,或者必须提供一个函数来初始化这些结构到默认值(à la POSIX,这是一个很好的大约 1990 年的 C 接口,但现在是 2015 年)。

你也可以有一个约定,说你可以传递 NULL 指针来获取默认值,但这往往会产生丑陋的代码,其中散布着像 do_something (whatever, NULL, NULL);

这样的调用

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