2025-01-22 22:33:55 +04:00

39 KiB
Raw Permalink Blame History

Лабораторная работа 1

Компоненты:

CustomListBox

Пользовательский визуальный компонент, который наследуется от UserControl. Этот компонент является оберткой вокруг стандартного ListBox и предоставляет функционал для выбора значений из списка. Класс поддерживает заполнение списка значениями, очистку списка, обработку выбора элемента и уведомление об ошибках.


Свойства:

  1. Selected (тип: string)
    • Функция: Возвращает или устанавливает выбранное значение в списке.
    • get: Возвращает выбранный элемент списка или пустую строку, если элемент не выбран.
    • set: Устанавливает выбранный элемент списка, если он существует.

Методы:

  1. FillValues(IEnumerable 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(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<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(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

Паттерн Composite

Паттерн Компоновщик (Composite) объединяет группы объектов в древовидную структуру по принципу "часть-целое и позволяет клиенту одинаково работать как с отдельными объектами, так и с группой объектов.

Образно реализацию паттерна можно представить в виде меню, которое имеет различные пункты. Эти пункты могут содержать подменю, в которых, в свою очередь, также имеются пункты. То есть пункт меню служит с одной стороны частью меню, а с другой стороны еще одним меню. В итоге мы однообразно можем работать как с пунктом меню, так и со всем меню в целом.

Участники:

  • Component определяет интерфейс для всех компонентов в древовидной структуре
  • Composite представляет компонент, который может содержать другие компоненты и реализует механизм для их добавления и удаления
  • Leaf представляет отдельный компонент, который не может содержать другие компоненты
  • Client клиент, который использует компоненты

Классы, реализующие паттерн:

  • IStudent (Component) Студент обучающийся в вузе
  • Group (Composite) Группировка студентов (групаа в потоке, поток, курс...)
  • Student (Leaf) Конкретный студент
  • University (Client) Обеспечивает обучение студентов

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

Лабораторная работа №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

Паттерн 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

Паттерн ObjectPool

Object Pool (пул объектов) — это поведенческий паттерн, который используется для оптимизации управления ресурсами. Он позволяет многократно использовать уже созданные объекты вместо их повторного создания и уничтожения. Это особенно полезно, когда создание объектов является дорогой операцией с точки зрения времени или ресурсов.

Участники:

  • Pool управляет коллекцией объектов. Отвечает за выдачу и возврат объектов из пула. Решает, когда создавать новый объект или использовать существующий.
  • ReusableObject (повторно используемый объект) - объект, который находится в пуле и может быть многократно использован. Включает логику и состояние объекта.
  • Client - получает объект из пула для использования. Возвращает объект обратно в пул, когда он больше не нужен.

Классы, реализующие паттерн:

  • Pool FormatPool управляет доступностью объектов “Format”. Позволяет выдавать объекты формы обучения для студентов.
  • ReusableObject Format содержит данные, связанные с конкретной формой обучения.
  • Client Student представляет студента и содержит данные о нем.

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

  • ILms Mediator - Сайт лмс
  • User Colleague - Пользователь лмс
  • Teacher ConcreteColleague1 - Преподователь
  • Student ConcreteColleague2 - Студент
  • Lms ConcreteMediator - Логика сайта лмс

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