257 lines
8.3 KiB
Markdown
257 lines
8.3 KiB
Markdown
|
|
# Student Management Console Application
|
||
|
|
|
||
|
|
Консольное Java-приложение для создания, хранения, сортировки, поиска и сохранения коллекций студентов.
|
||
|
|
|
||
|
|
Проект разработан командой в рамках учебного задания и демонстрирует применение ООП, собственных коллекций, алгоритмов сортировки, Stream API, паттернов проектирования, CSV-ввода/вывода и unit-тестирования.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Возможности
|
||
|
|
|
||
|
|
Приложение позволяет:
|
||
|
|
|
||
|
|
- создавать коллекции студентов вручную;
|
||
|
|
- генерировать случайные данные;
|
||
|
|
- загружать студентов из CSV-файла;
|
||
|
|
- просматривать текущую коллекцию;
|
||
|
|
- сохранять коллекцию в CSV;
|
||
|
|
- сортировать студентов по номеру группы, среднему баллу и номеру зачётной книжки;
|
||
|
|
- выбирать алгоритм сортировки;
|
||
|
|
- выполнять специальную even-only сортировку;
|
||
|
|
- искать студентов по нескольким критериям;
|
||
|
|
- объединять критерии поиска через `И` / `ИЛИ`;
|
||
|
|
- подсчитывать количество вхождений студента;
|
||
|
|
- получать индексы найденных элементов.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Архитектура
|
||
|
|
|
||
|
|
Основной поток данных:
|
||
|
|
|
||
|
|
```text
|
||
|
|
Manual / CSV / Random
|
||
|
|
↓
|
||
|
|
Student
|
||
|
|
↓
|
||
|
|
MyList<Student>
|
||
|
|
↓
|
||
|
|
┌─────┴─────┐
|
||
|
|
↓ ↓
|
||
|
|
Sorting Search
|
||
|
|
│ │
|
||
|
|
└─────┬─────┘
|
||
|
|
↓
|
||
|
|
Console / CSV
|
||
|
|
```
|
||
|
|
|
||
|
|
Логика приложения разделена на отдельные функциональные области: модель данных, создание коллекции, хранение, сортировка, поиск, CSV-ввод/вывод и пользовательский интерфейс.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Основные компоненты
|
||
|
|
|
||
|
|
### Student
|
||
|
|
|
||
|
|
`Student` — основная модель данных приложения.
|
||
|
|
|
||
|
|
Модель содержит данные студента, выполняет валидацию входных значений и определяет правила сравнения объектов через `equals()` и `hashCode()`.
|
||
|
|
|
||
|
|
Для пошагового создания объектов используется `StudentBuilder`.
|
||
|
|
|
||
|
|
### Custom Collection
|
||
|
|
|
||
|
|
Для хранения студентов используются собственные:
|
||
|
|
|
||
|
|
- `MyList<T>`;
|
||
|
|
- `MyLinkedList<T>`.
|
||
|
|
|
||
|
|
Коллекция поддерживает основные операции работы с данными и интеграцию со Stream API.
|
||
|
|
|
||
|
|
Для сбора результатов Stream обратно в `MyList` реализован собственный `MyListCollector`.
|
||
|
|
|
||
|
|
### Sorting
|
||
|
|
|
||
|
|
Система сортировки построена на паттерне **Strategy**.
|
||
|
|
|
||
|
|
Доступны:
|
||
|
|
|
||
|
|
- Merge Sort;
|
||
|
|
- Bubble Sort;
|
||
|
|
- even-only sorting.
|
||
|
|
|
||
|
|
`SortStrategy` определяет алгоритм сортировки, а `Comparator<Student>` — поле, по которому сравниваются студенты.
|
||
|
|
|
||
|
|
```text
|
||
|
|
SortStrategy
|
||
|
|
↓
|
||
|
|
КАК сортировать
|
||
|
|
|
||
|
|
Comparator
|
||
|
|
↓
|
||
|
|
ПО КАКОМУ ПОЛЮ сортировать
|
||
|
|
```
|
||
|
|
|
||
|
|
### Search
|
||
|
|
|
||
|
|
Поиск поддерживает несколько критериев:
|
||
|
|
|
||
|
|
- номер группы;
|
||
|
|
- средний балл;
|
||
|
|
- номер зачётной книжки.
|
||
|
|
|
||
|
|
Несколько условий могут объединяться через `И` / `ИЛИ`.
|
||
|
|
|
||
|
|
Для составных условий используется паттерн **Composite**.
|
||
|
|
|
||
|
|
Также реализован поиск количества вхождений студента и индексов найденных элементов.
|
||
|
|
|
||
|
|
### CSV
|
||
|
|
|
||
|
|
За работу с CSV отвечают:
|
||
|
|
|
||
|
|
- `StudentCsvReader`;
|
||
|
|
- `StudentCsvWriter`.
|
||
|
|
|
||
|
|
Загрузка данных:
|
||
|
|
|
||
|
|
```text
|
||
|
|
CSV
|
||
|
|
↓
|
||
|
|
StudentCsvReader
|
||
|
|
↓
|
||
|
|
Student
|
||
|
|
↓
|
||
|
|
MyList<Student>
|
||
|
|
```
|
||
|
|
|
||
|
|
Сохранение:
|
||
|
|
|
||
|
|
```text
|
||
|
|
MyList<Student>
|
||
|
|
↓
|
||
|
|
StudentCsvWriter
|
||
|
|
↓
|
||
|
|
CSV
|
||
|
|
```
|
||
|
|
|
||
|
|
### Создание коллекции
|
||
|
|
|
||
|
|
Поддерживаются разные способы заполнения коллекции:
|
||
|
|
|
||
|
|
- ручной ввод;
|
||
|
|
- случайная генерация;
|
||
|
|
- загрузка из файла.
|
||
|
|
|
||
|
|
Для этого используются отдельные стратегии заполнения.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Использованные паттерны и подходы
|
||
|
|
|
||
|
|
| Паттерн / подход | Использование |
|
||
|
|
|---|---|
|
||
|
|
| Builder | создание объектов `Student` |
|
||
|
|
| Strategy | выбор алгоритма сортировки и способа заполнения коллекции |
|
||
|
|
| Composite | объединение критериев поиска |
|
||
|
|
| Custom Collector | преобразование Stream в `MyList` |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Технологии
|
||
|
|
|
||
|
|
- Java 21
|
||
|
|
- Maven
|
||
|
|
- JUnit 5
|
||
|
|
- Apache Commons CSV
|
||
|
|
- Java Stream API
|
||
|
|
- Git
|
||
|
|
- GitHub
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Команда
|
||
|
|
|
||
|
|
| Участник | GitHub | Основная зона ответственности |
|
||
|
|
|---|---|---|
|
||
|
|
| **Володин Герман** | — | архитектура приложения, Console UI, интеграция компонентов |
|
||
|
|
| **Артющик Анастасия** | `AnastasiArchi` | `Student`, `StudentBuilder`, even-only sorting |
|
||
|
|
| **Дюрягин Данил** | — | сортировка, `Comparator`, Composite Search |
|
||
|
|
| **Гаджикурбанов Темирлан** | `t1-f` | собственная коллекция, Collector, Random Generator, поиск вхождений |
|
||
|
|
| **Ершов Владислав** | `Vladislav-E-N` | CSV Reader/Writer, DataSource, обработка файлов |
|
||
|
|
|
||
|
|
> Компоненты проекта разрабатывались параллельно и в ходе интеграции дорабатывались несколькими участниками. В таблице указаны основные зоны ответственности.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Тестирование
|
||
|
|
|
||
|
|
Основные компоненты проекта покрыты unit-тестами с использованием **JUnit 5**.
|
||
|
|
|
||
|
|
Проверяются:
|
||
|
|
|
||
|
|
- модель `Student` и валидация;
|
||
|
|
- `equals()` / `hashCode()`;
|
||
|
|
- алгоритмы сортировки;
|
||
|
|
- even-only sorting;
|
||
|
|
- собственная коллекция;
|
||
|
|
- Custom Collector;
|
||
|
|
- поиск;
|
||
|
|
- генерация данных;
|
||
|
|
- CSV Reader/Writer.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Документация
|
||
|
|
|
||
|
|
### Задания и компоненты
|
||
|
|
|
||
|
|
- [Общее задание](TASK.ru.md)
|
||
|
|
- [Student](docs/tasks/Student.md)
|
||
|
|
- [Обновление Student](docs/tasks/StudentUpdate.md)
|
||
|
|
- [Собственная коллекция](docs/tasks/CustomList.md)
|
||
|
|
- [Сортировка](docs/tasks/Sorting.md)
|
||
|
|
- [Even-only sorting](docs/tasks/EvenOnlySortStrategy.md)
|
||
|
|
- [Composite Search](docs/tasks/CompositeStudentSearch.md)
|
||
|
|
- [Поиск вхождений](docs/tasks/StudentOccurrenceIndexFinder.md)
|
||
|
|
- [CSV Reader / Writer](docs/tasks/CsvStudentIO.md)
|
||
|
|
- [Stream и собственная коллекция](docs/tasks/StreamCollection.md)
|
||
|
|
- [Тестирование](docs/tasks/Testing.md)
|
||
|
|
|
||
|
|
### Git и командная разработка
|
||
|
|
|
||
|
|
- [Правила создания коммитов](CONTRIBUTING.ru.md)
|
||
|
|
- [Работа с зависимостями между ветками](GIT_BRANCH_DEPENDENCIES.ru.md)
|
||
|
|
- [Настройка Git](GIT_CONFIG.ru.md)
|
||
|
|
- [Восстановление после force-with-lease](GIT_FORCE_WITH_LEASE_RECOVERY.ru.md)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Запуск
|
||
|
|
|
||
|
|
`pom.xml` находится в директории `app`.
|
||
|
|
|
||
|
|
Перейдите в директорию приложения:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd app
|
||
|
|
```
|
||
|
|
|
||
|
|
Соберите проект:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
mvn clean package
|
||
|
|
```
|
||
|
|
|
||
|
|
Запустите собранное приложение:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
java -jar target/app-1.0-SNAPSHOT.jar
|
||
|
|
```
|
||
|
|
|
||
|
|
Основной класс приложения:
|
||
|
|
|
||
|
|
```text
|
||
|
|
ru.project.App
|
||
|
|
```
|