
Неконтролируемый доступ к данным
В процедурной программе, написанной на языке процедурного программирование (например, Си), существует два типа данных: глобальные и локальные.
Локальные данные находятся внутри функции и предназначены для использования исключительно этой функцией. Локальные данные функции недоступны никому, кроме самой функции, и не могут быть изменены другими функциями.
Если существует необходимость совместного использования одних и тех же данных несколькими функциями, то данные должны быть объявлены как глобальные.
Функция
А
Функция
В
Рис. 1.1 Глобальные и локальные данные
Проблема процедурного метода заключается в том, что число возможных связей между глобальными переменными и функциями может быть огромным (рис.1.2)
Большое число связей между функциями и данными, в свою очередь, также порождает несколько проблем. Во-первых, усложняется структура программы. Во-вторых, в программу становится трудно вносить изменения. Изменение структуры глобальных данных может потребовать переписывания всех функций, работающих с этими данными. Например, если разработчик программы складского учета решит сделать код продукта не 5-значным, а 12-значным, то будет необходимо изменить соответствующий тип данных с short на long. Это означает, что во все функции, оперирующие кодом продукта, должны быть внесены изменения, позволяющие обрабатывать данные типа Long. Можно привести аналогичный бытовой пример, когда в супермаркете изменяется расположение отделов, и покупателям приходится соответствующим образом менять свой привычный путь от одного отдела к другому.
Когда изменения вносятся в глобальные данные больших программ, бывает непросто быстро определить, какие функции необходимо скорректировать. Даже в том случае, когда это удается сделать, из-за многочисленных связей между функциями и данными исправленные функции начинают некорректно работать с другими глобальными данными. Таким образом, любое изменение влечет за собой далеко идущие последствия.
Моделирование реального мира
Вторая, более важная, проблема процедурного подхода заключается в том, что отделение данных от функций оказывается малопригодным для отображения картины реального мира. В реальном мире нам приходится иметь дело с физическими объектами, такими, например, как люди или машины. Эти объекты нельзя отнести ни к данным, ни к функциям, поскольку реальные вещи представляют собой совокупность свойств и поведения.
Свойства
Примерами свойств (иногда называемых характеристиками) для людей могут являться цвет глаз или место работы; для машин — мощность двигателя и количество дверей. Таким образом, свойства объектов равносильны данным в программах: они имеют определенное значение, например голубой для цвета глаз или 4 для количества дверей автомобиля.
Поведение
Поведение — это некоторая реакция объекта в ответ на внешнее воздействие. Например, ваш босс в ответ на просьбу о повышении может дать ответ «да» или нет. Если вы нажмете на тормоз автомобиля, это повлечет за собой его остановку. Ответ и остановка являются примерами поведения. Поведение сходно с функцией: вы вызываете функцию, чтобы совершить какое-либо действие (например, вывести на экран учетную запись), и функция совершает это действие.
Таким образом, ни отдельно взятые данные, ни отдельно взятые функции не способны адекватно отобразить объекты реального мира.
Объектно-ориентированный подход
Основной идеей объектно-ориентированного подхода является объединение данных и действий, производимых над этими данными, в единое целое, которое называется объектом.
Функции объекта, которые называются в Си++ методами, как правило предназначены для доступа к данным объекта. Если необходимо считать какие-либо данные объекта, нужно вызвать соответствующий метод, который выполняет считывание и возвратит требуемое значение. Прямой доступ к данным невозможен. Данные сокрыты от внешнего воздействия, что защищает их от случайного изменения. В таком случае данные и методы инкапсулированы. Сокрытие и инкапсуляция являются ключевыми понятиями ООП.
Типичная программа на языке Си++ состоит из совокупности объектов, взаимодействующих между собой посредством вызова методов друг друга. Структура программы на Си++ выглядит следующим образом:
Объект
Объект Объект
Объектно-ориентированный подход
Пример:
Отдел продаж
Отдел кадров Финансовый отдел
Корпоративный подход
ОП: подход к организации программы
Объектно-ориентированное программирование никак не связано с процессом выполнения программы, а является лишь способом ее организации. Большая часть операторов C++ идентична операторам процедурных языков, в частности языка С. Внешне метод класса в C++ очень похож на обычную функцию языка С, и только по контексту программы можно определить, является ли функция частью процедурной С-программы или объектно-ориентированной программы на C++.
Характеристики объектно-ориентированных языков
Здесь мы рассмотрим несколько основных элементов, входящих в состав объектно-ориентированных языков, в частности в состав языка C++.
Объекты
Когда вы подходите к решению задачи с помощью объектно-ориентированного метода, то вместо проблемы разбиения задачи на функции вы сталкиваетесь с проблемой разбиения ее на объекты. Мышление в терминах объектов оказывается гораздо более простым и наглядным, чем в терминах функций, поскольку программные объекты схожи с объектами реального мира. Более подробно данный вопрос рассмотрен в главе 16 «Разработка объектно-ориентированного программного обеспечения».
Что должно представляться в программе в виде объектов? Окончательный ответ на этот вопрос может дать только ваше воображение, однако приведем несколько советов, которые могут оказаться полезными:
Физические объекты.
-
Автомобили при моделировании уличного движения.
-
Схемные элементы при моделировании цепи электрического тока.
-
Страны при создании экономической модели.
-
Самолеты при моделировании диспетчерской системы.
Элементы интерфейса.
-
Окна.
-
Меню.
-
Графические объекты (линии, прямоугольники, круги).
-
Мышь, клавиатура, дисковые устройства, принтеры.
Структуры данных.
-
Массивы.
-
Стеки
-
Связанные списки
-
Бинарные деревья.
Группы людей.
-
Сотрудники.
-
Студенты.
-
Покупатели.
-
Продавцы.
Хранилища данных.
-
Описи инвентаря.
-
Списки сотрудников.
-
Словари.
-
Географические координаты городов мира.
Пользовательские типы данных.
-
Время.
-
Величины углов.
-
Комплексные числа.
-
Точки на плоскости.
Участники компьютерных игр.
-
Автомобили в гонках.
-
Позиции в настольных играх (шашки, шахматы).
-
Животные в играх, связанных с живой природой.
-
Друзья и враги в приключенческих играх.
Соответствие между программными и реальными объектами является следствием объединения данных и функций. Получающиеся в результате такого объединения объекты в свое время произвели фурор, ведь ни одна программная модель, созданная на основе процедурного подхода, не отражала существующие вещи столь точно, как это удалось сделать с помощью объектов.
Классы
Когда мы говорим об объектах, мы говорим, что они являются экземплярами классов. Что это означает? Рассмотрим следующую аналогию. Практически все компьютерные языки имеют стандартные типы данных; например, в C++ есть целый тип int. Мы можем определять переменные таких типов в наших программах:
int day:
int count;
int divisor:
int answer:
Класс является своеобразной формой, какие данные и функции будут включены в объект класса. При объявлении класса не создаются никакие объекты этого класса, по аналогии с тем, что существование int еще не означает существование переменных этого типа.
Класс является описанием совокупности сходных между собой объектов.
Объекты
одного класса
Объект
1
Объект
2
Объект
3
Пример понимания класса:
Принц, Стинг, Мадонна относятся к классу рок-музыкантов, однако не существует конкретного человека с именем рок-музыкант. Люди со сходными чертами (свойствами-характеристиками), но уникальными именами являются объектами этого класса. Объект класса часто также называют экземпляром класса.