C++ 我应该在公共接口的结构中分组相关参数吗?
我计划导出一个API,它可以将报告保存到JPEG图像中,如下所示C++ 我应该在公共接口的结构中分组相关参数吗?,c++,api,dll,C++,Api,Dll,我计划导出一个API,它可以将报告保存到JPEG图像中,如下所示 DECLARE_INTERFACE_(IImageSaving, IUnknown) { ... HRESULT SaveReport( const wchar_t* imageFilepath, unsigned int imageFormat, float imageQuality, bool imageAlphaSupport,
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,
);
...
}
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
);
...
}
我担心这个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,
);
...
}
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
);
...
}
当函数中需要太多参数时,我更喜欢将相关参数分组到一个结构中。更清楚的是,这些参数是什么。但我不知道边界区域是否会出现问题(维护、可用性等)。这里唯一的强制性信息是文件名,所以我要做的第一件事是将其作为单独的参数传递 我宁愿为所有其他参数和特定函数设置默认值来更改它们 如果您要使用两种结构,您将强制用户指定他/她可能不知道或不想指定的值,或者必须提供一个函数来将这些结构初始化为默认值(a la POSIX,这是一个很好的大约1990年的C接口,但现在是2015年) 您还可以有一个约定,即您可以传递NULL ptr来获取默认值,但这往往会产生一些丑陋的代码,其中会散布一些调用,如
do\u something(无论如何,NULL,NULL)代码>
无论如何,与单独传递参数相比,分组参数已经是一个很大的改进。我们不需要另一个Microsoft API:)。是。你是对的。将相关参数分组到一个结构中总是好的。我想,这种编码不会带来维护问题。。!!也许我可以在结构的构造函数参数中提示参数的默认值?可以,但这仍然会迫使所有用户初始化一个包含他们可能不关心的数据的结构。通常,大多数用户不会关心ReportData
结构,因此最好设计一个可以完全忽略这些信息的界面。