Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП / ООП_Лекции.doc
Скачиваний:
49
Добавлен:
08.06.2015
Размер:
1.03 Mб
Скачать

Объектно-ориентированное программирование

Лекции.

8 лекций по 2 час. (17 час.)

8 лабораторных работ по 4 часа (32 часа).

Экзамен.

Литература

  1. Фаронов В.В. Delphi5. Учебный курс. – М.: «Нолидж», 2000. – 608 с., ил.

  2. Архангельский А.Я. ObjectPascalвDelphi5 – М.: ЗАО «Издательство БИНОМ», 1999. – 224 с.: ил.

  3. Архангельский А.Я. Разработка прикладных программ для WindowsвDelphi5 – М.: ЗАО «Издательство БИНОМ», 1999. – 256 с.: ил.

  4. Марко Канту, Тим Гуч, Джон Лэм. Delphi. Руководство разработчика: Пер.с.англ. – К.ВЕК+, М.: ЭНТРОП, М: ДЭСС, 1999. – 752 с., ил.

Содержание

1. Основные понятия ООП 3

2. Программирование для Windows 7

3. Визуальное программирование и среда Delphi 9

Создание приложений в среде Delphi 9

Компоненты общего назначения 11

TMainMenu - главное меню формы (программы) 11

TPopupMenu - вспомогательное (локальное) меню 12

TLabel - метка для отображения текста 12

TEdit-ввод и отображение строки 12

TMemo - ввод и отображение текста 12

TButton - кнопка 12

TBitBtn - кнопка с изображением 13

TSpeedButton - кнопка для инструментальных панелей 13

TCheckBox - независимый переключатель 14

TRadioButton - зависимые переключатели 14

TRadioGroup - группа зависимых переключателей 14

TListBox - список выбора 15

TComboBox - раскрывающийся список выбора 15

TPanel - панель 16

TTabControl - набор закладок 16

TPageControl - набор страниц с закладками 17

4. Особенности языка ООП Object Pascal 19

Процедуры и функции 19

Выход из процедур и фукнций и возврат результата 19

Передача параметров 20

Параметры со значениями по умолчанию 21

Перегрузка функций 23

Динамическое распределение памяти 23

Указатели 25

Операции с указателями 27

Самоадресуемые записи 28

Динамические массивы 29

Одномерные динамические массивы 29

Многомерные динамические массивы 31

Тип variant 32

Исключения и их обработка 34

Защита кода зачистки в блоках try ... finally 34

Защита кода зачистки на уровне модуля — раздел finalization 35

Обработка исключений в блоках try ... except 35

Последовательность обработки исключений 37

5. Классы и объекты 38

Классы и объекты 38

Инкапсуляция 38

Наследование 39

Полиморфизм 39

Составляющие класса 40

Поля 40

Методы 40

Свойства 46

События 47

Объявление класса 48

Операции с классами 50

Ссылки на классы 51

TObject и информация о классах 52

Регистрация и обнаружение классов 52

6. Создание объектов во время выполнения, поиск компонентов 53

Клонирование объектов 55

Поиск компонента 56

Двукратное освобождение объекта 56

7. Построение собственных компонентов 59

Как и для чего следует строить компоненты 59

Общие руководящие принципы 60

Ключевые идеи 61

Компиляция компонентов 62

Отладка компонентов 63

8. Работа с потоками 68

Классы потоков Delphi 68

Файловые потоки 69

Методы потоков в действии: программа MemoStr 70

Потоки памяти 71

Пример программы MemoryS 72

Написание заказного класса потока 75

9. Работа с COM-объектами, использование серверов OLE-автоматизации 78

1. Основные понятия ооп

Вопросы:

  • Структурное программирование.

  • Переход от структурного к объектно-ориентированному программированию.

  • Основные черты ООП – инкапсуляция, наследование, полиморфизм.

По статистике от 50 до 100% времени программист тратит на решение задач по исправлению, эксплуатации и модификации программ. Пытаясь помочь программистам, индустрия программного обеспечения предлагает все более систематичные подходы к программированию, т.е. предлагает методики, использование которых уменьшает вероятность ошибок в программах, упрощает их понимание и облегчает модификацию.

В 70-80 годы самой популярной методикой разработки ПО была методика структурного программирования сверху-вниз. В 90-е годы на смену ей пришло объектно-ориентированное программирование.

Строго говоря, под структурным программированием понимается процесс разработки алгоритмов с помощью структурных блок-схем.

Программирование сверху-вниз — это процесс пошагового разбиения алгоритма на всё более мелкие части с целью получить такие элементы, для которых можно легко написать конкретные команды. Структурное программирование сверху-вниз — это процесс про­граммирования сверху вниз, ограниченный использованием струк­турных блок-схем. Другими словами, это разработка программ модульной структуры с использованием ограниченного числа допустимых типов управляющих структур – последовательность, цикл, выбор. Кроме того, для структурного программирования характерны требование соответствующего документирования программ (использования комментариев), наглядной записи программных операторов с использованием отсту­пов в начале строк, разбиения программы на обозримые части.

Рекомендуется, например, составлять программные модули так, чтобы их распечатка не превышала одной-двух страниц. Страница — это смысловая единица, которую можно представить себе в любой момент как единое целое и которая сводит к минимуму необходимость переворачивать страницы при прослеживании передач управления в программе.

Конечно, для разработки структурированной сверху-вниз про­граммы потребуется затратить больше усилий, чем для получения неструктурированной программы. Впрочем, опыт показывает, что дополнительные затраты с лихвой вознаграждаются. Структуриро­ванные программы, как правило, легче читать, и в них легче разби­раться, так как их можно читать сверху-вниз, не прыгая по тексту из конца в начало. Главным образом это достигается благодаря тому, что общая структура управления в структурированной программе является деревом, а не сетью со многими циклами.

По этой причине такие программы иногда называют программами со структурой дерева.

Часто структурное программирование называют «программирование без goto». Однако этот метод не запрещает использование операторов goto, если текст про­граммы при этом становится более понятным.

Вместе с тем этот метод разработки алгоритмов не гарантирует отсутствие ошибок в программе. Опыт показывает, например, что, когда глубина вложения структур управления равна трем или более трех, веро­ятность совершения ошиб­ки возрастает очень силь­но. Ана­логичная ситуация возни­кает и в случае, когда мо­дули становятся очень длинными.

Структурное программирование в свою очередь стало развитием процедурного (или функционального) программирования. Приемы процедурного программирования концентриру­ются на алгоритмах, используемых для решения задачи. При этом структуры данных, задействованные функциями, рассматриваются как отдельные части программы, т.е. данные и функции, связанные между собой логически, ока­зываются не связанными в физическом пространстве.

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

Однако когда программа разрастается, программисты вынуждены определять дополнительные пользовательские типы и опи­сывать сотни глобальных функций.

Еще одним недостатком структурного программирования является тот факт, что когда вы меняете данные, то должны изменить и использующую их функцию. В структурном программировании функции и данные, с которыми они работают, слабо связаны. Если мы хотим включить несколько наших функций в новую систему, мы должны будем четко понимать, как взаимодействуют отдельные фрагменты и мы будем вынуждены взять и описание глобальных данных, к которым происходит обращение внутри описания функции. Если мы не перенесем в новый код корректное определение этих данных (а его еще на­до найти!), мы не сможем его оттранслировать - и, соответственно, не сможем им воспользоваться.

Итак, структурное программирование работает с (обычно глобальными) дан­ными и функциями. Поскольку они связаны логически, но не физически, мы должны четко представлять всю систему как целое, чтобы понимать, к каким результатам может привести изменение типов данных, модификация функций и повторное использование кода.

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

Объектно-ориентированное проектирование программ - это расширение использования абстракции данных. Под абстрактным типом данных понимают такую программную модель, кото­рая определяет набор допустимых значений рассматриваемого типа данных и на­бор допустимых операций, производимых с этим типом.

Понятие абстрактных типов данных в технологии программирования появилось сравнительно недавно в результате усилий, направленных на преодоление недо­статков процедурно-ориентированных языков и в целом подхода под названием «структурное программирование». По мере того как разрабатываемые системы ПО становятся больше и сложнее, недостатки процедурных языков проявляют­ся все отчетливее. Дело в том, что эффективное использование большинства про­цедур в таких системах очень сильно зависит от выбранной структуры данных. В случае даже небольших изменений основных (ключевых) данных многие про­цедуры приходится переписывать заново, а иногда из-за этого приходится раз­рушать и снова создавать всю систему ПО.

Введем два базовых понятия, которые играют существен­ную роль в ООП:

Инкапсуляция — это связывание определенного типа данных с набором про­цедур и функций, используемых для манипуляции этими данными. По сути это объединение (помещение в одну капсулу, класс) как данных, характери­зующих все объекты определенного класса, так и функций, с помощью ко­торых эти данные обрабатываются.

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

Использование инкапсуляции и скрытия данных позволяют программистам избежать многих проблем в сопровождении ПО. Если меняется структура клю­чевых данных, то изменению подлежит лишь небольшая и расположенная в од­ном месте часть программы, находящаяся в модуле реализации (implementation module). Остальная часть системы ПО остается без изменений, так как она свя­зывается с ключевыми данными только через процедуры, обозначенные в definition module.

В ООП каждый объект принадлежит определенному классу. Класс — это ос­новной инструмент, посредством которого осуществляется инкапсуляция и скры­тие данных. Если описан класс, то определены характеристики всех объектов, принадлежащих этому классу. Функции, инкапсулированные в классе и пред­назначенные для выполнения каких-либо операций с данными любого из объек­тов этого класса, принято называть методами класса.

Другими отличительными особенностями ООП являются наследование и полиморфизм.

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

Полиморфизм- это свойство классов решать схожие по смыслу про­блемы разными способами. Изменяя алгоритм того или иного метода в потомках класса, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимоперекрыть его в потомке, т.е. объявить в потомке одноименный метод и реализовать в нем нуж­ные действия. В результате в объекте-родителе и объекте-потомке будут действовать дваодноименных метода, имеющих разную алгоритмическую основу и, следовательно, придающих объектам разные свойства. Это и называется полиморфизмом объектов.

В настоящее время существует большое количество разнообразных объектно-ориентированных языков программирования (Smalltalk, C++, Java и т.д.), которые наряду с общими чертами имеют и существенные отличия в реализации идей ООП.

Дальнейшее изучение технологии объектно-ориентированного программирования продолжим на примере языка Object Pascal, являющегося ядром системы программирования Delphi.

КлассамивObjectPascalназываются специальные типы, которые содержат поля, методы и свойства. Как и любой другой тип, класс служит лишь образцом для создания конкретных экземпляров реализации, которые называютсяобъектами.

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

Компоненты – это дискретная часть программного обеспечения, предназначенная для выполнения отдельной, заранее определенной работы.

КомпонентамивDelphiназываются потомки классаTСomponent, в котором инкапсулированы самые общие свойства и методы компонентов и который умеет взаимодейстовать со средой разработки. Этот класс служит базой для создания как видимых, так и невидимых компонентов. Большинство видимых компонентов происходит от классаTControl.

Соседние файлы в папке ООП