2009-06-29 1 views
1

Ich habe eine COM-Schnittstelle und muss eine Accessor-Methode hinzufügen. Der zurückgegebene Wert kann tatsächlich einen von vier Typen aufweisen: VARIANT_BOOL, long, BSTR oder eine von IDispatch abgeleitete Schnittstelle.Eine Accessor-Methode, die einen VARIANT oder mehrere wiederkehrende Typen zurückgibt?

Ich habe daher eine Wahl: Entweder ich eine VARIANT zurückgeben oder ich habe 4 verschiedene Zugriffsmethoden, die unterschiedliche Typen zurückgeben.

interface IValue1 { 
    HRESULT GetType(TypeEnum*); 
    HRESULT GetValue(VARIANT*); 
}; 

oder

interface IValue2 { 
    HRESULT GetType(TypeEnum*); 
    HRESULT GetLongValue(long*); 
    HRESULT GetBstrValue(BSTR*); 
    HRESULT GetBoolValue(VARIANT_BOOL*); 
    HRESULT GetInterfaceValue(ICustomInterface**); 
} 

Ich werde die IValueX :: GetType sowieso haben - für Klarheit. Wenn ich die letztere Option wähle, gibt nur einer von 4 Accessoren tatsächlich einen Wert zurück, alle anderen zeigen einen Fehler an, weil der Typ nicht übereinstimmt.

Ich brauche diese Schnittstelle, die von so vielen Kunden wie möglich konsumierbar ist - VB6, Perl, .NET enthalten.

Welche Alternative ist besser - mit VARIANT oder mit verschiedenen Typen?

Antwort

1

Ihr Client-Programmierer muss die GetType-Methode in beiden Alternativen abfragen, gefolgt von einer switch-Anweisung. Daher sehe ich keinen Vorteil in vielen typspezifischen Methoden.

Allerdings wäre der VARIANT-Ansatz für den Client-Coder deutlich weniger verwirrend. Weniger Methoden bedeutet geringere kognitive Belastung. Also ich denke du solltest es über den anderen aussuchen.

2

Ich mag auch nicht wirklich wegen der GetType Sache, aber gehen Sie mit dem ersten. Ich denke, es ist flexibler. Bei zukünftigen Änderungen des Codes, die möglicherweise eine Rückgabe eines Typs erfordern, der im aktuellen Satz nicht verfügbar ist, müssen Sie in der zweiten Version eine neue Schnittstelle erstellen und mögliche Änderungen am Clientcode für die neue Schnittstelle vornehmen.

1

Ich mag die zweite. Oder beides, für die seltenen Zeiten, in denen der Verbraucher sich nicht wirklich dafür interessiert, was sie bekommen (ähnlich wie SqlDataReader.GetValue). Wie Frederick hervorhebt, wird der Client-Coder wahrscheinlich eine Select-Case-Anweisung schreiben, so dass Sie auch die "richtigen" Datentypen codieren können. Es wirklich hängt davon ab, was die erwarteten Nutzungsmuster sein sollen, aber ich würde in Richtung der richtigen Datentypen über Varianten neigen.