
- •Часть 2
- •Оглавление
- •1. Структурный подход к программированию
- •1.1. Цели структурного программирования
- •1.2. Основные принципы структурного подхода
- •1.3. Спецификация программ
- •1.4. Метод пошаговой детализации
- •2. Предыстория объектно-ориентированного программирования
- •2.1. Введение в объектно-ориентированное программирование
- •2.2. Тип Объекты
- •2.3. Основные понятия ооп. Инкапсуляция. Наследование
- •X, y : integer; {координаты позиции}
- •XX,yy:array [1..1000] of integer;
- •2.4. Совместимость объектных типов по присваиванию
- •2.5. Описание типа-потомка
- •2.6. Полиморфизм
- •2.7. Виртуальные методы. Конструкторы и деструкторы
- •2.7.1. Правила работы с виртуальными методами
- •3. Типы данных и операторы языка object pascal в delphi
- •3.1. Предопределенные типы данных
- •3.1.1 Вещественные типы
- •3.1.2. Длинные строки
- •3.2. Структурированные типы
- •3.2.1. Множества
- •Var MySet: set of 'a'..'z';
- •3.2.2. Массивы
- •Var FlexArray: array of Real;
- •Var Ints: array of array of Integer;
- •3.2.3. Записи
- •Var Record1,Record2:tDateRec;
- •3.2.4. Указатели
- •I: Integer;
- •V1,v2,v3,v4,v5:Variant;
- •I:Integer;
- •3.3. Типы данных, специфичные для Windows
- •3.3.1. Приведение и преобразование типов
- •3.4. Операторы языка Паскаль
- •I:Integer;
- •I:Integer;
- •3.4.1. Элементы управления редактированием
- •3.5. Процедуры и функции библиотеки vcl
- •4. Реализация ооп на языке pascal
- •V: Real;
- •Наследование
- •Virtual;
- •Конструкторы и деструкторы
- •Перекрытие методов
- •5. Программирование в среде delphi
- •5.1. Основные элементы
- •5.2. Реализация объектно-ориентированного программирования
- •5.3. Разработка интерфейса приложения
- •5.3.1. Создание простейшего Windows-приложения
- •5.3.2. Создание Windows-приложения с метками и кнопками
- •Объект Свойство Значение
- •6.1.3. Меню Edit
- •6.1.4. Меню Search
- •6.1.5. Меню View
- •6.1.6. Меню Run
- •6.1.7. Меню Component
- •6.1.8. Меню Tools
- •6.1.9. Полоска кнопок быстрого доступа SpeedBar
- •6.1.10. Локальные меню. SpeedMenu
- •6.2. Работа с формами
- •6.2.1. Палитра компонентов
- •6.2.2. Object Inspector
- •6.2.3. Написание кода
- •6.2.4. Компиляция проекта
- •6.2.5. Интегрированный отладчик
- •6.2.6. Файлы, создаваемые системой
- •7. Структура delphi-программ
- •7.1. Разработка проекта Dialog
- •7.2. Процедуры вызова диалоговых окон
- •7.3. Преобразования типов
- •Var factW,optW,Rost,Delta:integer;
- •Var factW,optW,Rost,Delta:real;
- •7.4. Простейшие компоненты
- •7.4.1. Группы радиокнопок - компоненты RadioGroup, RadioButton, GroupBox
- •7.4.2. Компоненты выбора из списков - ListBox, ComboBox
- •7.4.3. Многострочные окна редактирования Memo и Richedi
- •7.4.4. Графические объекты
- •If OpenDialog1.Execute
- •Image1.Picture.LoadFromFile
- •7.4.5. Канва и пиксели
- •X, y :real; // координаты функции
- •7.4.6. Воспроизведение немых видео клипов – компонент Animate
- •7.4.7. Установка и настройка приложения: работа с файлами *.Ini
- •IniFile.Free;
- •Упражнения
- •8. Репозиторий объектов и эксперты
- •8.1. Страницы репозитория объектов
- •8.1.1. Страница New
- •8.1.2. Страница Forms
- •8.1.3. Страница Dialogs
- •8.1.4. Страница Data Modules
- •8.1.5. Страница Projects
- •8.2. Эксперты Delphi
- •8.2.1. Application Expert
- •8.2.2. Dialog Box Expert
- •9. Классы и модули
- •9.1. Классы и сокрытие информации
- •9.2. Классы и модули
- •9.3. Модули и область видимости
- •9.4. Модули и программы
- •9.5. Информация о типе на этапе выполнения
- •If MyAnimal is Dog then …
- •If MyAnimal is Dog
- •If MyAnimal is Dog then
- •10. Использование компонентов
- •10.1. Буксировка из одного компонента в другой
- •10.2. Обработка исключений
- •10.3. Восприятие ввода для пользователя
- •Val( Edit1.Text,Number,Code);
- •Val((Sender as tEdit).Text,Number,Code);
- •11.2. Различные роли элементов меню
- •11.3. Редактирование меню с помощью Menu Designer
- •If OpenDialog1.Execute
- •If SaveDialog1.Execute
- •Procedure tForm1.ViewEdit1Click(Sender:tObject); begin
- •If Panel1.Visible
- •If Buttons1.Enabled
- •12. Получение «ввода от мыши» и рисование в форме
- •12.1. События, связанные с мышью
- •12.2. Рисование в форме
- •If ssShift in Shift
- •If Circle then Canvas.Ellipse(Center.X-Radius.X,Center.Y-
- •Else Canvas.Rectangle(Center.X-Radius.X,Center.Y-
- •12.3. Черчение и рисование в системе Windows
- •13. Инструментальная линейка и строка состояния
- •13.1. Построение инструментальной линейки
- •Procedure tForm1.SpeedButton1Click(Sender:tObject); begin
- •If SpeedButton1.Down
- •13.2. Добавление всплывающих подсказок в линейку
- •13.3. Комбинированный список в инструментальной линейке
- •13.4. Построение строки состояния
- •14.1. Добавление второй формы в программу
- •14.2. Создание диалоговой панели
- •Задание № 1
- •Procedure tForn1.BitBtnClick(Sender:tObject); begin PageControl1.SelectNextPage(true);
- •Do ListBox1.Items.Add(PageControl1.Page[I].Caption);
- •14.3.1. Блокнот с набором ярлыков
- •If FontDialog1.Execute
- •15.2. Жизненный цикл программного средства
- •15.3. Понятие качества программного средства
- •15.4. Обеспечение надежности основной мотив разработки программных средств
- •15.4.1. Методы борьбы со сложностью
- •15.4.2. Обеспечение точности перевода
- •15.4.3. Преодоление барьера между пользователем и разработчиком
- •15.4.4. Контроль принимаемых решений
- •Литература
- •Часть 2. Объектно-ориентированное программирование
1. Структурный подход к программированию
С возрастанием количества и размеров программ процесс их разработки стал практически не управляемым. Возникла проблема коренного изменения подходов к созданию больших программных комплексов. Были разработаны строгие правила ведения проектов, которые получили название структурной методологии.
Впервые термин «структурное программирование» ввел Эдсгер Дейскстра. Он рассматривал программу как совокупность иерархических абстрактных уровней, которые позволяли четко структурировать программу, выполнять доказательства при ее корректировке, а значит, и повышать надежность функционирования программы, и сокращать сроки ее разработки.
Э. Дейкстра указывал: «Оператор GOTO нужно считать вредным». Его поддержали ученые Н. Вирт (Цюрих) и Хоар (Оксфорд).
Было доказано, что любая программа может быть написана с использованием только простой последовательности операторов, циклической конструкции типа for или while и выбора if или case.
1.1. Цели структурного программирования
Обеспечение дисциплины программирования («Структурное программирование - это дисциплина, которую программист навязывает сам себе», – утверждал Э. Дейкстра).
Повышение эффективности (например, разбиение на относительно независимые модули).
Повышение надежности (облегчение тестирования и отладки).
Уменьшение времени и стоимости (повышение производительности программистов).
Улучшение читабельности программы.
1.2. Основные принципы структурного подхода
Принцип абстракции позволяет рассматривать программу по уровням. Верхний уровень показывает наибольшую степень абстракции, упрощает восприятие программы; нижний уровень показывает детали реализации (например, восходящие и нисходящие стратегии программирования).
Разделение программы на отдельные фрагменты (методы), которые просты по управлению и допускают независимую отладку и тестирование.
Строгий методический подход (принцип формальности) позволяет изучать программы (алгоритмы) как математические объекты, ускорять принятие решений, избежать ошибок.
Возможность участия в получении результата большого количества людей.
Программы должны быть построены так, чтобы можно было вносить в них изменения без участия автора.
Возможность демонстрирования работы программы на всех этапах ее создания.
Возможность планирования работы, уверенность в реальных сроках завершения.
Принцип иерархического упорядочения.
Структурный подход включает в себя три основные составные части:
– нисходящее проектирование;
– структурное программирование;
– сквозной структурный контроль.
Рассмотрим подробнее первую часть. При возрастании сложности и объема программ они становятся слишком большими для анализа и понимания даже при условии правильной организации их структуры. С целью управления процессом создания программ прибегают к делению большой программы на модули. Этот процесс называется нисходящим проектированием.
Делить программу на модули необходимо, учитывая следующие свойства (или требования) модулей:
1. Возможность обособления модуля в исходном и объектном кодах.
2. Наличие имени у модуля и возможность вызова по имени.
3. Модуль должен иметь один вход и один выход.
4. Модуль должен возвращать управление в ту точку, откуда был вызван.
5. Модуль должен иметь возможность вызывать другие модули.
6. Внутренний текст модуля должен быть структурирован (представлять комбинацию простых структур).
7. Модуль должен быть обозрим в исходном тексте (желательно чтобы он помещался на одной странице).
8. Модуль не использует историю своих вызовов для управления своим функционированием (сколько бы мы ни вызывали модуль, он делает одно и то же).
9. Функциональная замкнутость модуля (идеальный модуль выполняет только одну функцию, но выполняет ее целиком).
10. Модуль должен иметь минимальную возможность обмена информацией с другими модулями.
11. Модуль может использовать глобальные объекты, но не должен их менять (без необходимости).
Итак, нисходящее проектирование – это процесс проектирования программной системы как совокупности модулей, основанный на уровнях абстракции, которые сначала представляют собой уровни функций, а затем – уровни модулей. На самой вершине этого процесса находится единственный модуль, который является образом всей системы. Его функция – основная функция всей системы. Мы рассматриваем его функцию и выясняем, чем он должен обладать, чтобы соответствовать свойствам модуля.
П р и м е р (рис. 1.1). Если функции F1, F2, F3 реализованы отдельно, но основной модуль может обращаться к ним, тогда модуль хорошо организован.
Общая функция системы
F1
F2
F3
Второй
у
ровень
Третий уровень
Ч
F7
F5
F8
F10
F9
F7
F4
F6
етвертый
уровень
Рис. 1.1. Модульная организация программы
После завершения разработки схемы иерархии следует согласовать ее с заказчиком.