Программа как система взаимодействующих объектов
Как было отмечено в самом начале главы, сущность объектно-ориентированного подхода заключается в первичности данных (объектов) по отношению к алгоритмам (методам) их обработки. Причем любая сущность, с которой программист сталкивается при написании программы, должна являться объектом (меню, файл, таблица, строка, вплоть до самой main ). Логическим завершением этого подхода является взгляд на программу как на систему взаимодействующих объектов. Но тогда теряется само представление о программе как о едином потоке управления. Объекты в процессе вызова и выполнения своих методов получают доступ к другим объектам, для которых они вызывают соответствующие методы и т.д.. В такой схеме очень важным становится вопрос - сколько объектов имеется в программе, как они получают информацию друг о друге, кто и когда их создает и уничтожает. В зависимости от принятых решений и выбранной стратегии взаимодействия объектов находятся такие свойства программы как гибкость, и универсальность.
Прежде всего, необходимо провести четкую грань между динамическими и обыкновенными именованными (в этом смысле - статическими) переменными и объектами. Обычные объекты, имеющие имя, (локальные и глобальные) привязаны к управляющей структуре программы (функциям), а поэтому так или иначе связаны с потоком управления - то есть последовательностью вызова функций. В отличие от них, динамические объекты могут создаваться программой когда угодно, их создание и уничтожение не связано с управляющей структурой программы. Поэтому именно динамические объекты позволяют более полно реализовать стратегию программирования - в виде системы взаимодействующих между собой объектов.
Но при использовании динамических объектов возникает другая проблема : как объекты " будут знать" о существовании друг друга, как реализовать в программе универсальные средства, которые будут поддерживать взаимодействие объектов вне зависимости от их количества. Ответ состоит из двух рекомендаций :
-в программе необходима интегрирующая структура данных, которая объединяет все ее объекты, независимо от их класса, времени и места их создания ;
- в программе необходимы универсальные средства взаимодействия объектов.
С первым все более-менее ясно. Достаточно иметь базовый класс - объекты программы, который обладает тем свойством, что при создании объекта (конструктор) включает его (или указатель на него) в статическую структуру данных (например, список). Со вторым сложнее. Прежде всего, необходимо разобраться, как объект может " знать" о существовании другого объекта. Варианты ответа могут быть следующие :
-объекту известно имя другого объекта - в этом случае связь устанавливается программистом при написании программы и никогда не меняется ;
-объект получает указатель на другой объект. В этом случае связи между объектами устанавливаются динамически ;
-объект получает сообщение от другого объекта через универсальную систему связи между объектами, построенную по принципу " каждый со всеми" . В этом случае объект может не иметь информации не только о расположении объектов (указатели), но даже и об их количестве и типах. В этом случае " правила игры" устанавливаются на основе реакции различных объектов на сообщения различных типов.