Compare commits

...

6 Commits

Author SHA1 Message Date
bekodeg
237a890a7b эх 2025-01-22 22:33:55 +04:00
bekodeg
d10a98650d конвертнул отчёт в пдф 2025-01-20 22:27:41 +04:00
bekodeg
a9825a902b добавил картинки 2025-01-20 22:22:09 +04:00
bekodeg
dcaa8d7763 test 2025-01-20 22:14:16 +04:00
bekodeg
ad13c0837a report 2025-01-20 22:13:09 +04:00
eae958424a Merge pull request 'LABWORK-5' (#3) from LABWORK-5 into dev
Reviewed-on: #3
2024-12-19 15:52:39 +04:00
2 changed files with 536 additions and 0 deletions

536
Report/report.md Normal file
View File

@ -0,0 +1,536 @@
# Лабораторная работа 1
## Компоненты:
### CustomListBox
Пользовательский визуальный компонент, который наследуется от UserControl.
Этот компонент является оберткой вокруг стандартного ListBox и предоставляет функционал для выбора значений из списка.
Класс поддерживает заполнение списка значениями, очистку списка,
обработку выбора элемента и уведомление об ошибках.
---
### Свойства:
1. Selected (тип: `string`)
- Функция: Возвращает или устанавливает выбранное значение в списке.
- get: Возвращает выбранный элемент списка или пустую строку, если элемент не выбран.
- set: Устанавливает выбранный элемент списка, если он существует.
---
### Методы:
1. FillValues(IEnumerable<string> strings)
- Функция: Заполняет список значениями из переданной коллекции строк.
2. Clear()
- Функция: Очищает список, сбрасывает выбор и обновляет отображение.
---
### Поля:
1. _selectedChanged (тип: `EventHandler?`)
- Функция: Хранит подписчиков на событие изменения выбранного элемента.
2. _errorOccured (тип: `Action<Exception>?`)
- Функция: Хранит подписчиков на событие возникновения ошибки.
---
### События:
1. ValueChanged (тип: `EventHandler`)
- Функция: Событие, возникающее при изменении выбранного элемента в списке.
2. AnErrorOccurred (тип: `Action<Exception>`)
- Функция: Событие, возникающее при возникновении ошибки в процессе обработки выбранного элемента.
### CustomDataTable
CustomDataTable представляет собой пользовательский визуальный компонент, который наследуется от UserControl.
Этот компонент является оберткой вокруг стандартного DataGridView
и предоставляет функционал для отображения и управления таблицей данных. Класс поддерживает настройку столбцов,
заполнение таблицы данными, очистку таблицы, выбор строки и получение данных из строки в виде объекта.
---
### Свойства:
1. SelectedRow (тип: `int`)
- Функция: Возвращает или устанавливает индекс выбранной строки в таблице.
- get: Возвращает индекс текущей выбранной строки.
- set: Устанавливает выбранную строку по индексу.
---
### Методы:
1. ConfigureColumns(params CustomDataTableColumnParameter[] columnParameters)
- Функция: Настраивает столбцы таблицы на основе переданных параметров.
2. Clear()
- Функция: Очищает таблицу, удаляя все строки.
3. GetRow<TType>(int rowIndex)
- Функция: Возвращает данные из указанной строки таблицы в виде объекта типа TType.
4. Fill<TType>(IList<TType> 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<Exception>?`)
- Функция: Хранит подписчиков на событие возникновения ошибки.
---
### События:
1. NumericInputChanged (тип: `EventHandler`)
- Функция: Событие, возникающее при изменении значения в поле ввода (включая активацию флажка "null").
2. AnErrorOccurred (тип: `Action<Exception>`)
- Функция: Событие, возникающее при возникновении ошибки в процессе обработки ввода.
---
# Лабораторная работа 2
## Компоненты:
### CustomPdfTable
Класс CustomPdfTable представляет собой компонент, который сохраняет данные в виде таблицы в PDF-документ.
Этот компонент использует библиотеку PdfSharp.MigraDoc для создания и форматирования PDF-документов.
Класс поддерживает добавление заголовка документа,
создание таблиц на основе двумерных массивов строк и сохранение документа по указанному пути.
---
### Методы:
1. SaveToPdf(PdfTableInfo tableInfo)
- Функция: Сохраняет данные в PDF-документ с таблицами.
- Параметры:
- tableInfo: Объект типа PdfTableInfo,
- содержащий информацию о пути сохранения файла, заголовке документа и таблицах.
- Логика:
- Проверяет, что таблицы не пусты.
- Создает PDF-документ с помощью PdfCreator.
- Добавляет заголовок документа.
- Для каждой таблицы создает строки и столбцы на основе двумерного массива строк.
- Сохраняет документ по указанному пути.
---
### CustomPdfTableWithGrouping
CustomPdfTableWithGrouping создает PDF-документ с таблицей,
группируя данные по первому столбцу.
Использует библиотеку PdfSharp.MigraDoc для создания и форматирования PDF-документов.
Класс поддерживает настройку заголовка таблицы, столбцов, строк и группировку данных.
---
### Методы:
1. SaveToPdf<TType>(PdfTableWithGroupingInfo<TType> tableInfo)
- Функция: Сохраняет данные в PDF-документ с таблицей, группируя строки по первому столбцу.
- Параметры:
- tableInfo: Объект типа PdfTableWithGroupingInfo<TType>,
содержащий информацию о пути сохранения файла, заголовке таблицы, столбцах и строках.
- Логика:
- Проверяет, что столбцы и строки не пусты.
- Создает 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.
**Пример реализации для рассматриваемой предметной области:**<br>
Классы, реализующие паттерн:
- 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)

BIN
Report/report.pdf Normal file

Binary file not shown.