36 KiB
tags
| tags | |
|---|---|
|
Вопросы
1. Какова основа системы управляемой событиями
Основа такой системы — ожидание и реакция. В отличие от линейных программ, которые выполняются от начала до конца, событийно-ориентированная программа находится в цикле ожидания.
- Событие — это сигнал от системы (нажатие клавиши, движение мыши, таймер), на который программа должна отреагировать.
- Программа не диктует пользователю, что делать, а «слушает» его действия.
2. Схема взаимодействия приложения и пользователя для системы управляемой событиями
Взаимодействие строится через посредника — Операционную Систему (ОС):
- Пользователь совершает действие (клик).
- ОС перехватывает это действие и превращает его в сообщение.
- ОС помещает сообщение в очередь сообщений конкретного приложения.
- Приложение извлекает сообщение и выполняет соответствующий код.
3. Что такое сообщение и его роль в интерфейсе Windows. Схема обработки сообщения в приложении
Сообщение — это структура данных, содержащая информацию о том, что произошло (код события, координаты мыши, время и дескриптор окна).
- Роль: Это универсальный язык общения между ОС и программами.
- Схема обработки:
Цикл выборки сообщений (GetMessage) -> Трансляция (TranslateMessage) -> Отправка в оконную процедуру (DispatchMessage).
4. Что такое обработчик сообщений и его роль в программе. Почему программа для Windows называется приложением.
- Обработчик сообщений — это функция (метод), которая содержит логику реакции на конкретное событие (например,
OnClick). - Термин «Приложение»: Программы для Windows называют приложениями (Applications), потому что они не работают изолированно. Они «прикладываются» к программной среде ОС, разделяя с ней ресурсы и подчиняясь её правилам управления интерфейсом.
5. Основной принцип организации приложения с GUI
Главный принцип — интерактивность и визуализация. Программа строится как набор графических объектов (компонентов/контролов), каждый из которых обладает своими свойствами, методами и событиями. Управление передается от одного объекта к другому на основе действий пользователя.
6. Виды окон и их назначение. Что такое дочернее, перекрывающееся и модальное окно.
- Дочернее окно (Child): Всегда находится внутри родительского окна и перемещается вместе с ним (например, кнопка или текстовое поле).
- Перекрывающееся окно (Overlapped): Основное окно программы с заголовком и рамкой.
- Модальное окно: Окно, которое блокирует работу с родительским окном, пока пользователь его не закроет (например, окно «Сохранить файл» или ошибка).
7. Какова структура программы на базе WinForms?
Программа WinForms обычно состоит из трех частей:
- Класс формы (
Form1.cs): Логика обработки событий. - Дизайнер (
Form1.Designer.cs): Автоматически созданный код инициализации компонентов (кнопки, поля). - Точка входа (
Program.cs): МетодMain, который запускает цикл обработки сообщений черезApplication.Run().
8. Что такое недействительная область окна? Где в программе должен быть сосредоточен графический вывод, почему?
- Недействительная область: Часть окна, которую нужно перерисовать (например, если её перекрывало другое окно, а потом оно исчезло).
- Центр вывода: Весь графический код должен быть в обработчике события Paint (или
OnPaint). - Почему? Потому что ОС может потребовать перерисовку окна в любой момент. Если рисовать в другом месте, изображение исчезнет при первом же сворачивании окна.
9. В чем состоит принцип разделения логики и интерфейса программы( паттерн MVC). Причины и смысл
MVC (Model-View-Controller) разделяет программу на три части:
- Model (Модель): Чистые данные и бизнес-логика (не знает об интерфейсе).
- View (Представление): То, что видит пользователь (кнопки, графики).
- Controller (Контроллер): Связующее звено, обрабатывает ввод пользователя и обновляет Модель.
- Смысл: Упрощение тестирования, возможность менять дизайн без переписывания логики и повторное использование кода.
10. Описать структуру платформы .Net и назначение её элементов
Платформа .NET состоит из:
- CLR (Common Language Runtime): Среда выполнения («движок»), отвечает за память, безопасность и выполнение кода.
- FCL (Framework Class Library): Огромная библиотека готовых классов (работа с файлами, сетью, БД, GUI).
- Компиляторы: Переводят код (C#, VB.NET) в промежуточный язык IL (Intermediate Language).
- 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
Процесс проходит в два этапа:
- Compile time: Исходный код (C#) компилируется в CIL (Common Intermediate Language) и упаковывается в сборку (
.exeили.dll). - 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 (например, файловый поток), будет корректно закрыт и освобожден сразу после выхода из блока, даже если возникла ошибка.
Пример:
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. Причины появления новых технологий программирования
Основные факторы:
- Рост сложности ПО: Старые методы не справлялись с миллионами строк кода.
- Кризис ПО: Стоимость поддержки кода превышала стоимость разработки.
- Развитие железа: Появление многоядерных процессоров и больших объемов памяти потребовало новых абстракций (параллелизм, управляемая память).
26. Что означает структурное программирование. Основная идея и используемые принципы
Идея: Программа должна состоять из четких логических блоков. Отказ от бесконтрольных переходов (goto). Принципы:
- Следование (выполнение шагов друг за другом).
- Ветвление (
if/else). - Цикл (
while/for).
Пример: Любая функция на C#, использующая только циклы и условия без оператора
goto.
27. Описать методику решения задач «сверху – вниз»
Это процесс декомпозиции: общая задача разбивается на крупные подзадачи, те — на еще более мелкие, пока мы не дойдем до простых функций.
Пример: Сначала пишем каркас метода
Main, вызывающий пустые функцииInput(),Process(),Output(), а затем реализуем каждую из них.
28. Описать основные свойства структурного анализа (что дает его использование). Его основные этапы.
Что дает: Позволяет создать логическую модель системы до написания кода, выделяя функции и потоки данных. Этапы:
- Определение требований.
- Построение диаграмм потоков данных (DFD).
- Создание словаря данных.
- Описание спецификаций процессов.
29. В чем состоит принцип единственной ответственности для функции
Функция должна решать только одну задачу.
- Зачем: Такой код легче тестировать, понимать и переиспользовать.
Пример: Плохо: функция
SaveAndPrintReport(). Хорошо: две функцииSaveReport()иPrintReport().
30. Предпосылки появления объектно-ориентированной технологии
- Необходимость моделирования реального мира: В структурном стиле данные и функции разделены, а в ООП они объединены в объект (как в жизни).
- Повторное использование кода: Наследование и полиморфизм позволяют не писать одно и то же дважды.
- Инкапсуляция: Нужно было скрыть внутреннюю сложность объектов, чтобы защитить данные от случайного изменения извне.
31. Что такое предметная область? Что такое объект и его класс(общее определение)
- Предметная область: Часть реального мира, которую мы моделируем в программе (например, «Банковская система»).
- Класс: Набор сущностей, имеющих одинаковые характеристики и поведение в рамках заданной задачи.
- Объект: Сущность, имеющая определенные характеристики и поведение в рамках заданной задачи.
Пример: Класс —
Car(автомобиль вообще), объект —myRedTesla(конкретная машина с госномером).
32. В чем отличие класса и структуры языка C#
- Тип данных: Класс — ссылочный (
reference type), структура — тип-значение (value type). - Память: Объекты классов живут в куче (heap), структуры — в стеке (stack).
- Наследование: Классы поддерживают полное наследование, структуры — нет (только реализацию интерфейсов).
Пример: Используйте
structдля мелких данных (точкаPoint, цветColor), аclassдля сложных сущностей (пользовательUser).
33. Основная идея ОО подхода к решению задач
Основная идея: Сформировать решение задачи из объектов с минимальными взаимодействиями. Решение задачи описывается с помощью взаимодействия сущностей (объектов), принадлежащих определенным классам.
34. Что определяют обязанности класса. Описать принцип сбалансированности.
- Обязанности: Совокупность знаний класса (что он знает о себе) и его действий (что он умеет делать).
- Принцип сбалансированности: Обязанности должны быть распределены между классами равномерно. Не должно быть классов-«богов» (которые делают всё) и классов-«бездельников» (которые только хранят данные, не имея логики).
35. Понятие пассивных и активных классов объектов
- Пассивные: Ждут вызова своего метода. Выполняются в потоке управления того объекта, который их вызвал.
- Активные: Имеют собственный поток управления (процесс/thread). Они «живут» сами по себе и могут выполнять действия параллельно с другими.
Пример: Пассивный —
List<int>. Активный —BackgroundWorkerили класс, управляющий сетевым соединением в реальном времени.
36. Что такое вариант использования и как он используется при анализе задачи
Определение: Сценарий взаимодействия пользователя (актора) с системой для достижения конкретной цели. Использование: При анализе они помогают определить границы системы и выделить функции, которые действительно нужны пользователю.
Пример: «Снятие наличных» — это Use Case для банкомата.
37. Откуда берутся классы при объектно-ориентированном анализе задачи.
Классы не выдумываются случайно, их ищут в:
- Существительных из текста технического задания (ТЗ).
- Физических предметах предметной области.
- Ролях (Клиент, Администратор).
- Событиях (Заказ, Транзакция).
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).