- •Литература
- •Содержание
- •1. Основные понятия ооп
- •2. Программирование для Windows
- •3. Визуальное программирование и среда Delphi
- •Создание приложений в средеDelphi
- •Компоненты общего назначения tMainMenu- главное меню формы (программы)
- •TPopupMenu- вспомогательное (локальное) меню
- •TLabel- метка для отображения текста
- •TEdit-ввод и отображение строки
- •TMemo- ввод и отображение текста
- •TButton- кнопка
- •TBitBtn- кнопка с изображением
- •TSpeedButton- кнопка для инструментальных панелей
- •TCheckBox- независимый переключатель
- •TRadioButton- зависимые переключатели
- •TRadioGroup- группа зависимых переключателей
- •TListBox- список выбора
- •TComboBox- раскрывающийся список выбора
- •TPanel- панель
- •TTabControl- набор закладок
- •TPageControl- набор страниц с закладками
- •4. Особенности языка ооп Object Pascal
- •Процедуры и функции Выход из процедур и фукнций и возврат результата
- •Передача параметров
- •Параметры со значениями по умолчанию
- •Перегрузка функций
- •Динамическое распределение памяти
- •Указатели
- •Операции с указателями
- •Операция @
- •Самоадресуемые записи
- •Динамические массивы Одномерные динамические массивы
- •Многомерные динамические массивы
- •Исключения и их обработка
- •Защита кода зачистки в блокахtry...Finally
- •Защита кода зачистки на уровне модуля — разделfinalization
- •Обработка исключений в блокахtry...Except
- •Последовательность обработки исключений
- •5. Классы и объекты
- •Классы и объекты
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Составляющие класса Поля
- •Одноименные методы
- •Свойства
- •События
- •Объявление класса
- •Операции с классами
- •Ссылки на классы
- •TObjectи информация о классах
- •Регистрация и обнаружение классов
- •6. Создание объектов во время выполнения, поиск компонентов
- •Клонирование объектов
- •Поиск компонента
- •Двукратное освобождение объекта
- •7. Построение собственных компонентов
- •Как и для чего следует строить компоненты
- •Общие руководящие принципы
- •Ключевые идеи
- •Компиляция компонентов
- •Отладка компонентов
- •Примечание
- •Примечание
- •Примечание
- •8. Работа с потоками
- •Классы потоковDelphi
- •Файловые потоки
- •Примечание
- •Методы потоков в действии: программаMemoStr
- •Потоки памяти
- •Пример программыMemoryS
- •Примечание
- •Написание заказного класса потока
- •9. Работа с com-объектами, использование серверов ole-автоматизации
Объектно-ориентированное программирование
Лекции.
8 лекций по 2 час. (17 час.)
8 лабораторных работ по 4 часа (32 часа).
Экзамен.
Литература
Фаронов В.В. Delphi5. Учебный курс. – М.: «Нолидж», 2000. – 608 с., ил.
Архангельский А.Я. ObjectPascalвDelphi5 – М.: ЗАО «Издательство БИНОМ», 1999. – 224 с.: ил.
Архангельский А.Я. Разработка прикладных программ для WindowsвDelphi5 – М.: ЗАО «Издательство БИНОМ», 1999. – 256 с.: ил.
Марко Канту, Тим Гуч, Джон Лэм. 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.