275 lines
8.6 KiB
Markdown
275 lines
8.6 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
|
||
```
|
||
|
||
### Особенности сборки и запуска приложения под Windows
|
||
|
||
В `pom.xml` добавить:
|
||
|
||
```xml
|
||
```
|
||
|
||
Соберите проект:
|
||
|
||
```bash
|
||
mvn clean package
|
||
```
|
||
|
||
Запустите собранное приложение:
|
||
|
||
```bash
|
||
javaw -jar target/app-1.0-SNAPSHOT.jar
|
||
``` |