Инструменты пользователя

Инструменты сайта


examination:oop:question9

9. Модель вычислений: управление объектами с помощью передачи сообщений. Программа как совокупность взаимодействующих объектов.

В процессе работы программы у нас создается большое количество самых разнообразных объектов, однако нам необходимо тем или иным образом влиять на состояния этих объектов. В самых первых языках объектно-ориентированного программирования, таких как Smalltalk объекты взаимодействовали друг с другом с помощью посыла сообщений (Да и сейчас язык Objective-C использует именно эту модель). Это было связано с высокой степень динамизма этих языков, где все в языке являлось объектами, и все поддавалось изменению. Внутри самих конструкций языка это было связано с тем, что при посыле сообщения указатель на объект по соответствующей таблице передавался на обработку в обычную C функцию.

Чтобы лучше понять, как работает механизм обмена сообщениями, можно представить каждый объект как веб-сервер, отвечающий на запросы. При этом, на запросы можно просто выдавать заранее предопределённый ответ, аналог этому — выдача веб-страницы, расположенной по определённому пути; можно перенаправить запрос-сообщение другому объекту, аналог — прокси-сервер. Если для реакции на сообщение нет предопределённого метода, то вызывается метод #doesNotUnderstand:, так же, как веб-сервер открывает страницу с сообщением об ошибке, если задан несуществующий путь к веб-странице.

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

Таким образом программа в целом представляет собой большую совокупность объектов, которые взаимодействуют друг с другом посредством вызова соответствующих методов, изменяя и преобразуя сами объекты, тем самым изменяя состояние программы в целом.

examination/oop/question9.txt · Последние изменения: 2014/01/15 12:22 (внешнее изменение)