diff --git a/Report/report.md b/Report/report.md new file mode 100644 index 0000000..0ac5e08 --- /dev/null +++ b/Report/report.md @@ -0,0 +1,537 @@ +# Лабораторная работа 1 +## Компоненты: + +### CustomDataTable: +Визуальный компонент вывода таблицы значений + +__Публичные Методы__: +- Определить структуру таблицы + ```c# + void ConfigureColumns(params CustomDataTableColumnParameter[] columnParameters) + ``` + CustomDataTableColumnParameter + ```c# + /// + /// Параметры столбца таблицы + /// + public record CustomDataTableColumnParameter + { + /// + /// Заголовок + /// + public string HeaderName { get; init; } = string.Empty; + + /// + /// Ширина + /// + public int Width { get; init; } = 0; + + /// + /// Видимость + /// + public bool Visible { get; init; } = true; + + /// + /// Название свойства + /// + public string PropertyName { get; init; } = string.Empty; + } + ``` +- Отчистить таблицу + ```c# + public void Clear() + ``` +- Заполнить таблицу + ```c# + public void Fill(IList insertValues) + ``` + +__Публичные Функции__: +- Получить стоку таблицы в виде объекта + ```c# + public TType? GetRow(int rowIndex) where TType : new() + ``` + +__Свойства__: +- Индекс выбранной строки + ```c# + public int SelectedRow + ``` + + +### CustomListBox +Визуальный компонент выбора из списка значений + +__Публичные Методы__: +- Заполнить список значениями + ```c# + public void FillValues(IEnumerable strings) + ``` +- Очистить список + ```c# + public void Clear() + ``` + +__Свойства__: +- Событие возникающие при изменении списка + ```c# + public event EventHandler ValueChanged + ``` +- Обработка ошибок + ```c# + public event Action AnErrorOccurred + ``` +- Выбранное значение + ```c# + public string Selected + ``` + + +### CustomNumericInputField +Визуальный компонент ввода целочисленного значения допускающего null + +__Свойства__: +- Событие возникающие при изменении поля ввода + ```c# + public event EventHandler NumericInputChanged + ``` +- Обработка ошибок + ```c# + public event Action AnErrorOccurred + ``` +- Значения поля ввода + ```c# + public int? Value + ``` + _Возможно исключение ```InvalidNumericInputValueException```_ + + +# Лабораторная работа 2 +## Компоненты: + +### CustomPdfTable + +Компонент для сохранения таблицы в пдф + +__Публичные Методы__: +- Определить структуру таблицы + ```c# + public void SaveToPdf(PdfTableInfo tableInfo) + ``` + PdfTableInfo + ```c# + /// + /// Параметры для создания таблиц в пдф + /// + public record PdfTableInfo + { + /// + /// имя файла (включая путь до файла) + /// + public string FilePath { get; init; } = @"C:\pdfTable.pdf"; + + /// + /// название документа(заголовок в документе) + /// + public string Title { get; init; } = "Таблица"; + + /// + /// Список таблиц + /// + public IEnumerable Tables { get; init; } = []; + } + ``` + +### CustomPdfTableWithGrouping + +Компонент создающий таблицу и группирует элементы по 1 столбцу +__Публичные Методы__: +- Сохранить в пдф + ```c# + public void SaveToPdf(PdfTableWithGroupingInfo tableInfo) where TType : class + ``` + PdfTableWithGroupingInfo + ```c# + /// + /// Параметры для создания таблицы в пдф с группировкой по 1 столбцу + /// + public class PdfTableWithGroupingInfo where TType : class + { + /// + /// имя файла (включая путь до файла) + /// + public string FilePath { get; init; } = @"C:\pdfTable.pdf"; + + /// + /// название документа(заголовок в документе) + /// + public string Title { get; init; } = "Таблица"; + + /// + /// Высота заголовков + /// + public float HeaderHeight { get; init; } = 0.5f; + + /// + /// Параметры столбцов + /// + public IEnumerable Columns { get; init; } = []; + + /// + /// Список таблиц + /// + public IEnumerable> Rows { get; init; } = []; + } + ``` + +### CustomPdfHistogram + +Компонент создающий линейную диаграмму +__Публичные Методы__: +- Сохранить гистограмму в пдф + ```c# + public void SaveToPdf(PdfHistigramInfo histogramInfo) + ``` + PdfHistigramInfo + ```c# + /// + /// Параметры для создания линейной диаграммы + /// + public record PdfHistigramInfo + { + /// + /// Имя файла (включая путь до файла) + /// + public string FilePath { get; init; } = @"C:\pdfTable.pdf"; + + /// + /// Заголовок документа + /// + public string DocumentTitle { get; init; } = "Гистограмма"; + + /// + /// Заголовок диаграммы + /// + public string HistogramTitle { get; init; } = "Гистограмма"; + + /// + /// Расположение легенды + /// + public PdfLegendPosition LegendPosition { get; init; } = PdfLegendPosition.Bottom; + + /// + /// Значения + /// + public required IEnumerable Values { get; init; } + } + ``` + + +# Лабораторная работа 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_3.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_3.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/src/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/src/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://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_4.png) + +### Паттерн 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/src/branch/dev/Lab5-6/img_5.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/src/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://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_8.png) + +- ILms Mediator - Сайт лмс +- User Colleague - Пользователь лмс +- Teacher ConcreteColleague1 - Преподователь +- Student ConcreteColleague2 - Студент +- Lms ConcreteMediator - Логика сайта лмс + +![img_7.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_7.png) + +### Паттерн 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/src/branch/dev/Lab5-6/img_9.png) \ No newline at end of file