Initial commit

This commit is contained in:
Aleksandr Ebaklakov
2026-04-22 16:58:43 +03:00
commit 011626b8b7
366 changed files with 23244 additions and 0 deletions

View File

@@ -0,0 +1,250 @@
---
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).