
- •Билет 1
- •3. Замещение методов и принцип подстановки.
- •Билет 2
- •1. Принцип Чёрча. Гипотеза Ворфа. Гипотеза Сапира-Ворфа. Формальные модели вычислений (модели Чёрча, Поста, Маркова, Тьюринга, Клини и другие).
- •2. Итераторы. Объекты-функции. Будущее ооп.
- •Билет 5
- •Билет 8
- •Понятие полиморфной переменной
- •3. Формы наследования. Порождение подкласса для комбинирования.
- •Формы наследования
- •Билет 19
- •Билет 20
- •Билет 21
- •Билет 22
- •3. Программные компоненты. Их разновидность. Основная целевая направленность.
- •Билет 23
- •1. Восстановление памяти. Указатели. Эффективное средство работы с динамической информации. Создание неизменяемого экземпляра объекта.
- •Билет 25
- •1. Наследование и принцип подстановки. Отношения: быть экземпляром и включать как часть.
- •Билет 26
- •3. Издержки наследования.
- •Билет 27
- •1. Противопоставление композиции и наследование. Преимущества и недостатки двух подходов.
- •Билет 28
- •Билет 29
- •Билет 30
- •3. Интерфейс и реализация.
Билет 8
1. Барьер сложности. Нелинейное увеличение сложности. Механизмы абстрагирования.
По мере того как программные проекты становились все сложнее, было замечено интересное явление. Задача, для решения которой одному программисту требовалось два месяца, не решалась двумя программистами за месяц. Согласно замечательной фразе Фреда Брукса, "рождение ребенка занимает девять месяцев независимо от того, сколько женщин занято этим" [Brooks 1975].
Причиной такого нелинейного поведения является сложность. В частности, взаимосвязи между программными компонентами стали сложнее, и разработчики вынуждены были постоянно обмениваться между собой значительными объемами информации. Брукс также сказал:
Поскольку конструирование программного обеспечения по своей внутренней природе есть задача системная (требует сложного взаимодействия участников), то расходы на обмен данными велики. Они быстро становятся доминирующими и нивелируют уменьшение индивидуальных затрат, достигаемое за счет разбиения задачи на фрагменты. Добавление новых людей удлиняет, а не сокращает расписание работ.
Абстрагирование от программы к схеме программ может привести к лучшему пониманию программистских средств, поскольку оно позволяет полностью отделить вычисляемые значения от структуры данных и механизма управления, применяемых в программе. Например, мы определяем схемы, использующие массивы индексированных переменных; в этих схемах механизм индексирования полностью отделен от вычисляемых значений. А именно, ни один индекс нельзя взять в качестве аргумента базисной функции и ни одно базисное значение нельзя взять в качестве индекса.
2. Полиморфизм в С++. Полиморфные переменные. Виртуальное и невиртуальное переопределение. Параметрическая перегрузка. Отложенные методы в С++. Обобщенные функции и шаблоны.
В языках программирования и теории типов полиморфизмом называется единообразная обработка разнотипных данных.
Понятие полиморфной переменной
Одной из наиболее интересных особенностей объектно-ориентированных языков программирования является тот факт, что фактический тип переменной может не совпадать с типом, заявленным при ее описании.
Полиморфная переменная не только хранит данные фактического типа, но и позволяет использовать методы фактического типа.
Для обозначения типа, присвоенного переменной при ее описании, будем использовать термин «статический тип»
Термин «динамический тип» характеризует тип фактического значения.
Переменная, для которой динамический тип не совпадает (точнее, может не совпадать) со статическим, называется полиморфной.
Параметрическая перегрузка
Язык C++ позволяет нескольким функциям иметь одно имя внутри любого контекста до тех пор, пока списки аргументов функций различаются в достаточной степени, чтобы компилятор недвусмысленно определял, какую именно функцию намереваются вызвать. Такая ситуация, как правило, возникает при использовании нескольких конструкторов для
Отложенный метод (иногда называемый абстрактным методом, а в C++═≈ чисто виртуальным методом) может рассматриваться как обобщение переопределения. В обоих случаях поведение родительского класса изменяется для потомка. Для отложенного метода, однако, поведение просто не определено. Любая полезная деятельность задается в дочернем классе.
Одно из преимуществ отложенных методов является чисто концептуальным: программист может мысленно наделить нужным действием абстракцию сколь угодно высокого уровня. Например, для геометрических фигур мы можем определить метод draw, который их рисует: треугольник Triangle, окружность Circle и квадрат Square. Мы определим аналогичный метод и для родительского класса Shape. Однако такой метод на самом деле не может выполнять полезную работу, поскольку в классе Shape просто нет достаточной информации для рисования чего бы то ни было. Тем не менее присутствие метода draw позволяет связать функциональность (рисование) только один раз с классом Shape, а не вводить три независимые концепции для подклассов Square, Triangle и Circle.
Обобщённое программирование (англ. generic programming) — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными языками программирования. Возможности обобщённого программирования впервые появились в виде дженериков (обобщённых функций) в 1970-х годах в языках Клу и Ада, затем в виде параметрического полиморфизма в ML и его потомках, а затем во многих объектно-ориентированных языках, таких как C++, Java, Object Pascal[1],D, Eiffel, языках для платформы .NET и других.
Шабло́н в языках программирования — спецификация формы представления и правил редактирования элемента данных с помощью строки символов, в которой каждый символ указывает на допустимый вид символа или на подлежащее выполнению редактирование для соответствующей позиции значения элемента.
3. Формы наследования. Порождение подтипов.
Формы наследования
В подклассе структура и поведение исходного суперкласса могут дополняться, переопределяться или ограничиваться
Исходя из этого, можно выделить различные формы наследования:
Специализация
Спецификация
Обобщение
Расширение
Ограничение
Конструирование
Варьирование
Комбинирование
Билет 9
1. Объекты: сообщения, наследование и полиморфизм. Их структурная связь в ООП.
2. Обобщенные функции и шаблоны.
3. Формы наследования. Порождение подклассов для специализации.
Формы наследования
В подклассе структура и поведение исходного суперкласса могут дополняться, переопределяться или ограничиваться
Исходя из этого, можно выделить различные формы наследования:
Специализация
Спецификация
Обобщение
Расширение
Ограничение
Конструирование
Варьирование
Комбинирование
Билет 10
1. Многократно используемое ПО. Первый принцип действия в ООП (способ задания действий). Принцип маскировки информации. Отличия пересылки сообщений от обычного вызова процедур. Позднее и раннее связывание.
2. Параметрическая перегрузка.
3. Формы наследования. Порождение подкласса с целью конструирования.
Формы наследования
В подклассе структура и поведение исходного суперкласса могут дополняться, переопределяться или ограничиваться
Исходя из этого, можно выделить различные формы наследования:
Специализация
Спецификация
Обобщение
Расширение
Ограничение
Конструирование
Варьирование
Комбинирование
Билет 11
1. Фундаментальная концепция: обязанности и ответственности (приведите пример). Классы и экземпляры. Второй принцип ООП (обобщение как операция). Принцип наследования (движение от более общей категории к более узкой).
2. Полиморфизм и полиморфные переменные.
3. Формы наследования. Порождение подкласса для обобщения.
Формы наследования
В подклассе структура и поведение исходного суперкласса могут дополняться, переопределяться или ограничиваться
Исходя из этого, можно выделить различные формы наследования:
Специализация
Спецификация
Обобщение
Расширение
Ограничение
Конструирование
Варьирование
Комбинирование
Билет 12
1. Дочерние и родительские классы. Абстрактный родительский класс. Механизм поиска метода для получателя.
2. Выделение памяти. Размещение минимальной статической памяти. Размещение максимальной статической памяти. Динамическое выделение памяти.
3. Формы наследования. Порождение подкласса для ограничения.
Формы наследования
В подклассе структура и поведение исходного суперкласса могут дополняться, переопределяться или ограничиваться
Исходя из этого, можно выделить различные формы наследования:
Специализация
Спецификация
Обобщение
Расширение
Ограничение
Конструирование
Варьирование
Комбинирование
Билет 13
1. Преимущества ООП. Барьер сложности при разработке программы. Механизмы абстрагирования. ООП как эволюционный и революционный подходы.
Преимущества.
классы представляют собой весьма удобный инструмент.
-Классы позволяют проводить конструирование из полезных компонент, обладающих простыми инструментами, что дает возможность абстрагироваться от деталей реализации.
-Данные и операции вместе образуют определенную сущность и они не «размазываются» по всей программе, как это нередко бывает в случае процедурного программирования.
-Локализация кода и данных улучшает наглядность и удобство сопровождения программного обеспечения.
-Инкапсуляция информации защищает наиболее критичные данные от несанкционированного доступа.
Абстрагирование от программы к схеме программ может привести к лучшему пониманию программистских средств, поскольку оно позволяет полностью отделить вычисляемые значения от структуры данных и механизма управления, применяемых в программе. Например, мы определяем схемы, использующие массивы индексированных переменных; в этих схемах механизм индексирования полностью отделен от вычисляемых значений. А именно, ни один индекс нельзя взять в качестве аргумента базисной функции и ни одно базисное значение нельзя взять в качестве индекса.
2. Двусмысленность имён. Наследование через общих предков.
3. Формы наследования. Порождение подкласса для расширения.
Формы наследования
В подклассе структура и поведение исходного суперкласса могут дополняться, переопределяться или ограничиваться
Исходя из этого, можно выделить различные формы наследования:
Специализация
Спецификация
Обобщение
Расширение
Ограничение
Конструирование
Варьирование
Комбинирование
Билет 14
1. Процедуры и функции. Понятия области видимости. Понятие модуля. Два принципа правильного использования модулей.
Фу́нкция в программировании — поименованный фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. С именем функции неразрывно связан адрес первой инструкции (оператора), входящей в функцию, которой передаётся управление при обращении к функции.
Подпрограмма(процедура) (англ. subroutine) — поименованная или иным образом идентифицированная часть компьютерной программы, содержащая описание определённого набора действий. Подпрограмма может быть многократно вызвана из разных частей программы. В языках программирования для оформления и использования подпрограмм существуют специальные синтаксические средства.
В программировании, область видимости (англ. scope) обозначает область программы, в пределах которой идентификатор (имя) некоторой переменной продолжает быть связанным с этой переменной и возвращать её значение. За пределами области видимости тот же самый идентификатор может быть связан с другой переменной, либо быть свободным (не связанным ни с какой из них).
Модуль — функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной её части (например, Активный Оберон), предназначенный для использования в других программах. Модули позволяют разбивать сложные задачи на более мелкие в соответствии с принципом модульности.
1 - Модульное программирование может быть осуществлено, даже когда синтаксис языка программирования не поддерживает явное задание имён модулям.
2 - Программные инструменты могут создавать модули исходного кода, представленные как части групп — компонентов библиотек, которые составляются с программойкомпоновщиком.
2. Отложенные(абстрактные) методы. Чисто виртуальные методы в С++.
Абстра́ктный ме́тод (или чистый виртуальный метод (pure virtual method - часто неверно переводится как чисто виртуальный метод)) — в объектно-ориентированном программировании, метод класса, реализация для которого отсутствует. Класс, содержащий абстрактные методы, также принято называтьабстрактным (там же и пример). Абстрактные методы зачастую путают с виртуальными. Абстрактный метод подлежит определению в классах-наследниках, поэтому его можно отнести к виртуальным, но не каждый виртуальный метод является абстрактным.
Виртуальный метод (виртуальная функция) — в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён вклассах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.
3. Формы наследования. Порождение подкласса для ограничения.
Формы наследования
В подклассе структура и поведение исходного суперкласса могут дополняться, переопределяться или ограничиваться
Исходя из этого, можно выделить различные формы наследования:
Специализация
Спецификация
Обобщение
Расширение
Ограничение
Конструирование
Варьирование
Комбинирование
Билет 15
1. Абстрактные типы данных (АТД). Отличия модуля и АТД. Понятие объект и его основные свойства. Понятие полиморфизма.
Абстра́ктный тип да́нных (АТД) — это тип данных, который предоставляет для работы с элементами этого типа определённый набор функций, а также возможность создавать элементы этого типа при помощи специальных функций. Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции. Абстрактный тип данных определяет набор функций, независимых от конкретной реализации типа, для оперирования его значениями. Конкретные реализации АТД называются структурами данных.
Объект в программировании — некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов)[1]. Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или несколькимклассам, которые определяют поведение (являются моделью) объекта.
В языках программирования и теории типов полиморфизмом называется единообразная обработка разнотипных данных.
2. Переопределение методов как механизм уточнения и замещения.
Переопределение метода (англ. Method overriding) в объектно-ориентированном программировании — одна из возможностей языка программирования, позволяющаяподклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет (заменяет) его реализацию в суперклассе, описывая метод с тем же названием, что и у метода суперкласса, а также у нового метода подкласса должны быть те же параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса.
3. Формы наследования. Порождение подкласса для варьирования.
Формы наследования
В подклассе структура и поведение исходного суперкласса могут дополняться, переопределяться или ограничиваться
Исходя из этого, можно выделить различные формы наследования:
Специализация
Спецификация
Обобщение
Расширение
Ограничение
Конструирование
Варьирование
Комбинирование
Билет 16
1. Многократно используемое ПО. Итоговая концепция ООП (его основные положения).
2. Перегрузка. Перегрузка и приведение типа. Пе6регрузка не подразумевает сходство.
Перегрузка операторов — в программировании — один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.
Термин перегрузка — это калька английского слова overloading. Такой перевод появился в книгах по языкам программирования в первой половине 1990-х годов. В изданиях советского периода аналогичные механизмы назывались переопределением или повторным определением, перекрытием операций.
// общая форма перегрузки унарного оператора.
public static возвращаемый тип operator op (тип_параметра операнд)
{
// операции
}
// Общая форма перегрузки бинарного оператора.
public static возвращаемый_тип operator op (тип_параметра1 операнд1,
тип_параметра2 операнд2)
{
// операции
}