# Лабораторная работа 1 ## Компоненты: ### CustomListBox Пользовательский визуальный компонент, который наследуется от UserControl. Этот компонент является оберткой вокруг стандартного ListBox и предоставляет функционал для выбора значений из списка. Класс поддерживает заполнение списка значениями, очистку списка, обработку выбора элемента и уведомление об ошибках. --- ### Свойства: 1. Selected (тип: `string`) - Функция: Возвращает или устанавливает выбранное значение в списке. - get: Возвращает выбранный элемент списка или пустую строку, если элемент не выбран. - set: Устанавливает выбранный элемент списка, если он существует. --- ### Методы: 1. FillValues(IEnumerable strings) - Функция: Заполняет список значениями из переданной коллекции строк. 2. Clear() - Функция: Очищает список, сбрасывает выбор и обновляет отображение. --- ### Поля: 1. _selectedChanged (тип: `EventHandler?`) - Функция: Хранит подписчиков на событие изменения выбранного элемента. 2. _errorOccured (тип: `Action?`) - Функция: Хранит подписчиков на событие возникновения ошибки. --- ### События: 1. ValueChanged (тип: `EventHandler`) - Функция: Событие, возникающее при изменении выбранного элемента в списке. 2. AnErrorOccurred (тип: `Action`) - Функция: Событие, возникающее при возникновении ошибки в процессе обработки выбранного элемента. ### CustomDataTable CustomDataTable представляет собой пользовательский визуальный компонент, который наследуется от UserControl. Этот компонент является оберткой вокруг стандартного DataGridView и предоставляет функционал для отображения и управления таблицей данных. Класс поддерживает настройку столбцов, заполнение таблицы данными, очистку таблицы, выбор строки и получение данных из строки в виде объекта. --- ### Свойства: 1. SelectedRow (тип: `int`) - Функция: Возвращает или устанавливает индекс выбранной строки в таблице. - get: Возвращает индекс текущей выбранной строки. - set: Устанавливает выбранную строку по индексу. --- ### Методы: 1. ConfigureColumns(params CustomDataTableColumnParameter[] columnParameters) - Функция: Настраивает столбцы таблицы на основе переданных параметров. 2. Clear() - Функция: Очищает таблицу, удаляя все строки. 3. GetRow(int rowIndex) - Функция: Возвращает данные из указанной строки таблицы в виде объекта типа TType. 4. Fill(IList insertValues) - Функция: Заполняет таблицу данными из переданного списка объектов. --- ### Поля: - outDataGridView (тип: `DataGridView`) - Функция: Внутренний элемент управления DataGridView, используемый для отображения таблицы. --- ### CustomNumericInputField CustomNumericInputField представляет собой пользовательский визуальный компонент, который наследуется от UserControl. Этот компонент предназначен для ввода целочисленных значений, которые могут быть null. Он включает текстовое поле для ввода числа и флажок (чекбокс) для указания, что значение должно быть null. Компонент также поддерживает события для обработки изменений ввода и ошибок. --- ### Свойства: 1. Value (тип: `int?`) - Функция: Возвращает или устанавливает значение поля ввода. - get: Возвращает введенное целое число или null, если флажок "null" активен. Если введенное значение не является числом, выбрасывает исключение InvalidNumericInputValueException. - set: Устанавливает значение поля ввода. Если значение null, активирует флажок "null" и очищает текстовое поле. --- ### Методы: 1. Приватный: IsNullcheckBox_CheckedChanged(object sender, EventArgs e) - Функция: Обрабатывает изменение состояния флажка "null". Если флажок активен, отключает текстовое поле и очищает его. Вызывает событие _numericInputChanged или _errorOccurred в случае ошибки. 2. Приватный: InputField_TextChanged(object sender, EventArgs e) - Функция: Обрабатывает изменение текста в поле ввода. Вызывает событие _numericInputChanged или _errorOccurred в случае ошибки. --- ### Поля: 1. _numericInputChanged (тип: `EventHandler?`) - Функция: Хранит подписчиков на событие изменения значения в поле ввода. 2. _errorOccured (тип: `Action?`) - Функция: Хранит подписчиков на событие возникновения ошибки. --- ### События: 1. NumericInputChanged (тип: `EventHandler`) - Функция: Событие, возникающее при изменении значения в поле ввода (включая активацию флажка "null"). 2. AnErrorOccurred (тип: `Action`) - Функция: Событие, возникающее при возникновении ошибки в процессе обработки ввода. --- # Лабораторная работа 2 ## Компоненты: ### CustomPdfTable Класс CustomPdfTable представляет собой компонент, который сохраняет данные в виде таблицы в PDF-документ. Этот компонент использует библиотеку PdfSharp.MigraDoc для создания и форматирования PDF-документов. Класс поддерживает добавление заголовка документа, создание таблиц на основе двумерных массивов строк и сохранение документа по указанному пути. --- ### Методы: 1. SaveToPdf(PdfTableInfo tableInfo) - Функция: Сохраняет данные в PDF-документ с таблицами. - Параметры: - tableInfo: Объект типа PdfTableInfo, - содержащий информацию о пути сохранения файла, заголовке документа и таблицах. - Логика: - Проверяет, что таблицы не пусты. - Создает PDF-документ с помощью PdfCreator. - Добавляет заголовок документа. - Для каждой таблицы создает строки и столбцы на основе двумерного массива строк. - Сохраняет документ по указанному пути. --- ### CustomPdfTableWithGrouping CustomPdfTableWithGrouping создает PDF-документ с таблицей, группируя данные по первому столбцу. Использует библиотеку PdfSharp.MigraDoc для создания и форматирования PDF-документов. Класс поддерживает настройку заголовка таблицы, столбцов, строк и группировку данных. --- ### Методы: 1. SaveToPdf(PdfTableWithGroupingInfo tableInfo) - Функция: Сохраняет данные в PDF-документ с таблицей, группируя строки по первому столбцу. - Параметры: - tableInfo: Объект типа PdfTableWithGroupingInfo, содержащий информацию о пути сохранения файла, заголовке таблицы, столбцах и строках. - Логика: - Проверяет, что столбцы и строки не пусты. - Создает PDF-документ с помощью PdfCreator. - Добавляет заголовок таблицы в документ. - Создает таблицу с указанными столбцами и строками, группируя данные по первому столбцу. - Сохраняет документ по указанному пути. --- ### CustomPdfHistogram CustomPdfHistogram представляет собой компонент, который сохраняет гистограмму в PDF-документ. Этот компонент использует библиотеку PdfSharp.MigraDoc для создания и форматирования PDF-документов. Класс поддерживает добавление заголовка документа, создание гистограммы на основе переданных данных и сохранение документа по указанному пути. --- ### Методы: 1. SaveToPdf(PdfHistigramInfo histogramInfo) - Функция: Сохраняет гистограмму в PDF-документ. - Параметры: - histogramInfo: Объект типа PdfHistigramInfo, содержащий информацию о пути сохранения файла, заголовке документа, заголовке диаграммы, данных и положении легенды. - Логика: - Проверяет корректность входных данных (путь к файлу, заголовки, данные). - Создает PDF-документ с помощью PdfCreator. - Добавляет заголовок документа. - Создает линейную диаграмму на основе переданных данных. - Сохраняет документ по указанному пути. - Исключения: - ArgumentException: Если входные данные некорректны (например, отсутствует путь к файлу, заголовок или данные). --- # Лабораторная работа 3 Программный продукт предназначен для учета успеваемости студентов и управления их данными. Он позволяет хранить информацию о каждом студенте, формировать отчеты в различных форматах (Word, PDF, Excel) и визуализировать данные с помощью линейной диаграммы. ### Цель программы Цель программы — автоматизация процесса учета успеваемости студентов, упрощение работы с данными и формирование отчетов для анализа успеваемости студентов. ### Функционал программы - Хранение данных о студентах: 1. ФИО студента. 2. Дата поступления 3. Форма обучения (выбирается из выпадающего списка). 4. Успеваемость - Отображение данных в виде списка Данные о студентах выводятся на главной форме в виде списка строк - Формирование документа в PDF: Создается таблица с данными о средних баллах студентов по сессиям. Колонки таблицы: сессии от 1 до 6. Строки таблицы: средние баллы студентов (без указания ФИО). - Формирование таблицы в excel: Создается табличный отчет с информацией по всем студентам. Шапка таблицы: - Id - ФИО - Образование - Форма обучения - Дата поступления - Создание круговой диаграммы в Word: Формируется линейная диаграмма, отображающая распределение студентов по форме обучения, поступивших в разнык года | Компонент | Преимущества | Недостатки | |--------------------------|--------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | CustomDateTimePicker | Понятные и логичные названия переменных | Занимаемое компонентом место не оптимизировано (могут возникнуть трудности с контейнерами) | | VisualSelectionComponent | Содержит большую часть требуемого функцинонала | В базовой поставке отсутствует функционал заполнения, отсутствует xml документация, функции имеют не оправдано длинное название, границы компонента занимают чуть больше места чем вложенные элементы | | ComponentDiagram | Реализует функционал создания диограммы в текстовом документе word | Использует комерческую библиотеку с бесплатным доступом, на документе остаётся водяной знак, в функцию создания документа передаётся объект, но его поля нужно инициализировать в конструкторе, отсутствует xml документация | | CustomExcelTable | Удобные настройки таблицы, понятные наименования функций и классов | Отсутствует xml документация | # Лабораторная работа №5. # Применение структурных паттернов. ## Задание 1) Дать описание паттернов, указанных во вариантах, для каких целей они могут применяться, какие участники там фигурируют. 2) На основе задания из 3 лабораторной работы, для каждого паттерна придумать сущности, относящиеся к той же предметной области, что описаны в задании и реализация которых бы в приложении потребовала применения паттерна. ### Ограничения: - На каждый паттерн свои сущности - В качестве источника сущностей использовать предметную область задания 3 лабораторной работы, а не элементы разработки (что-то типа «У меня паттерн Singleton, укажу ка я класс-подключение к БД через него», не принимается). 3) Создать диаграммы классов, отражающие взаимодействие новых сущностей (а также используемый паттерн) с классами, созданными в рамках 3 лабораторной работы. Отдельно отметить классы, которые являются участниками паттерна ## Вариант 3: _Adapter, Composite, Proxy_ ### Паттерн Adapter Паттерн Адаптер используется для того, чтобы объекты с несовместимыми интерфейсами могли работать вместе. Он оборачивает один интерфейс в другой, делая несовместимые классы совместимыми без изменения их исходного кода. Задачи, которые решает паттерн Adapter: - Интеграция стороннего кода или библиотек: когда требуется использовать стороннюю библиотеку с вашим приложением, но её интерфейс отличается от имеющегося интерфейса. - Обратная совместимость: когда нужно подключить новый код к старому интерфейсу, не изменяя существующий. - Упрощение взаимодействия: уменьшает сложность работы с несколькими несовместимыми компонентами. Участники: - Target: представляет объекты, которые используются клиентом. - Client: использует объекты Target для реализации своих задач. - Adaptee: представляет адаптируемый класс, который хотелось бы использовать у клиента вместо объектов Target. - Adapter: сам адаптер, который позволяет работать с объектами Adaptee как с объектами Target. **Пример реализации для рассматриваемой предметной области:**
Классы, реализующие паттерн: - IStudentTracker (Target) – Интерфейс системы отслеживания успеваемости студентов - StudentManager (Client) – Использует данные о успеваемости, для определеня судьбы студентов - AttendanceTracker (Adaptee) – Реализализовывает систему отслеживания посещаемости студентов - StudentTrackerAdapter (Adapter) – "оборачивает" стороннюю систему и преобразует её в интерфейс, ожидаемый клиентом ![img_1.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/raw/branch/dev/Lab5-6/img_1.png) ### Паттерн Composite Паттерн Компоновщик (Composite) объединяет группы объектов в древовидную структуру по принципу "часть-целое и позволяет клиенту одинаково работать как с отдельными объектами, так и с группой объектов. Образно реализацию паттерна можно представить в виде меню, которое имеет различные пункты. Эти пункты могут содержать подменю, в которых, в свою очередь, также имеются пункты. То есть пункт меню служит с одной стороны частью меню, а с другой стороны еще одним меню. В итоге мы однообразно можем работать как с пунктом меню, так и со всем меню в целом. Участники: - Component – определяет интерфейс для всех компонентов в древовидной структуре - Composite – представляет компонент, который может содержать другие компоненты и реализует механизм для их добавления и удаления - Leaf – представляет отдельный компонент, который не может содержать другие компоненты - Client – клиент, который использует компоненты Классы, реализующие паттерн: - IStudent (Component) – Студент обучающийся в вузе - Group (Composite) – Группировка студентов (групаа в потоке, поток, курс...) - Student (Leaf) – Конкретный студент - University (Client) – Обеспечивает обучение студентов ![img.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/raw/branch/dev/Lab5-6/img.png) ### Паттерн Proxy Паттерн Заместитель (Proxy) предоставляет объект-заместитель, который управляет доступом к другому объекту. То есть создается объект-суррогат, который может выступать в роли другого объекта и замещать его. Участники: - Subject – определяет общий интерфейс для Proxy и RealSubject. Поэтому Proxy может использоваться вместо RealSubject - RealSubject – представляет реальный объект, для которого создается прокси - Proxy – заместитель реального объекта. Хранит ссылку на реальный объект, контролирует к нему доступ, может управлять его созданием и удалением. При необходимости Proxy переадресует запросы объекту RealSubject - Client – использует объект Proxy для доступа к объекту RealSubject Классы, реализующие паттерн: - IStudent (Subject) – Студент - Student (RealSubject) – Студент из группы - Elder (Proxy) – Староста отвечает на вопросы преподователя, при надомности спрашивает студентов группы - Lecturer (Client) - Задаёт вопросы студентам через старосту ![img_2.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/raw/branch/dev/Lab5-6/img_2.png) # Лабораторная работа №6. # Применение структурных паттернов. ## Задание 1) Дать описание паттернов, указанных во вариантах, для каких целей они могут применяться, какие участники там фигурируют. 2) На основе задания из 3 лабораторной работы, для каждого паттерна придумать сущности, относящиеся к той же предметной области, что описаны в задании и реализация которых бы в приложении потребовала применения паттерна. ### Ограничения - На каждый паттерн свои сущности - В качестве источника сущностей использовать предметную область задания 3 лабораторной работы, а не элементы разработки (что-то типа «У меня паттерн Singleton, укажу ка я класс-подключение к БД через него», не принимается). 3) Создать диаграммы классов, отражающие взаимодействие новых сущностей (а также используемый паттерн) с классами, созданными в рамках 3 лабораторной работы. Отдельно отметить классы, которые являются участниками паттерна ## Вариант 3 _AbstractFactory, FactoryMethod, ObjectPool._ ### Паттерн AbstractFactory Паттерн "Абстрактная фабрика" (Abstract Factory) предоставляет интерфейс для создания семейств взаимосвязанных объектов с определенными интерфейсами без указания конкретных типов данных объектов. Участники - AbstractProductA и AbstractProductB – абстрактные классы, определяющие интерфейс для классов, объекты которых будут создаваться в программе - ProductA1 / ProductA2 и ProductB1 / ProductB2 – конкретные классы, представляющие конкретную реализацию абстрактных классов. - AbstractFactory - Абстрактный класс фабрики определяет методы для создания объектов. Причем методы возвращают абстрактные продукты, а не их конкретные реализации. - Client – класс клиента, использующий класс фабрики для создания объектов. При этом он использует исключительно абстрактный класс фабрики AbstractFactory и абстрактные классы продуктов AbstractProductA и AbstractProductB и никак не зависит от их конкретных реализаций. Классы, реализующие паттерн: - IReportFactory (Abstract Factory) интерфейс фабрики для создания отчетов. - FivePointReportFactory (Concrete Factory) фабрика для 5-балльной системы. - HundredPointReportFactory (Concrete Factory) фабрика для 100-балльной системы. - IPerformanceReport (Abstract Product) интерфейс для отчета по успеваемости. - FivePointPerformanceReport и HundredPointPerformanceReport (Concrete Products) конкретные реализации отчетов по успеваемости для 5- и 10-балльной систем. - ILaggingStudentsReport (Abstract Product) интерфейс для отчета по отстающим студентам. - FivePointLaggingStudentsReport и HundredPointLaggingStudentsReport (Concrete Products) отчеты по отстающим студентам для 5- и 10-балльной систем. - ReportManager (Client) класс, который обрабатывает отчеты ![img_4.png](https://i.pinimg.com/originals/43/89/ed/4389ed56415070fc606be04621db69cc.jpg) ### Паттерн FactoryMethod Фабричный метод (Factory Method) - это паттерн, который определяет интерфейс для создания объектов некоторого класса, но непосредственное решение о том, объект какого класса создавать происходит в подклассах. То есть паттерн предполагает, что базовый класс делегирует создание объектов классам-наследникам. Участники: - Product – интерфейс или абстрактный класс, определяющий структуру создаваемых объектов. - ConcreteProductA и ConcreteProductB – конкретные реализации интерфейса “Product”, представляющие первый и второй тип продукта. - Creator – абстрактный класс или интерфейс, который определяет фабричный метод для создания объектов типа “Product”. - ConcreteCreatorA и ConcreteCreatorB – конкретные реализации “Creator”, которая создаёт объекты типа “ConcreteProductA” и “ConcreteCreatorB” соответственно. Классы, реализующие паттерн: - Product IReport – определяет интерфейс для всех отчетов. - ConcreteProductA и ConcreteProductB GradeReport и AttendanceReport – конкретные реализации интерфейса “IReport”. - Creator ReportCreator – определяет фабричный метод для создания объектов типа “IReport”. - ConcreteCreatorA и ConcreteCreatorB GradeReportCreator и AttendanceReportCreator – конкретные реализации “ReportCreator”. ![img_5.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/raw/branch/dev/Lab5-6/img_1.png) ### Паттерн ObjectPool Object Pool (пул объектов) — это поведенческий паттерн, который используется для оптимизации управления ресурсами. Он позволяет многократно использовать уже созданные объекты вместо их повторного создания и уничтожения. Это особенно полезно, когда создание объектов является дорогой операцией с точки зрения времени или ресурсов. Участники: - Pool – управляет коллекцией объектов. Отвечает за выдачу и возврат объектов из пула. Решает, когда создавать новый объект или использовать существующий. - ReusableObject (повторно используемый объект) - объект, который находится в пуле и может быть многократно использован. Включает логику и состояние объекта. - Client - получает объект из пула для использования. Возвращает объект обратно в пул, когда он больше не нужен. Классы, реализующие паттерн: - Pool FormatPool – управляет доступностью объектов “Format”. Позволяет выдавать объекты формы обучения для студентов. - ReusableObject Format – содержит данные, связанные с конкретной формой обучения. - Client Student – представляет студента и содержит данные о нем. ![img_6.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/raw/branch/dev/Lab5-6/img_6.png) # Лабораторная работа №7. # Применение структурных паттернов. ## Задание 1) Дать описание паттернов, указанных во вариантах, для каких целей они могут применяться, какие участники там фигурируют. 2) На основе задания из 3 лабораторной работы, для каждого паттерна придумать сущности, относящиеся к той же предметной области, что описаны в задании и реализация которых бы в приложении потребовала применения паттерна. ### Ограничения - На каждый паттерн свои сущности - В качестве источника сущностей использовать предметную область задания 3 лабораторной работы, а не элементы разработки (что-то типа «У меня паттерн Singleton, укажу ка я класс-подключение к БД через него», не принимается). 3) Создать диаграммы классов, отражающие взаимодействие новых сущностей (а также используемый паттерн) с классами, созданными в рамках 3 лабораторной работы. Отдельно отметить классы, которые являются участниками паттерна ## Вариант 3 _Mediator, Mediator (2 различных реализации), Strategy._ ### Паттерн Mediator Паттерн "Посредник" (Mediator) представляет такой шаблон проектирования, который обеспечивает взаимодействие множества объектов без необходимости ссылаться друг на друга. Тем самым достигается слабосвязанность взаимодействующих объектов. Участники - Mediator - представляет интерфейс для взаимодействия с объектами Colleague. - Colleague - представляет интерфейс для взаимодействия с объектом Mediator. - ConcreteColleague1 и ConcreteColleague2 - конкретные классы коллег, которые обмениваются друг с другом через объект Mediator. - ConcreteMediator - конкретный посредник, реализующий интерфейс типа Mediator. Классы, реализующие паттерн: - Secretary Mediator - Секретарь - Client Colleague - Участник вузовской системы - Teacher ConcreteColleague1 - Преподователь - Student ConcreteColleague2 - Студент - Dean`s Office ConcreteMediator - Деканат ![img_8.png](https://i.pinimg.com/originals/7f/c3/40/7fc340de38957f5c29de3a6a6689a252.png) - ILms Mediator - Сайт лмс - User Colleague - Пользователь лмс - Teacher ConcreteColleague1 - Преподователь - Student ConcreteColleague2 - Студент - Lms ConcreteMediator - Логика сайта лмс ![img_7.png](https://i.pinimg.com/originals/ac/c5/67/acc567be76d33349c35fd5fc10f84b9f.jpg) ### Паттерн Strategy Strategy (Стратегия) — шаблон проектирования, который определяет набор алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. В зависимости от ситуации мы можем легко заменить один используемый алгоритм другим. При этом замена алгоритма происходит независимо от объекта, который использует данный алгоритм. Участники: - IStrategy: интерфейс, который определяет метод Algorithm(). Это общий интерфейс для всех реализующих его алгоритмов. Вместо интерфейса здесь также можно было бы использовать абстрактный класс. - ConcreteStrategy1 и ConcreteStrategy2: классы, которые реализуют интерфейс IStrategy, предоставляя свою версию метода Algorithm(). Подобных классов-реализаций может быть множество. - Context: класс, который хранит ссылку на объект IStrategy и связан с интерфейсом IStrategy отношением агрегации. Классы, реализующие паттерн: - IStrategy IReportStrategy – общий интерфейс для всех стратегий формирования отчетов. - PdfReportStrategy, ExcelkReportStrategy, WordReportStrategy - классы, реализующие формирование отчета в pdf, excel и word. - Context ReportContext – контекст, который использует стратегию для формирования отчета. Этот подход позволяет легко добавлять новые форматы отчетов (например, JSON или HTML) без изменения существующего кода, реализуя принцип открытости/закрытости. ![img_9.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/media/branch/dev/Lab5-6/img_10.png)