【问题标题】:One accessor method returing a VARIANT or several returning distinct types?一个访问器方法返回一个 VARIANT 还是几个返回不同类型?
【发布时间】:2009-06-29 17:33:00
【问题描述】:

我有一个 COM 接口,需要向它添加一个访问器方法。返回值实际上可以是 4 种类型之一: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 还是使用不同的类型?

【问题讨论】:

    标签: com interop


    【解决方案1】:

    因为GetType 的事情,我不太喜欢这两者,但还是选择第一个吧。我认为它更灵活。如果将来对代码的更改可能要求它返回当前集合中不可用的类型,则第二个版本将要求您创建一个新接口,并可能对客户端代码进行更改以处理新接口。

    【讨论】:

      【解决方案2】:

      您的客户端程序员将不得不在两个备选方案中查询 GetType 方法,然后是 switch 语句。因此,我并没有真正看到多种特定类型的方法有什么优势。

      但是,VARIANT 方法显然不会让客户编码人员感到困惑。更少的方法意味着更少的认知负担。所以我认为你应该选择它而不是另一个。

      【讨论】:

        【解决方案3】:

        我喜欢第二个。或者两者兼而有之,因为消费者很少在乎他们得到什么(有点像SqlDataReader.GetValue)。就像 Frederick 指出的那样,客户端编码器最终可能会编写一个 select case 语句,因此您不妨编写“正确的”数据类型。它真的取决于预期的使用模式是什么,但我倾向于使用适当的数据类型而不是变体。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-13
          • 1970-01-01
          • 2016-01-21
          • 2021-09-21
          • 2014-12-16
          • 2022-01-08
          • 2014-01-02
          • 1970-01-01
          相关资源
          最近更新 更多