我有一个COM接口,需要为它添加一个访问器方法。返回的值实际上可以是以下四种类型之一:VARIANT_BOOL,long,BSTR或IDispatch派生接口。
因此我有一个选择:要么我返回VARIANT,要么我有4种不同的访问方法返回不同的类型。
interface IValue1 {
HRESULT GetType( TypeEnum* );
HRESULT GetValue( VARIANT* );
};
或
interface IValue2 {
HRESULT GetType( TypeEnum* );
HRESULT GetLongValue( long* );
HRESULT GetBstrValue( BSTR* );
HRESULT GetBoolValue( VARIANT_BOOL* );
HRESULT GetInterfaceValue( ICustomInterface** );
}
为了清楚起见,我还是会有IValueX :: GetType。如果我选择后一个选项,则只有4个访问者中的一个实际返回值,所有其他选项将因类型不匹配而指示错误。
我需要尽可能广泛的客户端使用此接口 - 包括VB6,Perl,.NET。
哪种替代方案更好 - 使用VARIANT或不同类型?
答案 0 :(得分:2)
我不喜欢因为GetType
这件事,而是第一件事。我认为它更灵活。如果将来更改代码可能要求它返回当前集中不可用的类型,则第二个版本将要求您创建新接口,并可能更改客户端代码以处理新接口。
答案 1 :(得分:1)
您的客户端程序员将不得不在两个备选方案中查询GetType方法,然后查询switch语句。因此,我没有看到多种类型特定方法的任何优势。
但是,VARIANT方法显然不会让客户编码器感到困惑。较少的方法意味着较少的认知负荷。所以我认为你应该选择另一个。
答案 2 :(得分:1)
我喜欢第二个。或两者兼而有之,在极少数情况下,消费者真的不在乎他们给予的东西(有点像SqlDataReader.GetValue
)。就像Frederick指出的那样,客户端编码器可能最终会编写一个精选案例语句,因此您也可以编写“正确”的数据类型。 真的取决于预期的使用模式,但我倾向于使用适当的数据类型而非变体。