
- •1. Жизненный цикл программной системы.
- •2. Классический подход к созданию программных систем.
- •3. Понятия связности модулей и сцепления модулей.
- •4. Структурное программирование.
- •Структурное тестирование программного обеспечения
- •1. Связь процессов тестирования и процессов проектирования.
- •2. Уровни тестирования и виды тестирования.
- •3. Стратегия тестирования.
- •4. Тестирование программного модуля.
- •5. Восходящее и нисходящее тестирование.
- •6. Методы тестирования: модифицированный нисходящий, монолитный, сандвич, модифицированный сандвич.
- •7. Системное тестирование: метод функциональных диаграмм.
- •Объектно-ориентированный подход к разработке по
- •1. Абстрагирование и инкапсуляция
- •2. Модульность программных систем
- •3. Виды иерархий в программных системах.
- •4. Понятие объекта. Состояние, поведение и индивидуальность объекта.
- •5. Отношение между объектами: использование, включение.
- •6. Отношение простого наследования классов.
- •7. Добавление, замещение и уточнение методов класса при наследовании.
- •8. Отношение ассоциации между классами, включая агрегацию.
- •9. Отношение зависимости между классами, отношение реализации.
- •Шаблоны проектирования
- •1. Шаблон «Одиночка» Singleton
- •2. Шаблон «Абстрактная фабрика» Abstract Factory
- •3. Шаблон «Декоратор» Decorator
- •4. Шаблон «Стратегии» Strategy
- •5. Компоновщик.
- •6. Шаблон «Наблюдатель» Observer
- •7. Архитектурные шаблоны. Унифицированный процесс разработки по (rup)
- •1. Основные черты. Фазы и основные потоки работ.
- •2. Документ «Видения». Модель и словарь предметной области.
- •3. Функциональные и нефункциональные требования к системе. Варианты использования системы.
- •4. Прецеденты и отношения между прецедентами.
- •5. Модель анализа и классы анализа.
- •6. Архитектурное представление.
7. Добавление, замещение и уточнение методов класса при наследовании.
Класс - это некое множество объектов, имеющих общую структуру и общее поведение.
Класс - описание структуры и поведения объектов, связанных отношением общности.
Наследование - это такое отношение между классами, когда один класс повторяет структуру и поведение другого класса (одиночное наследование) или других (множественное наследование) классов.
Классы, экземпляры которых не создаются, называются абстрактными. Ожидается, что подклассы абстрактных классов доопределят их до жизнеспособной абстракции, наполняя класс содержанием.
Самый общий класс в иерархии классов называется базовым (суперклассом, родительским). В большинстве приложений базовых классов бывает несколько, и они отражают наиболее общие абстракции предметной области.
Наследование можно рассматривать, как способ управления повторным использованием программ, то есть, как простое решение разработчика о заимствовании полезного кода. В этом случае механика наследования должна быть гибкой и легко перестраиваемой. Другая точка зрения: наследование отражает принципиальную родственность абстракций, которую невозможно отменить. Подкласс обычно расширяет или ограничивает существующую структуру и поведение своего суперкласса.
В производном классе можно добавлять свои поля – члены класса. Необходимо использовать имена, отличные от имен атрибутов суперкласса.
В производном классе можно добавлять свои методы – члены класса. Необходимо использовать имена, отличные от имен методов суперкласса, или использовать другой набор входных/выходных параметров.
В производном классе можно переопределять методы базового класса (сохраняя точное совпадение с исходным прототипом, то есть количество и типы аргументов и возвращаемый тип). Исключение: если возвращаемый тип является указателем или ссылкой на базовый класс, он может быть заменен указателем или ссылкой на порождаемый класс.
Если в классе-наследнике имя метода и его прототип совпадают с именем метода базового класса, то метод производного класса скрывает (замещает) метод базового класса. Чтобы получить из подкласса доступ к методу суперкласса, используется оператор :: (разыменования).
Уточнение – уточняющий метод выполняет метод суперкласса и добавляет некоторые действия.
Когда в суперклассе определен виртуальный метод, который затем переопределяется в классах-потоках, возникает неоднозначность вызова метода.
Существует два способа связывания (замещения) вызывающего и вызываемого методов:
Невиртуальное замещение – адрес методов определяется на момент трансляции кода.
Вызов методов объекта происходит в соответствии с типом указателя, а не фактическим типом объекта, на который он ссылается (раннее связывание).
Достоинства: скорость и эффективность.
Виртуальное замещение - адрес методов определяется на момент выполнения кода (позднее связывание).
Достоинство: универсальность.
Для определения типа объекта по указателю или ссылке во время выполнения программы в С++ используется динамическая идентификация типа данных (RTTI) (операторы dynamic_cast и typeid).
Механизм позднего связывания: когда разрешение ссылок на метод происходит на этапе выполнения программы в зависимости от конкретного типа объекта, вызвавшего метод. Адрес метода для определенного типа объекта выбирается из таблицы виртуальных методов (координирующей таблицы) - механизм динамического соответствия, используемый во многих языках программирования.
Обычно компилятор создает отдельную vtable для каждого класса. После создания объекта указатель на эту vtable, называемый виртуальный табличный указатель или vpointer, добавляется как скрытый член данного объекта. Компилятор также генерирует «скрытый» код в конструкторе каждого класса для инициализации vpointer'ов его объектов адресами соответствующей vtable.