Files
obsidian-life/Объектно-ориентированное программирование. Экзамен.md
Aleksandr Ebaklakov 011626b8b7 Initial commit
2026-04-22 16:58:43 +03:00

250 lines
36 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- универ
---
# Вопросы
## 1. Какова основа системы управляемой событиями
Основа такой системы — **ожидание и реакция**. В отличие от линейных программ, которые выполняются от начала до конца, событийно-ориентированная программа находится в цикле ожидания.
- **Событие** — это сигнал от системы (нажатие клавиши, движение мыши, таймер), на который программа должна отреагировать.
- Программа не диктует пользователю, что делать, а «слушает» его действия.
## 2. Схема взаимодействия приложения и пользователя для системы управляемой событиями
Взаимодействие строится через посредника — Операционную Систему (ОС):
1. **Пользователь** совершает действие (клик).
2. **ОС** перехватывает это действие и превращает его в **сообщение**.
3. **ОС** помещает сообщение в **очередь сообщений** конкретного приложения.
4. **Приложение** извлекает сообщение и выполняет соответствующий код.
## 3. Что такое сообщение и его роль в интерфейсе Windows. Схема обработки сообщения в приложении
**Сообщение** — это структура данных, содержащая информацию о том, что произошло (код события, координаты мыши, время и дескриптор окна).
- **Роль:** Это универсальный язык общения между ОС и программами.
- **Схема обработки:** `Цикл выборки сообщений (GetMessage) -> Трансляция (TranslateMessage) -> Отправка в оконную процедуру (DispatchMessage)`.
## 4. Что такое обработчик сообщений и его роль в программе. Почему программа для Windows называется приложением.
- **Обработчик сообщений** — это функция (метод), которая содержит логику реакции на конкретное событие (например, `OnClick`).
- **Термин «Приложение»:** Программы для Windows называют приложениями (Applications), потому что они не работают изолированно. Они «прикладываются» к программной среде ОС, разделяя с ней ресурсы и подчиняясь её правилам управления интерфейсом.
## 5. Основной принцип организации приложения с GUI
Главный принцип — **интерактивность и визуализация**. Программа строится как набор графических объектов (компонентов/контролов), каждый из которых обладает своими свойствами, методами и событиями. Управление передается от одного объекта к другому на основе действий пользователя.
## 6. Виды окон и их назначение. Что такое дочернее, перекрывающееся и модальное окно.
- **Дочернее окно (Child):** Всегда находится внутри родительского окна и перемещается вместе с ним (например, кнопка или текстовое поле).
- **Перекрывающееся окно (Overlapped):** Основное окно программы с заголовком и рамкой.
- **Модальное окно:** Окно, которое блокирует работу с родительским окном, пока пользователь его не закроет (например, окно «Сохранить файл» или ошибка).
## 7. Какова структура программы на базе WinForms?
Программа WinForms обычно состоит из трех частей:
1. **Класс формы (`Form1.cs`):** Логика обработки событий.
2. **Дизайнер (`Form1.Designer.cs`):** Автоматически созданный код инициализации компонентов (кнопки, поля).
3. **Точка входа (`Program.cs`):** Метод `Main`, который запускает цикл обработки сообщений через `Application.Run()`.
## 8. Что такое недействительная область окна? Где в программе должен быть сосредоточен графический вывод, почему?
- **Недействительная область:** Часть окна, которую нужно перерисовать (например, если её перекрывало другое окно, а потом оно исчезло).
- **Центр вывода:** Весь графический код должен быть в обработчике события **Paint** (или `OnPaint`).
- **Почему?** Потому что ОС может потребовать перерисовку окна в любой момент. Если рисовать в другом месте, изображение исчезнет при первом же сворачивании окна.
## 9. В чем состоит принцип разделения логики и интерфейса программы( паттерн MVC). Причины и смысл
**MVC (Model-View-Controller)** разделяет программу на три части:
- **Model (Модель):** Чистые данные и бизнес-логика (не знает об интерфейсе).
- **View (Представление):** То, что видит пользователь (кнопки, графики).
- **Controller (Контроллер):** Связующее звено, обрабатывает ввод пользователя и обновляет Модель.
- **Смысл:** Упрощение тестирования, возможность менять дизайн без переписывания логики и повторное использование кода.
## 10. Описать структуру платформы .Net и назначение её элементов
Платформа .NET состоит из:
1. **CLR (Common Language Runtime):** Среда выполнения («движок»), отвечает за память, безопасность и выполнение кода.
2. **FCL (Framework Class Library):** Огромная библиотека готовых классов (работа с файлами, сетью, БД, GUI).
3. **Компиляторы:** Переводят код (C#, VB.NET) в промежуточный язык **IL (Intermediate Language)**.
4. **JIT-компилятор (Just-In-Time):** В момент запуска программы превращает IL-код в машинный код конкретного процессора.
## 11. В чем особенности и основные свойства платформы .Net
**Особенности:** Кроссплатформенность (через .NET Core/5+), многоязычность (C#, F#, VB.NET работают вместе) и автоматическое управление памятью. **Свойства:**
- **Управляемый код:** выполняется под контролем среды CLR.
- **Библиотека классов (BCL):** огромный набор готовых функций.
- **JIT-компиляция:** превращение кода в машинный во время запуска.
> **Пример:** Программа, написанная на C#, может использовать библиотеку, написанную на F#, так как они оба компилируются в единый промежуточный язык.
## 12. Причины появления платформы .Net и что она значит для разработчиков
**Причины:** Сложность разработки под Windows (COM, Win32 API), проблемы "Hell DLL" (конфликты версий) и необходимость в единой среде, которая бы конкурировала с Java. **Значение:** Разработчики получили единую экосистему, где не нужно вручную следить за памятью и можно легко переносить код между разными типами приложений (web, desktop, mobile).
## 13. Описать процесс компиляции и исполнения программы .Net
Процесс проходит в два этапа:
1. **Compile time:** Исходный код (C#) компилируется в **CIL** (Common Intermediate Language) и упаковывается в сборку (`.exe` или `.dll`).
2. **Runtime:** Среда **CLR** (Common Language Runtime) загружает код, а **JIT-компилятор** превращает CIL в машинные инструкции конкретного процессора.
## 14. Дать определения ссылочным типам и типам значениям яз. С#
- **Типы-значения (Value Types):** Хранят данные непосредственно в памяти. Обычно живут в **стеке**. При передаче — копируются. (Числа, логические значения, структуры).
- **Ссылочные типы (Reference Types):** Хранят ссылку на адрес в памяти, где лежат данные. Сами данные живут в **куче (heap)**. (Классы, интерфейсы, строки).
## 15. Как различаются способы работы с  объектами типа значения и ссылки. Примеры
- **Value types:** Быстрый доступ, копируется все значение.
- **Reference types:** Доступ через указатель, копируется только ссылка, а объект остается один.
> **Пример:** Если `struct Point { int x; }` присвоить `p1 = p2`, изменив `p1.x`, `p2.x` **не изменится**. Если это будет `class`, то изменятся оба, так как они указывают на один объект.
## 16. Что означают понятия boxing и unboxing
- **Boxing (Упаковка):** Преобразование типа-значения в тип `object` (копирование из стека в кучу).
- **Unboxing (Распаковка):** Обратное извлечение значения из объекта в тип-значение.
> **Пример:** `int i = 10; object obj = i; (boxing)`. `int j = (int)obj; (unboxing)`. Операции ресурсоемкие, их стоит избегать в циклах.
## 17. Пример считывания и записи из/в файл в текстовом режиме. Что такое оператор using и для чего он используется.
**Оператор `using`** гарантирует, что объект, реализующий `IDisposable` (например, файловый поток), будет корректно закрыт и освобожден сразу после выхода из блока, даже если возникла ошибка.
> **Пример:**
```c#
using (StreamWriter sw = new StreamWriter("test.txt")) {
sw.WriteLine("Hello World");
} // Здесь файл закроется автоматически
```
## 18. Когда уничтожается динамический объект в программе на яз. С#
Динамический объект (созданный через `new`) уничтожается не сразу, а когда на него **перестают существовать ссылки**, и **Сборщик мусора (Garbage Collector, GC)** решит запустить очистку (обычно при нехватке памяти).
## 19. Что такое контейнер? Что такое абстрактная структура данных?
- **Контейнер:** Это конкретный класс (коллекция), который позволяет хранить объекты и управлять ими (List, Dictionary).
- **АСД:** Это теоретическая модель данных и набор операций над ними (Очередь, Стек, Граф), не зависящая от реализации в коде.
> **Пример:** АСД "Очередь" может быть реализована контейнером `Queue<T>`.
## 20. Опишите основные скоростные характеристики массива, когда его стоит применять и почему? Какой тип C# ему соответствует?
- **Скорость:** Чтение/запись по индексу — мгновенно ($O(1)$). Поиск или вставка в середину — медленно ($O(n)$).
- **Когда применять:** Когда известно точное количество элементов и нужен максимально быстрый доступ.
- **Тип в C#:** Соответствует системному типу `System.Array`.
> **Пример:** `List<int> numbers = new List<int>;`
## 21. Опишите основные характеристики линейного списка, когда его стоит применять и почему? Какой тип C# ему соответствует?
**Характеристики:** Элементы не лежат в памяти подряд, а связаны ссылками (каждый узел знает о следующем).
- **Применять, когда:** Нужно часто вставлять или удалять элементы из середины/начала списка.
- **Почему:** В отличие от массива, здесь не нужно сдвигать остальные элементы, достаточно перекинуть ссылки ($O(1)$).
- **Тип в C#:** `LinkedList<T>`.
## 22. Опишите основные характеристики бинарного дерева, когда его стоит применять и почему? Какой тип C# ему соответствует?
**Характеристики:** Иерархическая структура, где у каждого узла не более двух потомков. В дереве поиска (BST) левый потомок меньше родителя, правый — больше.
- **Применять, когда:** Нужен быстрый поиск, вставка и удаление в динамическом наборе данных.
- **Почему:** Позволяет выполнять операции за логарифмическое время ($O(\log n)$).
- **Тип в C#:** `SortedSet<T>` или `SortedDictionary<K, V>` (внутри используют красно-черные деревья).
## 23. Что такое ассоциативный массив? На каких механизмах он строится? Какой тип C# ему соответствует?
**Определение:** Структура данных, хранящая пары «ключ — значение», где каждый ключ уникален.
- **Механизмы:** Чаще всего строится на **хэш-таблицах** или сбалансированных деревьях.
- **Тип в C#:** `Dictionary<TKey, TValue>`.
## 24. Опишите основные характеристики хэш-таблицы? Как формируется хэш? Где применяется. Какой тип C# ему соответствует?
**Характеристики:** Позволяет получать доступ к значению по ключу практически мгновенно.
- **Хэш:** Формируется хэш-функцией, которая преобразует ключ в числовой индекс массива.
- **Применение:** Словари, кэширование, базы данных.
- **Тип в C#:** `Hashtable` (устаревший) или `Dictionary<K, V>`.
## 25. Причины появления новых технологий программирования
Основные факторы:
1. **Рост сложности ПО:** Старые методы не справлялись с миллионами строк кода.
2. **Кризис ПО:** Стоимость поддержки кода превышала стоимость разработки.
3. **Развитие железа:** Появление многоядерных процессоров и больших объемов памяти потребовало новых абстракций (параллелизм, управляемая память).
## 26. Что означает структурное программирование. Основная идея и используемые принципы
**Идея:** Программа должна состоять из четких логических блоков. Отказ от бесконтрольных переходов (`goto`). **Принципы:**
1. **Следование** (выполнение шагов друг за другом).
2. **Ветвление** (`if/else`).
3. **Цикл** (`while/for`).
> **Пример:** Любая функция на C#, использующая только циклы и условия без оператора `goto`.
## 27. Описать методику решения задач «сверху вниз»
Это процесс декомпозиции: общая задача разбивается на крупные подзадачи, те — на еще более мелкие, пока мы не дойдем до простых функций.
> **Пример:** Сначала пишем каркас метода `Main`, вызывающий пустые функции `Input()`, `Process()`, `Output()`, а затем реализуем каждую из них.
## 28. Описать основные свойства структурного анализа (что дает его использование). Его основные этапы.
**Что дает:** Позволяет создать логическую модель системы до написания кода, выделяя функции и потоки данных. **Этапы:**
1. Определение требований.
2. Построение диаграмм потоков данных (DFD).
3. Создание словаря данных.
4. Описание спецификаций процессов.
## 29. В чем состоит принцип единственной ответственности для функции
Функция должна решать **только одну** задачу.
- **Зачем:** Такой код легче тестировать, понимать и переиспользовать.
> **Пример:** Плохо: функция `SaveAndPrintReport()`. Хорошо: две функции `SaveReport()` и `PrintReport()`.
## 30. Предпосылки появления объектно-ориентированной технологии
- **Необходимость моделирования реального мира:** В структурном стиле данные и функции разделены, а в ООП они объединены в объект (как в жизни).
- **Повторное использование кода:** Наследование и полиморфизм позволяют не писать одно и то же дважды.
- **Инкапсуляция:** Нужно было скрыть внутреннюю сложность объектов, чтобы защитить данные от случайного изменения извне.
## 31. Что такое предметная область? Что такое объект  и его класс(общее определение)
- **Предметная область:** Часть реального мира, которую мы моделируем в программе (например, «Банковская система»).
- **Класс:** Набор сущностей, имеющих одинаковые характеристики и поведение в рамках заданной задачи.
- **Объект:** Сущность, имеющая определенные характеристики и поведение в рамках заданной задачи.
> **Пример:** Класс — `Car` (автомобиль вообще), объект — `myRedTesla` (конкретная машина с госномером).
## 32. В чем отличие класса и структуры языка C#
1. **Тип данных:** Класс — ссылочный (`reference type`), структура — тип-значение (`value type`).
2. **Память:** Объекты классов живут в куче (heap), структуры — в стеке (stack).
3. **Наследование:** Классы поддерживают полное наследование, структуры — нет (только реализацию интерфейсов).
> **Пример:** Используйте `struct` для мелких данных (точка `Point`, цвет `Color`), а `class` для сложных сущностей (пользователь `User`).
## 33. Основная идея ОО подхода к решению задач
**Основная идея:** Сформировать решение задачи из объектов с минимальными взаимодействиями. Решение задачи описывается с помощью взаимодействия сущностей (объектов), принадлежащих определенным классам.
## 34. Что определяют обязанности класса. Описать принцип сбалансированности.
- **Обязанности:** Совокупность знаний класса (что он знает о себе) и его действий (что он умеет делать).
- **Принцип сбалансированности:** Обязанности должны быть распределены между классами равномерно. Не должно быть классов-«богов» (которые делают всё) и классов-«бездельников» (которые только хранят данные, не имея логики).
## 35. Понятие  пассивных и активных классов объектов
- **Пассивные:** Ждут вызова своего метода. Выполняются в потоке управления того объекта, который их вызвал.
- **Активные:** Имеют собственный поток управления (процесс/thread). Они «живут» сами по себе и могут выполнять действия параллельно с другими.
> **Пример:** Пассивный — `List<int>`. Активный — `BackgroundWorker` или класс, управляющий сетевым соединением в реальном времени.
## 36. Что такое вариант использования и как он используется при анализе задачи
**Определение:** Сценарий взаимодействия пользователя (актора) с системой для достижения конкретной цели. **Использование:** При анализе они помогают определить границы системы и выделить функции, которые действительно нужны пользователю.
> **Пример:** «Снятие наличных» — это Use Case для банкомата.
## 37. Откуда берутся классы при объектно-ориентированном анализе задачи.
Классы не выдумываются случайно, их ищут в:
1. **Существительных** из текста технического задания (ТЗ).
2. Физических предметах предметной области.
3. Ролях (Клиент, Администратор).
4. Событиях (Заказ, Транзакция).
## 38. В чем состоит принцип единственной ответственности для классов?
Класс должен иметь **только одну причину для изменения**. Это значит, что он должен отвечать за одну узкую функциональность системы.
> **Пример:** Если класс `Invoice` (Счет) умеет и рассчитывать сумму, и сохранять себя в базу данных, это нарушение. За БД должен отвечать отдельный класс `InvoiceRepository`.
## 39. Этапы объектно-ориентированного анализа задачи. Их результаты и взаимосвязь.
- **Поиск кандидатов в классы:** Составление списка сущностей.
- **Определение связей:** Кто с кем взаимодействует (ассоциация, наследование).
- **Определение атрибутов и операций:** Что каждый класс хранит и делает. **Результат:** Объектная модель (обычно диаграмма классов), которая служит фундаментом для проектирования.
## 40. Что изображает диаграмма коммуникации и для чего используется?
Она изображает взаимодействия между объектами в виде сети, где основное внимание уделяется **связям между объектами** и сообщениям, которыми они обмениваются. **Для чего:** Чтобы понять, какие объекты должны знать друг о друге для реализации конкретного сценария (Use Case).
## 41. Свойство инкапсуляции и как оно влияет на решение задачи
**Инкапсуляция** — это объединение данных и методов в одном объекте и скрытие внутренней сложности. Она превращает объект в «черный ящик», что позволяет решать задачу, не заботясь о том, как объект хранит данные внутри.
> **Пример:** При использовании класса `List` ты просто вызываешь `Add()`, не зная, как именно перераспределяется память внутри массива.
## 42. Что даёт использование принципа инкапсуляции
- **Безопасность:** Защита данных от некорректного изменения.
- **Гибкость:** Можно изменить внутреннюю логику класса, не ломая код, который его использует.
- **Упрощение:** Разработчик работает с простым публичным интерфейсом, а не со сложными деталями.
## 43. Как выделить объект и описать его свойства.
Объект выделяется как существительное в ТЗ, обладающее характеристиками и поведением. Свойства описываются через **поля** (хранение данных) и **свойства/геттеры** (доступ к ним).
> **Пример:** Объект `Книга`. Свойства: `Автор`, `Название`, `Количество страниц`.
## 44. Зачем нужны различные уровни доступа к элементам класса
Чтобы разграничить **внутреннее устройство** (скрыто) и **внешний сервис** (доступно). Это предотвращает случайную порчу состояния объекта внешним кодом.
> **Пример:** Поле `balance` в банке должно быть `private`, чтобы его нельзя было изменить напрямую, минуя метод `Deposit()`.
## 45. Что такое интерфейс класса, что он определяет
Это совокупность всех **публичных** методов и свойств класса. Он определяет, «что» объект умеет делать для других участников системы, не раскрывая, как он это делает.
## 46. В чем заключается принцип сильной внутренней связности и слабой внешней (Low Coupling и High Cohession). Какой в нем смысл?
- **High Cohesion (Сильная связность):** Класс делает одну задачу и делает её хорошо (все методы внутри связаны одной целью).
- **Low Coupling (Слабая связанность):** Классы минимально зависят друг от друга.
- **Смысл:** Программу легче менять — изменения в одном модуле не вызывают «эффект домино» во всей системе.
## 47. Что такое и как используется паттерн Фабрика при работе с экземплярами классов
Это метод или класс, который берет на себя создание объектов. Программа вызывает фабрику, а та решает, объект какого конкретного подкласса создать.
> **Пример:** `DocumentFactory.Create("pdf")` вернет объект `PdfDocument`, скрывая логику его инициализации.
## 48. Описать интерфейс как самостоятельный элемент решения задачи
Интерфейс (`interface`) — это отдельный тип данных, который содержит только сигнатуры методов. Он используется как «контракт», который могут реализовать совершенно разные классы.
> **Пример:** Интерфейс `IDrawable` может быть и у `Circle`, и у `Text`. Программе не важно, что это, если оно умеет рисовать.
## 49. Что означает отношение реализации интерфейса?
Это обязательство класса предоставить конкретный код для всех методов, описанных в интерфейсе. В UML и коде это форма наследования «поведения», а не «реализации».
## 50. Что дает отделение интерфейса и его реализации. Как это используется на практике. Пример.
Это позволяет подменять объекты на лету (модульность).
- **Практика:** Ты работаешь с переменной типа интерфейс, а какой там класс внутри — не важно.
> **Пример:** `ILogger logger = new FileLogger();`. Если завтра нужно писать в базу, ты просто меняешь на `new DbLogger()`, остальной код не меняется.
## 51. Для чего нужно выделять отношения между классами и что это дает?
Помогает понять структуру системы: кто кем управляет, кто в кого входит и кто от кого зависит. Это дает возможность минимизировать связи и упростить архитектуру.
## 52. Что задает отношение включения, что оно обозначает? Как уменьшить зависимость между классами при включении?
Это когда один класс содержит в себе другой класс как поле. **Уменьшение зависимости:** Использовать интерфейс вместо конкретного класса внутри поля (Dependency Injection).
> **Пример:** Класс `Car` включает в себя `IEngine` (а не конкретный `V8Engine`).
## 53. Что означают карты CRC, для чего они используются?
**Class-Responsibility-Collaborator**
Это бумажные карточки для мозгового штурма. На них пишут: **Имя класса**, его **Обязанности** (что он делает) и **Участников** (с кем он взаимодействует). Используются для быстрого проектирования ОО-модели.
## 54. Соответствие естественного языка и отношений между классами.
- «Является» (is-a) → **Наследование**.
- «Имеет» / «Входит в состав» (has-a) → **Агрегация / Композиция**.
- «Использует» (uses) → **Ассоциация**.
## 55. Опишите отношение включения. Его виды, что оно обозначает?
- **Композиция:** Часть не живет без целого (Сердце в Человеке).
- **Агрегация:** Часть может существовать отдельно (Студент в Группе). Обозначает отношение «целое-часть».
## 56. Что показывает диаграмма классов? Какие свойства можно на ней увидеть?
Показывает статическую структуру системы. **Свойства на диаграмме:**
- Состав классов (поля, методы).
- Типы отношений (наследование, ассоциация и др.).
- Мощность связей (один-ко-многим).
- Видимость (public/private).