Com 一个访问器方法返回一个变量还是返回几个不同的类型?
我有一个COM接口,需要添加一个访问器方法。返回的值实际上可以是4种类型之一:VARIANT_BOOL、long、BSTR或IDispatch派生接口 因此,我有一个选择:要么返回一个变量,要么使用4种不同的访问方法返回不同的类型Com 一个访问器方法返回一个变量还是返回几个不同的类型?,com,interop,Com,Interop,我有一个COM接口,需要添加一个访问器方法。返回的值实际上可以是4种类型之一:VARIANT_BOOL、long、BSTR或IDispatch派生接口 因此,我有一个选择:要么返回一个变量,要么使用4种不同的访问方法返回不同的类型 interface IValue1 { HRESULT GetType( TypeEnum* ); HRESULT GetValue( VARIANT* ); }; 或 为了清楚起见,我还是要使用IValueX::GetType。如果我选择后一个选项
interface IValue1 {
HRESULT GetType( TypeEnum* );
HRESULT GetValue( VARIANT* );
};
或
为了清楚起见,我还是要使用IValueX::GetType。如果我选择后一个选项,则4个访问器中只有一个会实际返回值,其他所有访问器都会由于类型不匹配而指示错误
我需要这个接口可以从尽可能广泛的客户机上使用-包括VB6、Perl、.NET
哪种选择更好?使用VARIANT还是使用distinct类型?我不太喜欢这两种选择,因为
GetType
这件事,但还是使用第一种。我认为它更灵活。如果将来对代码进行更改,可能需要它返回当前集合中不可用的类型,则第二个版本将要求您创建一个新接口,以及可能对客户端代码进行的更改,以处理新接口。由于GetType
的原因,我不太喜欢这两个版本,但还是使用第一个版本。我认为它更灵活。如果将来对代码进行更改,可能需要它返回当前集合中不可用的类型,则第二个版本将要求您创建一个新接口,以及可能对客户端代码进行的更改,以处理新接口。您的客户端程序员必须在两个备选方案中查询GetType方法,然后是switch语句。因此,我并不认为多个特定于类型的方法有任何优势
然而,对于客户机编码人员来说,变体方法显然不那么容易混淆。更少的方法意味着更少的认知负荷。因此,我认为您应该选择它,而不是另一个。您的客户机程序员必须在两个备选方案中查询GetType方法,然后是switch语句。因此,我并不认为多个特定于类型的方法有任何优势
然而,对于客户机编码人员来说,变体方法显然不那么容易混淆。更少的方法意味着更少的认知负荷。所以我觉得你应该把它挑出来。我喜欢第二个。或者两者兼而有之,很少有时候消费者真的不在乎他们得到了什么(有点像
SqlDataReader.GetValue
)。正如Frederick指出的,客户机编码人员可能最终会编写一个select case语句,因此您也可以编写“适当”的数据类型。它实际上取决于预期的使用模式,但我倾向于使用正确的数据类型而不是变体。我喜欢第二种。或者两者兼而有之,很少有时候消费者真的不在乎他们得到了什么(有点像SqlDataReader.GetValue
)。正如Frederick指出的,客户机编码人员可能最终会编写一个select case语句,因此您也可以编写“适当”的数据类型。它实际上取决于预期的使用模式,但我倾向于使用正确的数据类型而不是变体
interface IValue2 {
HRESULT GetType( TypeEnum* );
HRESULT GetLongValue( long* );
HRESULT GetBstrValue( BSTR* );
HRESULT GetBoolValue( VARIANT_BOOL* );
HRESULT GetInterfaceValue( ICustomInterface** );
}