Правильно для маленькой программы и недопустимо для большой системы. • Аналогия: строительство будки для собаки и строительство небоскрёба
Вид материала | Программа |
- Учебно-методический комплекс по дисциплине «инженерная геодезия» для студентов 3 курса, 610.25kb.
- Пособие и методические указания к выполнению курсовой работы, 639.04kb.
- Конспект лекций по дисциплине «Теплоснабжение» для студентов 4 и 5 курсов всех форм, 22.36kb.
- План для самостоятельной работы по специальности спо 270802 «Строительство и эксплуатация, 104.67kb.
- Строительство комплекса зданий производственной базы и фондохранилища - завершение, 194.75kb.
- «Войсковая часть 7408 г. Нижний Новгород, строительство и реконструкция военного городка, 1125.35kb.
- Дисциплина учебного плана подготовки специалиста Специальность 271101. 65 «Строительство, 18.47kb.
- Рабочая программа дисциплины опд ф. 09 «Инженерная геология» для специальности 270102, 214.97kb.
- Анализ рынка рекламы г. Москвы Введение, 1831.97kb.
- Положение о республиканской научно-практической конференции для обучающихся «Строительство:, 61.05kb.
1)Понятия системного программного продукта(РИС)
• Современные задачи и их сложность. Один разработчик не в состоянии
охватить все аспекты такой программы.
• Простая программа и её назначение: пригодна для запуска автором и его
знакомыми на той же системе, где была разработана.
• Программа → программный продукт. Требования к программному
продукту (ПП): обобщённый стиль, надёжность, документация,
сопровождение.
• Программа → программный комплекс. Требования к программному
комплексу (ПК): набор взаимодействующих программ (компонент),
согласование по функциям и по форматам данных, системное тестирование.
• .Системный программный продукт – комплекс взаимодействующих
программ, надлежащим образом написанный, протестированный и
задокументированный с обеспечением сопровождения в процессе его
применения пользователями.
• Системное программирование – процесс разработки сложных
программных систем в целом или их отдельных компонент .РИС
2)Стадии разработки программного обеспечения(РИС)
• Типичная ошибка: после получения задания немедленное написание кода.
Правильно для маленькой программы и недопустимо для большой системы.
• Аналогия: строительство будки для собаки и строительство небоскрёба.
• Основные стадии разработки: постановка задачи, анализ требований и
исследование проблемы, проектирование, написание и тестирование
компонент, системное тестирование, документирование и сопровождение.
• Разработка ПО – итеративный процесс.
3)Основные идеи инкрементального программирования(РИС)
1.Технологии программирования
• Знание большого числа языков или сред программирования ничуть не
помогает быстрее справиться с проблемой. Необходимо знание принципов
разработки.
• Результат программирования – продукт определённого качества.
• Технология программирования – наука о производстве программного
продукта.
• Виды технологий: процедурно-ориентированное, модульное, «сверху-
вниз», функциональное, логическое, инкрементальное, абстрактные типы
данных, объектно-ориентированное.
• Допустимо применение различных технологий в одном проекте для
различных подсистем.
2.Принципы инкрементального программирования
• Программа не пишется – она строится – ещё точнее наращивается путём
пошаговой разработки.
• Этап №1: заставить выполняться (пустая программа).
• Этап №2: создание каркаса системы, реализующего схему работы системы
на самом верхнем уровне. Используются функции-заглушки (фиктивные
подпрограммы) и определяются необходимые переменные.
• Этап №3,4,...: обрастание системы «мясом». Реализация заглушек,
возможно с использованием других заглушек и дополнительных временных
переменных. Последовательное добавление новой функциональности
(наращивание каркаса).
• Преимущества технологии: на каждом шаге имеем работающую систему,
быстрое макетирование системы, положительный психологический эффект.
• Отличие от технологии «сверху-вниз» – осуществляется «движение» не
только вниз но и вширь (добавление функциональности по горизонтали в
структуре модулей)
5)Понятия объекта:состояние,поведение,методы. Понятие класса и
идентичность объектов.(РИС)
1.Понятие объекта и класса
• Базовые единицы в ООП – объекты. Объекты это элементы проблемной
области и их представление в области реализации. ООП описывает проблему
в терминах самой проблемы, а не компьютера. Пример: продажа напитков
торговым автоматом.
• Всё является объектом. Пример: прием и анализ сигналов из окружающей
среды.
• Программа есть набор объектов, взаимодействующих путем посылки
сообщений.
• Объект – нечто, обладающее состоянием, поведением и
индивидуальностью.
• Индивидуальность – свойство, позволяющее объекты отличать друг от
друга. Объект может иметь имя.
• Состояние объекта характеризуется перечнем (обычно статическим) всех
свойств объекта и текущими (обычно динамическими) значениями каждого
из этих свойств. Значения – количественные характеристики и ссылки на
другие объекты. Любой объект занимает определенное пространство в
памяти компьютера.
• Поведение – это то, как объект действует и реагирует, поведение
выражается в терминах состояния объекта и передачи сообщений.
• Структура и поведение схожих объектов определяют общий для них класс.
Термины «экземпляр класса» и «объект» – синонимы.
7)Проблема создания и уничтожение объектов.
1.Проблема инициализации
• Для всех объектов должна быть выполнена инициализация (задание их
начального состояния).
• Способ решения проблемы: определение обычного метода для
инициализации. Недостаток подхода: можно забыть его вызвать или вызвать
несколько раз.
• Решение в ООП: использование конструктора – специального метода,
вызываемого для объекта автоматически при его создании.
• Инструкция объявления переменной – инструкция действия.
• Конструкторы глобальных объектов выполняются до начала работы
функции main().
• Синтаксис конструктора: имяКласса(списокПараметров)
• Конструктор без параметров называется конструктором по умолчанию.
2.Проблема уничтожения
• Деструктор – специальный метод класса, который вызывается для объекта
автоматически при его уничтожении.
• Главная задача деструктора – освобождение ресурсов, которые находятся
во владении объектом.
• Синтаксис деструктора: ~имяКласса()
• Для автоматических объектов деструктор вызывается при выходе из их
области видимости, а для остальных объектов при завершении программы.
• Пример определения деструктора в классе SlotMachine.
9)Статические и постоянныечлены класса.Встраевыемые методы.
• Задача: учет количества торговых автоматов. Требуется в любой момент
времени иметь возможность узнать текущее количество существующих
объектов класса SlotMachine.
• Решение: поддержка счетчика объектов. При создании в конструкторе
увеличивать, а при уничтожении в деструкторе уменьшать его значение.
• Проблемы использования глобальной переменной для счетчика –
вероятность конфликта имен и отсутствие инкапсуляции.
• Решение первой проблемы – использование статической переменной
состояния. Она разделяется между экземплярами класса. Не является частью
объекта, но является частью класса.
• Объявление статической переменной состояния выполняется в
определении класса: static тип имяПеременной; Статическая переменная
состояния определяется в файле-реализации класса: тип
имяКласса::имяПеременной;
• Решение второй проблемы – использование статического метода для
выполнения требуемой операции. Объявление статического метода в
определении класса: static тип имяМетода(параметры);
2.Свойство постоянности
• Объекты и переменные, которые после инициализации не должны менять
своего состояния, необходимо объявлять константными: const тип
имяПеременной(параметры);
• Допустимые операции над постоянными объектами – те, которые не
меняют его состояния.
• Объявление метода не меняющим состояния объекта, для которого он
вызван, выполняется в определении класса: тип имяМетода(параметры)
const;. В определении метода также указывается ключевое слово const.
• Пример: объявление цены напитка в постоянной переменной состояния.
• Пример: метод canDrink не должен менять состояние объекта, для
которого вызывается. Поэтому объявляем его постоянным.
3.Встраивание функций и методов
• Проблема эффективности реализации «коротких» методов: canDrink,
getCount и деструктора.
• Решение проблемы без нарушения инкапсуляции – использование
встраиваемых методов.
• Отличие встраиваемых методов от обычных – подстановка тела метода в
точке его вызова.
• Варианты определения метода встраиваемым:
– включение реализации метода в определение класса;
– приведение реализации метода в файле, содержащем определение
класса, со спецификатором inline.
• Недостатки использования встраиваемых методов – объем исполняемой
программы и открытая реализация.
• Рекомендации по использованию: очень короткие и приводить реализацию
вне определения класса. В противном случае смешиваются акценты «что»
делает класс с «как» делает класс.
10)Дружественные функции
• Задача: изымание дохода из автомата.
• Данную операцию можно рассматривать не как запрос к автомату, а как
действие над ним. В этом случае правильный подход – реализация в виде
функции, а не метода класса SlotMachine.
• Проблема: инкапсуляция и необходимость доступа к закрытым членам.
Решение – определение дружественной функции.
• Объявление дружественной функции в определении класса: friend тип
имя(параметры);
• Определение дружественной функции размещается в любом удобном
модуле – обычно в файле-реализации соответствующего класса.
• Дружественная функция является частью интерфейса класса. Поэтому она
не нарушает инкапсуляции. Расширенные права ей делегирует класс, а не его
пользователи.
• Дружественными могут быть целые классы или отдельные методы
классов.
11) Понятие полиморфизма в программировании.Виды полиморфизма
В языке с++.
• Полиморфизм. Одно и тоже имя можно использовать для обозначения
нескольких действий, решающих:
– подобные, но не одинаковые задачи;
– одну задачу разными способами.
• Основной принцип: один интерфейс, множество методов. Выбор
конкретного действия выполняется автоматически одним из двух способов:
– на этапе компиляции (статический полиморфизм)
– на этапе выполнения программы (динамический полиморфизм).
• Проявления полиморфизма в C++: перегрузка функций и методов,
перегрузка операторов, виртуальные методы, шаблоны.
12.13)Иерархические отношения между объектами:обьекты как переменные
состояния.
Иерархические отношения между классами:механизм наследования.
1.Категории иерархических отношений
• Для построения модели, адекватной реальному миру, требуется отражение
отношений, существующими между понятиями реального мира.
• Прагматические мотивы: повторное использование программного кода без
переработки уже существующего, высокоуровневое представление понятий.
• Основные категории иерархических отношений между объектами и
классами: композиция («часть-целое») и наследование свойств.
• Примеры иерархических отношений:
– материнская плата компьютера состоит из набора компонент:
процессор, гнёзда для модулей с оперативной памятью, разъёмы шины
PCI (композиция);
– «книга», «журнал», «газета» являются конкретными видами
абстрактного понятия «печатная продукция».
2.Композиция объектов
• Элементарные понятия – их состояние выражается в виде совокупности
элементарных величин (числа, символы, строки). Пример: «точка на
плоскости».
• Составные понятия – их состояние включает в себя другие объекты.
Пример: «отрезок» как совокупность двух точек.
• Идеи композиции:
– представление сложных понятий в виде совокупности более простых;
– объединение существующих понятий в новую конструкцию.
• В качестве переменной состояния может выступать объект некоторого
класса. Правила объявления и использования объектов-переменных ничем
не отличаются от правил для обычных переменных состояния.
• Синтаксис определения составного класса и определения конструкторов.
• При создании составного объекта сначала вызываются конструкторы
переменных-состояния, а затем конструктор самого составного объекта.
• При уничтожении сначала выполняется деструктор составного объекта, а
затем автоматически вызываются деструкторы его составных частей.
3.Наследование свойств
• Индикатор названия напитка является текстовым индикатором и
отображает текст. Индикаторы исправности и готовности выдачи –
бинарные индикаторы состояния вида «да/нет».
• Модели информационного индикатора и бинарного индикатора состояния
имеют много общего. Они оба являются представителями понятия
«индикатор» и обладают свойствами, присущими всем индикаторам.
• Многие понятия наследуют свойства других понятий. Примеры: медведь
есть млекопитающее, дом есть недвижимость. Пример общих свойств
недвижимости: местоположение, стоимость, владелец, план. Недвижимость
можно продать, сменить владельца, напечатать план.
• Понятие-потомок к свойствам понятия-родителя добавляет свои новые
свойства. Примеры новых свойств дома: жители дома, количество этажей,
количество комнат. В доме можно объединить или разделить комнаты,
выполнить прокладку коммуникаций.
• Каждый вид индикатора добавляет новые свойства – команды управления
и состояние:
– текстовый – задание текста и сам текст;
– бинарный – установка признака «да/нет» и значение признака.
14)Виртуальные методы и позднее связывание.
• Раннее связывание – определение адреса вызываемой функции во время
компиляции программы.
• Позднее связывание – определение адреса вызываемой функции во время
выполнения программы.
• При позднем связывании адрес функции определяется по типу объекта,
для которого осуществляется вызов через указатель.
• Позднее связывание применяется для виртуальных (полиморфных)
методов.
• Синтаксис объявления метода виртуальным: virtual объявлениеМетода;
• Вызов виртуального метода осуществляется несколько медленнее, чем
вызов простого метода.
• Метод должен быть объявлен виртуальным, только если производные
классы реализуют действие базового класса по своему.
• Позднее связывание позволяет корректно выполнять действия с
объектами, тип которых неизвестен на этапе компиляции программы.
• Для индикатора метод control требуется объявить виртуальным.
15)Понятие абстрактного класса.
• В реальном мире экземпляров типа «Индикатор» в чистом виде не
существует. Существуют текстовые индикаторы, световые и проч.
Аналогично с понятием «Печатная продукция» – реально существуют книги,
журналы, газеты и т. д.
• Понятия «Печатная продукция» и «Индикатор» – абстрактные понятия.
• Для выражения данного свойства в ООП используют абстрактные
классы.
• Нельзя создавать объекты абстрактного класса.
Пример абстрактного класса
• В реальном мире экземпляров типа «Индикатор» в чистом виде не
существует. «Индикатор» является абстрактным понятием.
• Абстрактная операция – отображение состояния.
• В базовом классе Viewer метод control – чисто виртуальный.
• Реализация метода Viewer::control не приводится.
class Viewer {
//...
private:
virtual void control(std::ostream& os) =0;
//...
};
16) Использование потокового ввода-вывода.
1.Введение в потоковый ввод-вывод
• Стандартная библиотека содержит удобные объектно-ориентированные
средства ввода-вывода.
• Ввод-вывод организован посредством потоков – логических устройств,
выдающих и принимающих пользовательскую информацию.
• В распоряжение предоставляется единый удобный интерфейс работы с
потоками. Это обеспечивается использованием наследования и
динамического полиморфизма.
• Предопределённые потоки: cin, cout, cerr, clog.
• Базовый класс: ios. Производные: iostream (поток для ввода и вывода),
istream (поток ввода), ostream (поток вывода).
• Операции ввода-вывода реализуются через перегруженные операторы >>
(ввод) и << (вывод).
• Чтение всей строки целиком из потока выполняется функцией getline.
• Пример построчного чтения.
//считывание всей строки
#include
int main()
{
std::string line;
std::getline(std::cin,line);
std::cout << line.length() << std::endl;
return 0;
}
2.Средства форматирования
• Потоки ввода-вывода позволяют форматировать данные и изменять
параметры ввода.
• Управление форматированием информации может осуществляться с
помощью флагов формата.
• Примеры флагов: left (right), dec (oct, hex), scientific (fixed), boolalpha.
Флаги определены внутри класса ios. Доступ к ним через оператор
расширения области видимости ::
• Управление установкой флагов выполняется через методы потоков: setf,
unsetf, flags.
unsigned value;
cin >> value;
cout.unsetf(ios::dec);
cout.setf(ios::hex);
cout << value << endl;
cout.setf(ios::boolalpha);
cout << true << ' ' << false << endl;
• Управление шириной поля (метод width), точностью для чисел с
плавающей точкой (метод precision) и символом-заполнителем (метод fill).
• Управление форматированием информации может осуществляться с
помощью манипуляторов. Манипулятор – специальная функция, которая
может располагаться внутри инструкций ввода/вывода.
• Некоторые манипуляторы могут иметь параметры. Для их использования
необходимо подключить
• Примеры манипуляторов: left (right), dec (oct, hex), setw(int w), scientific
(fixed), boolalpha (noboolalpha).
#include
//...
unsigned value;
cin >> value;
cout.fill('0');
cout << setw(8) << hex << value << endl;
cout.precision(4);
cout << 123.45 << endl;
3.Файловый ввод-вывод
• Всё что применимо к консольному вводу-выводу, справедливо и для
файлового. Это достигается наследованием.
• Классы: fstream (поток для ввода и вывода), ifstream (поток ввода),
ofstream (поток вывода).
• Открытие файла: через конструктор или методом