250 lines
36 KiB
Markdown
250 lines
36 KiB
Markdown
---
|
||
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). |