2009-06-29 22 views
1

我有一個COM接口,需要添加一個訪問器方法。返回的值實際上可以是以下四種類型之一:VARIANT_BOOL,long,BSTR或IDispatch派生接口。一種訪問方法迴應VARIANT或幾個返回不同類型?

因此,我有一個選擇:要麼我返回一個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還是使用不同的類型?

回答

1

您的客戶端程序員將不得不在兩種替代方法中查詢GetType方法,然後再查詢switch語句。因此,我並沒有在多種特定類型的方法中看到任何優勢。

但是,VARIANT方法顯然不會讓客戶編碼器感到困惑。較少的方法意味着較小的認知負荷。所以我認爲你應該選擇另一個。

2

我真的不喜歡,因爲GetType的事情,但與第一。我認爲它更靈活。如果將來可能需要更改代碼才能返回當前集合中不可用的代碼,則第二個版本將要求您創建一個新的接口,並可能更改客戶機代碼以處理新的接口。

1

我喜歡第二個。或者兩者兼而有之,在消費者真的不在乎他們給予什麼的罕見時候(有點像SqlDataReader.GetValue)。就像Frederick指出的那樣,客戶端編碼器最終可能會編寫一個select case語句,因此您最好編寫「正確的」數據類型。它真的取決於預期的使用模式將是什麼,但我會傾向於正確的數據類型超過變種。