diff --git a/README b/README new file mode 100644 index 0000000..d587acd --- /dev/null +++ b/README @@ -0,0 +1,256 @@ +# Student Management Console Application + +Консольное Java-приложение для создания, хранения, сортировки, поиска и сохранения коллекций студентов. + +Проект разработан командой в рамках учебного задания и демонстрирует применение ООП, собственных коллекций, алгоритмов сортировки, Stream API, паттернов проектирования, CSV-ввода/вывода и unit-тестирования. + +--- + +## Возможности + +Приложение позволяет: + +- создавать коллекции студентов вручную; +- генерировать случайные данные; +- загружать студентов из CSV-файла; +- просматривать текущую коллекцию; +- сохранять коллекцию в CSV; +- сортировать студентов по номеру группы, среднему баллу и номеру зачётной книжки; +- выбирать алгоритм сортировки; +- выполнять специальную even-only сортировку; +- искать студентов по нескольким критериям; +- объединять критерии поиска через `И` / `ИЛИ`; +- подсчитывать количество вхождений студента; +- получать индексы найденных элементов. + +--- + +## Архитектура + +Основной поток данных: + +```text +Manual / CSV / Random + ↓ + Student + ↓ + MyList + ↓ + ┌─────┴─────┐ + ↓ ↓ + Sorting Search + │ │ + └─────┬─────┘ + ↓ + Console / CSV +``` + +Логика приложения разделена на отдельные функциональные области: модель данных, создание коллекции, хранение, сортировка, поиск, CSV-ввод/вывод и пользовательский интерфейс. + +--- + +## Основные компоненты + +### Student + +`Student` — основная модель данных приложения. + +Модель содержит данные студента, выполняет валидацию входных значений и определяет правила сравнения объектов через `equals()` и `hashCode()`. + +Для пошагового создания объектов используется `StudentBuilder`. + +### Custom Collection + +Для хранения студентов используются собственные: + +- `MyList`; +- `MyLinkedList`. + +Коллекция поддерживает основные операции работы с данными и интеграцию со Stream API. + +Для сбора результатов Stream обратно в `MyList` реализован собственный `MyListCollector`. + +### Sorting + +Система сортировки построена на паттерне **Strategy**. + +Доступны: + +- Merge Sort; +- Bubble Sort; +- even-only sorting. + +`SortStrategy` определяет алгоритм сортировки, а `Comparator` — поле, по которому сравниваются студенты. + +```text +SortStrategy + ↓ +КАК сортировать + +Comparator + ↓ +ПО КАКОМУ ПОЛЮ сортировать +``` + +### Search + +Поиск поддерживает несколько критериев: + +- номер группы; +- средний балл; +- номер зачётной книжки. + +Несколько условий могут объединяться через `И` / `ИЛИ`. + +Для составных условий используется паттерн **Composite**. + +Также реализован поиск количества вхождений студента и индексов найденных элементов. + +### CSV + +За работу с CSV отвечают: + +- `StudentCsvReader`; +- `StudentCsvWriter`. + +Загрузка данных: + +```text +CSV + ↓ +StudentCsvReader + ↓ +Student + ↓ +MyList +``` + +Сохранение: + +```text +MyList + ↓ +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 +```