Объектно-ориентированное программирование

[Kuhn 1970]. Кун использовал этот термин во втором значении, чтобы описывать набор теорий, стандартов и методов, которые совместно представляют собой способ организации научного знания— иными словами, способ видения мира. Основное положение Куна состоит в том, что революции в науке происходят, когда старая парадигма пересматривается, отвергается и заменяется новой.

Именно в этом смысле — как модель или пример, а также как организующий подход— это слово использовал Роберт Флойд, лауреат премии Тьюринга1979 года, в лекции «Парадигмы программирования» [Floyd 1979]. Парадигмы в программировании— это способ концептуализации, который определяет, как проводить вычисления и как работа, выполняемая компьютером, должна быть структурирована и организована.

Хотя сердцевина объектно-ориентированного программирования— техника организации вычислений и данных является новой, ее зарождение можно отнести по крайней мере к временам Линнея(1707–1778), если не Платона. Парадоксально, но стиль решения задач, воплощенный вобъектно-ориентированной технике, нередко используется в повседневной жизни. Тем самым новички в информатике часто способны воспринять основные идеи объектно-ориентированного программирования сравнительно легко, в то время как люди, более осведомленные в информатике, зачастую становятся в тупик из-за своих представлений. К примеру, Алан Кей обнаружил, что легче обучать языку Smalltalk детей, чем профессиональных программистов[Kay 1977].

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

1.4. Способ видения мира

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

Предположим, я хочу послать цветы своей бабушке(которую зовут Элси) в ее день рождения. Она живет в городе, расположенном за много миль от меня, так что вариант, когда я сам срываю цветы и кладу их к ее порогу, не подлежит обсуждению. Тем не менее послать ей цветы— это достаточно простая задача: я иду в ближайший цветочный магазин, хозяйку которого(какое совпадение) зовут Фло(florist — цветочница), называю ей тип и количество цветов, которые бы я хотел послать моей бабушке, и(за приемлемую цену) я могу быть уверен, что цветы будут доставлены в срок, по нужному адресу.

 

1.4.1 Агенты, обязанности, сообщения и методы

Рискуя быть обвиненным в тавтологии, все-таки хочу подчеркнуть, что механизм, который я использовал для решения этой проблемы, состоял в поиске подходящего агента(а именно, Фло) и передаче ей сообщения, содержащего мой запрос. Обязанностью Фло является удовлетворение моего запроса. Имеется некоторый метод — то есть алгоритм, или последовательность операций, который используется Фло для выполнения запроса. Мне не надо знать, какой конкретный метод она использует для выполнения моего запроса, и в действительности зачастую я и не хочу это знать. Все дальнейшее обычно скрыто от моего взгляда.

Однако если бы я исследовал этот вопрос, я, возможно, обнаружил бы, что Фло пошлет свое сообщение хозяину цветочного магазина в городе, где живет моя бабушка. Хозяин

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

самым мой запрос в конечном счете будет удовлетворен через последовательность запросов, пересылаемых от одного агента к другому.

Итак, первым принципом объектно-ориентированного подхода к решению задач является способ задания действий.

Действие в  объектно-ориентированном программировании инициируется посредством передачи сообщений агенту(объекту), ответственному за действие. Сообщение содержит

запрос на осуществление действия и сопровождается дополнительной информацией (аргументами), необходимой для его выполнения. Получатель(receiver) — это агент, которому посылается сообщение. Если он принимает сообщение, то на него автоматически возлагается ответственность за выполнение указанного действия. В качестве реакции на сообщение получатель запустит некоторый метод, чтобы удовлетворить принятый запрос.