Один метод доступа, возвращающий VARIANT, или несколько возвращающих разные типы?

У меня есть COM-интерфейс, и мне нужно добавить к нему метод доступа. На самом деле возвращаемое значение может быть одного из 4 типов: VARIANT_BOOL, long, BSTR или интерфейс, производный от IDispatch.

Поэтому у меня есть выбор: либо я возвращаю VARIANT, либо у меня есть 4 разных метода доступа, которые возвращают разные типы.

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

or

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 или с отдельными типами?


person sharptooth    schedule 29.06.2009    source источник


Ответы (3)


Ваш клиентский программист должен будет запросить метод GetType в обоих вариантах, за которым следует оператор switch. Поэтому я не вижу никакого преимущества в нескольких методах для конкретных типов.

Однако подход VARIANT явно менее запутан для клиентского кодера. Меньшее количество методов означает меньшую когнитивную нагрузку. Так что я думаю, что вы должны выбрать его по сравнению с другим.

person Frederick The Fool    schedule 29.06.2009

Мне не очень нравится ни то, ни другое из-за GetType, но остановитесь на первом. Я думаю, что это более гибко. В случае будущих изменений в коде, которые могут потребовать, чтобы он возвращал тип, недоступный в текущем наборе, вторая версия потребует от вас создания нового интерфейса и возможных изменений в клиентском коде для обработки нового интерфейса.

person 1800 INFORMATION    schedule 29.06.2009

Мне нравится второй. Или и то, и другое, для тех редких случаев, когда потребителю действительно все равно, что ему дают (вроде как SqlDataReader.GetValue). Как указывает Фредерик, клиентский кодер, вероятно, закончит тем, что напишет оператор select case, поэтому вы также можете запрограммировать «правильные» типы данных. Это на самом деле зависит от того, какими должны быть ожидаемые шаблоны использования, но я бы склонялся к правильным типам данных, а не к вариантам.

person Dan F    schedule 29.06.2009