2009-06-29 7 views
1

私はCOMインターフェイスを持っており、アクセサメソッドを追加する必要があります。返される値は、実際にはVARIANT_BOOL、long、BSTR、またはIDispatch派生インターフェイスの4種類のいずれかになります。VARIANTまたはいくつかの戻ってくる別個の型を取り戻す1つのアクセサメソッド?

したがって、私は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つのアクセサのうちの1つだけが実際に値を返します。他のすべてのアクセサは、タイプの不一致のためエラーを示します。

このインターフェイスは、VB6、Perl、.NETなど、可能な限り幅広いクライアントから消耗する必要があります。

VARIANTまたは異なるタイプのどちらを使用する方が良いでしょうか?

答えて

1

お客様のクライアントプログラマは、両方の選択肢とそれに続くswitch文でGetTypeメソッドを照会する必要があります。したがって、タイプ固有の複数のメソッドでは、実際には何の利点もありません。

しかし、VARIANTアプローチは明らかにクライアントコーダーにあまり混乱を与えません。より少ない方法は、より少ない認知負荷を意味する。だから私はあなたが他の人の上にそれを選ぶべきだと思う。

2

私は実際にはGetTypeのもののためにどちらかが好きではありませんが、最初に行ってください。私はそれがより柔軟であると思う。現在のセットで使用できない型を返す必要があるコードを将来変更する場合、新しいインタフェースを作成し、新しいインタフェースを処理するクライアントコードを変更する必要があります。

1

私は第2のものが好きです。あるいは、消費者が本当に気にしない珍しい時代のために(ちょっとSqlDataReader.GetValueのように)。 Frederick氏が指摘しているように、クライアントコーダーはおそらくselect case文を書くことになるので、 "適切な"データ型をコード化することもできます。 実際にはは予想される使用パターンが何であるかに依存しますが、バリアントよりも適切なデータ型に傾いています。