
gos_янв_2009 / 2.5. ООП
.doc
1. ООП - Раннее связывание и позднее связывание. Тип может связываться с программным объектом статически (тип объекта определен на этапе компиляции − раннее связывание) и динамически (тип объекта определяется только во время выполнения программы − позднее связывание). Позднее связывание (Late binding) - ситуация, при которой адрес вызываемого метода неизвестен до момента выполнения программы. Адресация разрешается путем использования таблиц виртуальных методов с адресами методов. Раннее связывание (Early binding) - ситуация, при которой адрес вызываемого метода известен в момент компиляции / компоновки. Реализация позднего связывания в языке программирования позволяет создавать переменные − указатели на объекты, принадлежащие различным классам (полиморфные объекты), что существенно расширяет возможности языка. Термины “ раннее связывание” и “позднее” относятся к этапу, на котором обращение к процедуре связывается с ее адресом. В случае раннего связывания адреса всех функций и процедур известны в тот момент, когда происходят компиляция и компоновка программы. Это позволяет приписать каждому обращению к процедуре соответствующий адрес. В большинстве традиционных языков, включая Си и Паскаль, используется только раннее связывание. В противоположность этому, в случае позднего связывания адрес процедуры не связывается с обращением к ней до этого момента, пока обращение не произойдет фактически, т.е. во время выполнения программы. Полиморфизм - исключительно мощный метод обобщения однотипных задач для многих разных объектов. Он повышает степень абстрагирования при создании программного обеспечения. Возможен же полиморфизм благодаря позднему связыванию.
|
3. ООП - Определение объектно-ориентированного подхода. Объектно-ориентированный подход основан на использовании моделей для языково-независимой разработки программной системы, на основе замены объектов реального мира их моделями. Основные идеи объектно-ориентированного подхода опираются на следующие положения: - Программа представляет собой модель некоторого реального процесса, части реального мира. - Модель реального мира или его части может быть описана как совокупность взаимодействующих между собой объектов. - Объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект. - Взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому. Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта. - Объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий, представляют собой класс однотипных объектов. Объектно-ориентированный подход помогает добиться: - уменьшения сложности программного обеспечения; - повышения надежности программного обеспечения; - обеспечения возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов; - обеспечения возможности повторного использования отдельных компонентов программного обеспечения. Применение объектно-ориентированного подхода позволяет разрабатывать хорошо структурированные, надежные в эксплуатации, достаточно просто модифицируемые программные системы. Объектно-ориентированный подход целесообразно использовать на всех этапах жизненного цикла прикладной программной системы, начиная с анализа требований к программной системе и ее предварительного проектирования, и кончая ее реализацией, тестированием и последующим сопровождением. |
||||
20. ООП - Объектная декомпозиция. Объектной декомпозицией называют процесс представления предметной области задачи в виде совокупности функциональных элементов (объектов), обменивающихся в процессе выполнения программы входными воздействиями (сообщениями). Каждый выделяемый объект предметной области отвечает за выполнение некоторых действий, зависящих от полученных сообщений и параметров самого объекта. Совокупность значений параметров объекта называют его состоянием, а совокупность реакций на получаемые сообщения — поведением. Параметры состояния и элементы поведения объектов определяются условием задачи. В процессе решения задачи объект, получив некоторое сообщение, выполняет заранее определенные действия, например, может изменить собственное состояние, выполнить некоторые вычисления, нарисовать окно или график и, в свою очередь, сформировать сообщения другим объектам. Таким образом, процессом решения задачи управляет последовательность сообщений. Передавая эти сообщения от объекта к объекту, программа выполняет необходимые действия. Таким образом, при выполнении объектной декомпозиции определяют и описывают множество объектов предметной области и множество сообщений, которое формирует и получает каждый объект. - Объектная декомпозиция дает возможность создавать модели меньшего размера путем использования общих механизмов, обеспечивающих необходимую экономию выразительных средств. Использование объектного подхода существенно повышает уровень унификации разработки и пригодность для повторного использования, что ведет к созданию среды разработки и переходу к сборочному созданию моделей. - Объектная декомпозиция позволяет избежать создания сложных моделей, так как она предполагает эволюционный путь развития модели на базе относительно небольших подсистем. - Объектная модель естественна, поскольку ориентированна на человеческое восприятие мира.
|
4. ООП - Конструктор и деструктор. Особенность ООП в том, что некоторые методы выполняются неявно. К ним относятся конструктор и деструктор. Конструктор – специальная процедура, инициализирующая экземпляр объекта, содержащий виртуальные методы, путем установления связи между экземпляром объекта и таблицей виртуальных методов. Конструкторы в языке С++ имеют имена, совпадающие с именем класса. Конструктор может быть определен пользователем, или компилятор сам сгенерирует конструктор по умолчанию. Конструктор может вызываться явно или неявно. Компилятор сам автоматически вызывает соответствующий конструктор там, где программист определяет новый объект класса. Конструктор не возвращает никакое значение, и при описании конструктора не используется ключевое слово void. Функцией, обратной конструктору, является деструктор. Деструктор – специальная процедура для освобождения памяти, занятой объектом. Эта функция обычно вызывается при удалении объекта. Например, если при создании объекта для него динамически выделялась память, то при удалении объекта ее нужно освободить. Локальные объекты удаляются тогда, когда они выходят из области видимости. Глобальные объекты удаляются при завершении программы. Конструктор используется для инициализации переменных класса и для выделения памяти под динамические массивы. Он выполняется автоматически при создании представителя класса. Конструктор имеет имя, совпадающее с именем класса. Тип возвращаемого результата для конструктора не указывается. Одновременно может быть определено несколько конструкторов, которые отличаются количеством и типом аргументов. Имеется как минимум три конструктора:
Если они не включены в описание класса, то компилятор создает их самостоятельно. Деструктор вызывается при уничтожении объекта. Он обычно используется для освобождения памяти. Деструктор имеет имя, совпадающее с именем класса, но впереди имени ставится знак ‘~’ (тильда), параметров не имеет. |
||||
5. ООП - Объектная модель программной системы. Объектная модель показывает статическую объектную структуру модельного мира, который должно представлять разрабатываемая ПС (программная система). Она включает определения используемых классов объектов и отношений между этими классами, а также определение используемых объектов этих классов и отношения между этими объектами. Обычно класс объектов в объектной модели представляется в виде тройки (Имя класса, Список атрибутов, Список операций). Каждый атрибут представляется некоторым именем и может принимать значения определенного типа. По существу, атрибут класса выражает некоторое простое свойство объектов этого класса. Представление некоторых простых свойств объектов атрибутами весьма удобно, особенно когда по значениям этих атрибутов осуществляется классификация объектов. Операции, указываемые в представлении класса, отражают другие свойства объектов этого класса (как простые, так и ассоциативные). Они показывают, что можно делать с объектами этого класса (или что могут делать сами эти объекты). В объектной модели отношения между объектами некоторых классов обобщаются в отношения между этими классами. При этом используются, как правило, только одноместные и двуместные отношения между объектами. Более сложные отношения приводят к неоправданному усложнению объектных моделей, а с другой стороны, такие отношения всегда могут быть сведены к двуместным за счет определения дополнительных классов. Одноместные отношения называют атрибутами, причем некоторые атрибуты объекта получаются из атрибутов класса присвоением им конкретных значений. Отношение между двумя (и более) объектами называют связями, а их обобщение (отношение между классами) обычно называют ассоциациями. Ассоциации определяют допустимые связи между объектами. |
5. ООП - Объектная модель программной системы. Продолжение Различают следующие виды ассоциаций:
Ассоциация «взаимодействие», по существу, означает, что объекты классов, находящихся в таком отношении, могут быть параметрами некоторых операций. Ассоциация «агрегирование» означает, что объект одного из классов, находящихся в таком отношении, включает (или может включать) в себя (как часть) объекты другого из этих классов. Ассоциация «абстрагирование» означает, что один из классов, находящихся в таком отношении, наследует свойства другого из этих классов и может обладать также и другими (дополнительными) свойствами. |
||||
|
7. ООП - Правила доступности членов класса в С++. При описании класса можно определять доступность членов класса для “чужих” функций. Вообще, в ООП считается хорошим тоном задавать все данные и служебные методы описываемого класса для доступа “извне”. Описывая класс, нужно оставлять доступ только к тем членам класса, которые необходимы для конкретной работы с объектами; всю сколько-нибудь сложную работу должны брать на себя методы данного класса. В С++ существует три служебных слова, определяющих доступ членов класса. public – после этого слова двоеточие означает, что все нижеследующие члены класса будут считаться общедоступными, пока не встретиться другое описание доступности. Другое слово protected – определяет, что члены класса доступны только дружественным функциям и классам, а также классам – наследникам данного класса. Слово private – ограничивает круг “посвященных “ только дружественными функциями и классами. Дружественные функции и классы - это функции и классы, упомянутые внутри описания класса с описателем friend. Это слово ставиться самым первым в описании такой функции или класса.
|
||||
8. ООП - Агрегация, связь правил объектной модели и правил объектно-ориентированного программирования. Отношение агрегации между классами имеет место, когда один класс содержит в качестве составной части объекты другого класса. Иными словами, это отношение «целое/часть», между двумя классами. На диаграмме такая связь обозначается линией со стрелкой в виде незакрашенного ромба, которая указывает на целое. В правилах объектной модели есть понятие ассоциация «агрегирование», где ассоциация – отношение между классами. Ассоциация «агрегирование» означает, что объект одного из классов, находящихся в таком отношении, включает (или может включать) в себя (как часть) объекты другого из этих классов. В качестве примера отношения агрегирования между классами объектов можно привести: отношение «программа состоит из одного или нескольких модулей» представлено на рис.
Для реализации нестрогой агрегации часть включается в целое по ссылке: на языке С++ это обычно указатель на соответствующий класс. Таким образом, если этот указатель равен нулю, то компонент отсутствует. В зависимости от решаемой задачи такой компонент может появляться и исчезать динамически в течение жизни объекта целое. Строгая агрегация имеет специальное название – композиция. Она означает, что компонент не может исчезнуть, пока объект целое существует. На диаграмме отношение композиции обозначается линией со стрелкой в виде незакрашенного ромба.
|
|
||||
|
11. ООП - Класс и структура. Структура позволяет иметь смешанные атрибуты различных типов данных. Структура создается при помощи ключевого слова struct, за которым следует имя_типа (имя структуры) и список элементов. Описание структуры заканчивается точкой с запятой, т.к. оно является оператором: struct имя_типа { тип_элемента1 имя_элемента1; тип_элемента2 имя_элемента2; тип_элемента3 имя_элемента3; … }; Для обращения к отдельным элементам структуры используется операция обращения к члену структуры – “точка”. Она разделяет имя структурной переменной и имя поля, например used_data.year=1970; В функцию информация о структуре может передаваться как по значению, так и по ссылке. В первом случае в функцию передается копия структуры, что может снизить эффективность программы. При передаче по ссылке копирование не выполняется, однако функция получает доступ к элементам структуры и может их изменять. Можно также использовать указатели на структуру. |
||||
11. ООП - Класс и структура. Продолжение 1 Ключевым понятием С++ является класс. Класс − это структурный тип данных, который включает описание полей данных, а также процедур и функций, работающих с этими полями данных. Описание класса С++ начинается с ключевого слова class. Оформление определения класса очень похоже на описание struct. class имя_класса { тип переменная1; тип переменная2; … функция-член1 функция-член2 … public: тип переменная3; тип переменная4; … функция-член3 функция-член4 … }; В самом простом виде класс определяется в С++ как структура, работа с элементами которой возможна только через элементы функции. По умолчанию члены класса являются частными (private). Они доступны только функциям-членам. После объявления public следуют данные и функции, доступные внешним для класса функциям. Внутри описания класса может быть указан только прототип метода. «Приватная» часть не обязательно должна следовать в начале определения класса. Для ее обозначения в произвольном месте определения класса можно использовать служебное слово private. |
11. ООП - Класс и структура. Продолжение 2 Таким образом, в первом приближении класс отличается от структуры четко определенным интерфейсом доступа к его элементам. Объекты класса обладают всеми свойствами переменных, в том числе такими, как область действия и класс памяти (время жизни). Последнее свойство наиболее интересно, так как процессы создания и уничтожения объектов класса могут сопровождаться вызовом функций (конструктор и деструктор). Члены класса – это переменные состояния и методы этого класса, иными словами, членами класса могут быть как переменные, так и функции. Функции и переменные, объявленные внутри объявления класса, становятся членами этого класса. Функции-члены класса будем называть методами этого класса. По умолчанию все функции и переменные, объявленные в классе, становятся закрытыми (private). Т.е. они доступны только из других членов этого класса. Для объявления открытых членов класса используется ключевое слово public. Все функции-методы и переменные, объявленные после слова public, доступны и для других членов класса, и для любой другой части программы, в которой содержится класс. В структурах по умолчанию все члены являются отрытыми. Так что, приведенные ниже примеры аналогичны. |
||||
|
Р Механизм полиморфизма позволяет для класса-потомка Окно_с_текстом предусмотреть собственный метод Изобразить (см. рис. 18). Метод Инициализировать также должен быть переопределен, так как он должен инициализировать дополнительные поля класса. Класс Окно_с_текстом - родитель: класс Окно: поля Xt, Yt, Text метод Инициализировать (aXl,aYl,aX2,aY2,aColor, aXt, aYt, aText) метод Изобразить Конец описания. Примечание. При реализации методов Изобразить и Инициализировать потомка можно вызвать соответствующие родительские методы, а затем добавить операторы, определяющие собственные действия метода для разрабатываемого класса. |
||||
|
13. ООП - Указатели. Продолжение
С указателями можно выполнять целочисленные арифметические операции. При этом происходит вычисление адреса соответствующего элемента массива, а не адреса в памяти компьютера. Размер элемента определяется типом указателя. Для типа void соответственно никакие операции выполнять нельзя. Указатель можно индексировать как массив. Следующие два оператора эквивалентны: array[3]=10; *(array+3)=10; Указатели вместо массивов целесообразно использовать тогда, когда требуется последовательный доступ к элементам массива. Такая операция выполняется значительно быстрее, например: int *ptemp=array; for(int i=1;i<10;i++) *(ptemp++)=0; можно использовать для обнуления массива array. |
||||
14. ООП - Перегрузка функций. Цель перегрузки состоит в том, чтобы функция с одним именем по-разному выполнялась и возвращала всевозможные значения при обращении к ней с различными списками фактических параметров. Выбор нужной функции зависит от списка параметров. Для обеспечения перегрузки функций необходимо для каждого имени определить, какие комбинации параметров возможны при обращении к ним. Перегруженные функции должны иметь одинаковые имена, но отличаться по количеству параметров, их типам или расположению. Ниже показан пример объявления перегруженной функции с именем total(), принимающей в качестве аргументов массивы чисел типа int, float и double. int total (initisize, int iarray[]); float total (initisize, float farray[]); double total (initiasize, double darray[]);
|
|
||||
16. ООП - Указатель this. При описании класса автоматически объявляется переменная с именем this. Она указывает на текущий экземпляр класса: ИмяКласса *this; Его можно использовать в случаях, когда возникает неоднозначность в именах, для явного вызова конструкторов класса, для возврата указателя на текущий объект в методах класса. Каждый объект имеет доступ к собственному адресу с помощью указателя this. Указатель this объекта не является частью самого объекта – то есть указатель this не отражается в результате операции sizeof над этим объектом. Скорее, указатель this передается в объект (компилятором) как неявный первый аргумент в каждом вызове нестатической функции-члена для объекта. Указатель this неявно используется для ссылки как на данные-члены, так и на функции-члены объекта. Тип указателя this зависит от типа объекта и от того объявлена ли функция-член, в которой используется this, как const. В неконстантной функции-члене класса Х указатель this имеет тип X *const (константный указатель на объект Х). В константной функции-члене класса Х указатель this имеет тип const X *const (константный указатель на объект Х, который тоже константный). Одним интересным применением указателя this является предотвращение присваивания объекта самому себе. Самоприсваивание может стать причиной серьезных ошибок в случаях, когда объекты содержат указатели на динамически распределяемую память. Другим применением указателя this является возможность сцепленных вызовов функций-членов класса. |
17. ООП - Локальные классы. Класс можно описать в определении функции. Такой класс называется локальным. Имя локального класса считается локальным в объемлющей области видимости, а областью видимости локального класса является объемлющая область видимости. В описаниях локального класса из объемлющей области видимости можно использовать только имена типов, статических переменных, внешних переменных и функций, а также элементы перечисления. Объемлющая функция не имеет особых прав доступа к членам локального класса, она подчиняется обычным правилам доступа. Функцию-член локального класса следует определять в определении этого класса. Локальный класс не может иметь статических членов, представляющих данные. void m() { static int s; int x; struct local { void m1() { x; } // ошибка: х – динамическая переменная void m2() { s; } // верно };
|
||||
18. ООП - Абстрактные классы. Суперкласс, в котором заданы только атрибуты и сигнатуры операций. Но не определены методы, реализующие его операции, называется абстрактным классом. Абстрактный класс не может иметь объектов, т.к. в нем не определены операции над объектами; объекты должны принадлежать конкретным подклассам абстрактного класса. Классы, для которых нет смысла создавать объекты, объявляют как абстрактные. Абстрактный класс – это класс, содержащий хотя бы один чисто виртуальный метод. Чисто виртуальный метод – это метод, объявленный в классе, но не имеющий конкретной реализации. Синтаксис объявления чисто виртуального метода дополняется конструкцией = 0, например: virtual void Show() = 0; Единственным назначением абстрактного класса является создание соответствующего базового класса, от которого другие классы могут наследовать интерфейс и реализацию. Классы, объекты которых могут быть реализованы, называются конкретными классами. Если в производном классе хотя бы одна чисто виртуальная функция базового класса останется без конкретной реализации, то такой производный класс также будет абстрактным классом, для которого запрещено создавать объекты. Абстрактный класс нельзя употреблять в качестве типа параметра функции, типа возвращаемого функцией значения или как тип при явном приведении. Абстрактные классы используются для спецификации интерфейсов операций (методы, реализующие эти операции, впоследствии определяются в подклассах абстрактного класса). Абстрактные классы удобны на фазе анализа требований к системе, т.к. они позволяют выявить аналогию в различных, на первый взгляд, операциях, определенных в анализируемой системе. |
|
||||
|
2. ООП - Объектно-ориентированная разработка программ. Продолжение Физическое проектирование включает объединение описаний классов в модули, выбор схемы их подключения (статическая или динамическая компоновка), определение способов взаимодействия с оборудованием, с операционной системой и/или другим программным обеспечением (например, базами данных, сетевыми программами), обеспечение синхронизации процессов для систем параллельной обработки и т.д. Эволюция системы. Это процесс поэтапной реализации и подключения классов к проекту. Процесс начинается с создания основной программы или проекта будущего программного продукта. Затем реализуются и подключаются классы, так чтобы создать грубый, но, по возможности, работающий прототип будущей системы. Он тестируется и отлаживается. Например, таким прототипом может служить система, включающая реализацию основного интерфейса программного продукта (передача сообщений в отсутствующую пока часть системы не выполняется). В результате мы получаем работоспособный прототип продукта, который может быть, например, показан заказчику для уточнения требований. Затем к системе подключается следующая группа классов, например, связанная с реализацией некоторого пункта меню. Полученный вариант также тестируется и отлаживается и так далее, до реализации всех возможностей системы. Модификация. Это процесс добавления новых функциональных возможностей или изменение существующих свойств системы. Как правило, изменения затрагивают реализацию класса, оставляя без изменения его интерфейс, что при использовании ООП обычно обходится без особых неприятностей, так как процесс изменений затрагивает локальную область. Изменение интерфейса − также не очень сложная задача, но ее решение может повлечь за собой необходимость согласования процессов взаимодействия объектов, что потребует изменений в других классах программы. Особенностью ООП является то, что объект или группа объектов могут разрабатываться отдельно, и, следовательно, их проектирование может находиться на различных этапах. Обычно проектирование начинается, когда какой-либо фрагмент предметной области достаточно полно описан в процессе анализа. |