понедельник, 23 мая 2011 г.

Понимание вещей в контексте вопроса: Dispatch-интерфейсы

Это перевод Understanding what things mean in context: Dispatch interfaces. Автор: Реймонд Чен.

Запомните, что вам нужно понимать, что означают вещи в контексте вопроса. К примеру, у интерфейса IActiveMovie3 есть метод get_MediaPlayer. Если вы посмотрите на этот метод в сферическом вакууме (без принятия во внимание контекста), то вы будете ожидать, что метод вернёт вам интерфейс IMediaPlayer, но в заголовочнике вы увидите, что вместо этого метод возвращает интерфейс IDispatch. Если вы посмотрите на общую картину, то вы увидите, почему это имеет смысл.

IActiveMovie3 - это Dispatch интерфейс. Как вы знаете, целевой аудиторией для интерфейсов IDispatch являются скриптовые языки, вроде Visual Basic и JScript. Классический Visual Basic является языком с динамической типизацией, что означает, что практически все типы данных являются просто "объектами", а их точный тип не известен до момента выполнения скрипта. Статически-типизированный язык (вроде Delphi - прим.пер.) пожалуется вам ещё на этапе компиляции, если вы вызовете несуществующий метод у объекта или передадите параметр не того типа в метод. А динамически-типизированный язык, с другой стороны, не проверяет всё это, пока строка кода не будет выполнена - вот только в этот момент будет произведена проверка, существует ли метод и правильно ли вы указали параметры.

Когда вы работаете с интерфейсами и языками с динамической типизацией, то естественной "валютой" становится IDispatch. Все объекты принимают форму IDispatch. Объекты, которые порождают другие объекты, будут возвращать интерфейсы IDispatch, потому что именно их ожидает увидеть скриптовый движок.

Вот почему метод get_MediaPlayer возвращает IDispatch. Потому что это то, что ожидает скриптовый движок. И то, что, если вы знакомы с контекстом вопроса, ожидаете вы.

Сигнальный знак этого контекста происходит от названия метода "get_MediaPlayer". Это название не соответствует соглашению наименования COM, а, скорее, имя построено так для его binding-а в C/C++ на свойство "get". C/C++ binding - это "ассемблерный язык" автоматизации OLE: вы работаете с гайками и болтами OLE Automation, и если вы хотите играть на этом уровне, то вы должны знать, как использовать отвертку.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.

Примечание. Отправлять комментарии могут только участники этого блога.