Объект – это достаточно общее и широкое понятие, которое может иметь разные трактовки. В широком смысле слова объект – это любая сущность, имеющая некоторый набор свойств и обладающая некоторым поведением.Отсюда следует, что объектом может быть практически все что угодно – материальные предметы (компьютер, автомобиль, человек), логические понятия (файл, документ, структура данных, окно в многооконной графической системе), математические понятия (например, геометрические объекты типа отрезок, окружность).
Под объектом в узком смысле можно понимать некоторое формализованное описание рассматриваемой сущности, т.е. модель. Для такого описания нужен некоторый язык, например – язык программирования. В этом случае объект становится элементом языка, и именно в таком контексте он и будет рассматриваться далее. Моделирование реальных объектов – это важнейший этап разработки объектных программ, во многом определяющий успех всего проекта. Необходимо понимать, что любая модель – это только часть исходного моделируемого объекта, отражающая те свойства и атрибуты объекта, которые наиболее важны с точки зрения решаемой задачи. Изменение постановки задачи может привести к существенному изменению модели. Особенно это характерно для сложных объектов. Вряд ли имеет смысл строить всеобъемлющую модель “на все случаи жизни”, поскольку такая модель будет очень громоздкой и практически непригодной для использования. Поэтому один из важнейших принципов построения моделей – это принцип абстрагирования, т.е. выделение наиболее существенных черт исходного объекта и отбрасывание второстепенных деталей.
Отсюда следует, что для одного и того же исходного объекта можно построить разные модели, каждая из которых будет отражать только некоторые наиболее важные черты объекта.
Например, для исходного объекта “человек” можно построить следующие информационные модели:
· человек как студент учебного заведения
· человек как сотрудник организации
· человек как пациент учреждений здравоохранения
· человек как подопечный органов внутренних дел и т.д.
Для описания объекта необходимо указать его свойства (параметры, характеристики), а для описания его поведения - создать набор подпрограмм, называемых методами объекта. Свойства объекта описываются как обычные поля данных. Во время работы программы в них хранятся соответствующие значения. Основными типами свойств являются:
· структурированные типы (массивы, записи или структуры);
· объектные свойства, представляющие объекты той же самой или другой природы.
Наличие объектных свойств является проявлением одного из способов взаимодействия объектов – так называемой агрегации,котораяболее подробно рассматривается в разделе 2.2.
Набор свойств объекта создается при описании объекта и в дальнейшем не изменяется. В качестве примеров свойств можно привести:
· объект-файл: имя, размер, дата создания, тип;
· объект-список: тип, число элементов, адрес первого элемента;
· объект-окно: положение на экране, размеры, тип, фон заполнения, тип рамки, оформление заголовка;
· объект-автомобиль: стоимость, тип, марка, мощность двигателя, цвет и т.д.;
· объект-студент: имя и фамилия, группа, специальность, оценки;
· объект-окружность: координаты центра, радиус, состояние видимости, цвет.
Поведение объекта описывается набором методов. Каждый метод – программный код, оформленный в виде некоторой функции. Объединение вместе обрабатываемых данных (свойств) и программного кода для их обработки (т.е. методов) называют принципом инкапсуляции. Этот принцип является одним из базовых в ООП. Если раньше данные и функции их обработки существовали независимо друг от друга, то в объектном подходе они образуют новую сущность – объект. Другими словами, объект сам отвечает за обработку своих данных. Это позволяет более четко распределять обязанности в объектной программе. Объект можно рассматривать как «черный ящик», выполняющий определенный набор функций. Реализация этих функций не должна интересовать пользователя-клиента, ему достаточно знать лишь набор предоставляемых объектом услуг.
Несмотря на многообразие объектов разной природы, можно выделить следующие группы методов, присущие практически всем объектам.
1. Конструкторы и деструкторы. Конструктор отвечает за создание нового объекта, т.е. выделение этому объекту памяти и начальную инициализацию этой памяти. Конструктор вызывается раньше всех остальных методов. Важность конструктора определяется тем, что он гарантированно создает объект с какими-то начальными значениями свойств. Это позволяет устранить целый класс неприятных логических ошибок, таких как использование неинициализированных переменных.
Для одного и того же объекта можно предусмотреть несколько различных конструкторов, которые по-разному инициализируют свойства создаваемого объекта. Начальные значения свойств часто передаются конструктору как входные параметры. Деструктор отвечает за уничтожение объекта, т.е. освобождение памяти, выделенной объекту. В отличие от конструкторов, механизм деструкторов реализован не во всех ОО-языках.
2. Методы, с помощью которых можно узнать текущее значение тех или иных свойств. Обычно для каждого свойства создается свой метод доступа к хранящемуся в нем значению. Принято присваивать таким методам имена, состоящие из двух частей - префикса Get и имени соответствующего свойства, например – GetColor, GetName, GetPrice. Такие Get-методы обычно оформляются как функции, возвращающие значение соответствующего свойства.
3. Методы, отвечающие за изменение значения одного или нескольких свойств. Их принято начинать с префикса Set, например, SetColor, SetName, SetPrice. Новые значения свойств передаются как параметры Set-методов. Несмотря на некоторое синтаксическое сходство, необходимо различать действия, выполняемые конструкторами и Set-методами: конструктор создает новый объект, а Set-метод лишь изменяет значение одного или нескольких свойств для уже созданного объекта. Довольно часто Set-методы перед изменением значений свойств выполняют дополнительную работу, например – проверяют новые значения свойств.
Наличие Set/Get-методов объясняется тем, что в соответствии с принципом инкапсуляции свойства объекта должны быть закрыты для постороннего вмешательства. Доступ к свойствам должен осуществляться только через вызовыGet/Set-методов. В этом случае детали внутренней реализации хранения данных объекта полностью закрыты от пользователей. Набор методов доступа образует открытый интерфейс объекта.
Кроме перечисленных методов, объект чаще всего имеет еще и некоторое количество специфических уникальных методов, определяющих функциональность объекта. Например:
В итоге объектная программа представляет собой набор взаимодействующих объектов, которые обращаются друг к другу за выполнением необходимых действий. При этом каждый объект проходит определенный жизненный цикл: он создается конструктором, используется другими объектами и уничтожается. Очевидно, что одновременно может существовать множество однотипных объектов (множество файлов, множество окон, множество студентов). Поэтому необходим инструмент формального описания таких однотипных объектов и в качестве такого инструмента выступает важнейшее понятие объектного подхода - класс.