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

36 KiB
Raw Blame History

tags
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 (например, файловый поток), будет корректно закрыт и освобожден сразу после выхода из блока, даже если возникла ошибка.

Пример:

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).