Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 3_техн / Лекції / Лекции 3.doc
Скачиваний:
24
Добавлен:
30.05.2020
Размер:
114.18 Кб
Скачать

Неконтролируемый доступ к данным

В процедурной программе, написанной на языке процедурного программирование (например, Си), существует два типа данных: глобальные и локальные.

Локальные данные находятся внутри функции и предназначены для использования исключительно этой функцией. Локальные данные функции недоступны никому, кроме самой функции, и не могут быть изменены другими функциями.

Если существует необходимость совместного использования одних и тех же данных несколькими функциями, то данные должны быть объявлены как глобальные.

Функция А

Функция В

Рис. 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

Пример понимания класса:

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