--- 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`. ## 20. Опишите основные скоростные характеристики массива, когда его стоит применять и почему? Какой тип C# ему соответствует? - **Скорость:** Чтение/запись по индексу — мгновенно ($O(1)$). Поиск или вставка в середину — медленно ($O(n)$). - **Когда применять:** Когда известно точное количество элементов и нужен максимально быстрый доступ. - **Тип в C#:** Соответствует системному типу `System.Array`. > **Пример:** `List numbers = new List;` ## 21. Опишите основные характеристики линейного списка, когда его стоит применять и почему? Какой тип C# ему соответствует? **Характеристики:** Элементы не лежат в памяти подряд, а связаны ссылками (каждый узел знает о следующем). - **Применять, когда:** Нужно часто вставлять или удалять элементы из середины/начала списка. - **Почему:** В отличие от массива, здесь не нужно сдвигать остальные элементы, достаточно перекинуть ссылки ($O(1)$). - **Тип в C#:** `LinkedList`. ## 22. Опишите основные характеристики бинарного дерева, когда его стоит применять и почему? Какой тип C# ему соответствует? **Характеристики:** Иерархическая структура, где у каждого узла не более двух потомков. В дереве поиска (BST) левый потомок меньше родителя, правый — больше. - **Применять, когда:** Нужен быстрый поиск, вставка и удаление в динамическом наборе данных. - **Почему:** Позволяет выполнять операции за логарифмическое время ($O(\log n)$). - **Тип в C#:** `SortedSet` или `SortedDictionary` (внутри используют красно-черные деревья). ## 23. Что такое ассоциативный массив? На каких механизмах он строится? Какой тип C# ему соответствует? **Определение:** Структура данных, хранящая пары «ключ — значение», где каждый ключ уникален. - **Механизмы:** Чаще всего строится на **хэш-таблицах** или сбалансированных деревьях. - **Тип в C#:** `Dictionary`. ## 24. Опишите основные характеристики хэш-таблицы? Как формируется хэш? Где применяется. Какой тип C# ему соответствует? **Характеристики:** Позволяет получать доступ к значению по ключу практически мгновенно. - **Хэш:** Формируется хэш-функцией, которая преобразует ключ в числовой индекс массива. - **Применение:** Словари, кэширование, базы данных. - **Тип в C#:** `Hashtable` (устаревший) или `Dictionary`. ## 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`. Активный — `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).