Skip to content

Sprint 7 solution in file manager#2

Open
DokPlay wants to merge 21 commits intomainfrom
sprint_7-solution-in-file-manager
Open

Sprint 7 solution in file manager#2
DokPlay wants to merge 21 commits intomainfrom
sprint_7-solution-in-file-manager

Conversation

@DokPlay
Copy link
Copy Markdown
Owner

@DokPlay DokPlay commented Aug 7, 2025

Sprint 7 – File Manager: автосохранение в CSV + фиксы
Суть
Добавил автосохранение состояния в файл с восстановлением после перезапуска
Раньше данные жили только в памяти и пропадали

Основные изменения
Новый FileBackedTaskManager
Автосохранение в CSV после каждого изменения
Восстановление состояния с сохранением оригинальных ID
Поддержка пустых файлов и всех типов задач

Модель
Сериализация через toCsvRow()
Инкапсуляция subtaskIds в Epic
Валидация epicId в Subtask

Фиксы
Чистка истории при удалении задач
Корректная работа nextId после восстановления
Унифицированный стиль кода

Формат CSV

id,type,name,status,description,epic
3,TASK,Читать ТЗ,IN_PROGRESS,вникнуть,
1,EPIC,Спринт-7,NEW,Файл-менеджер,
2,SUBTASK,save(),NEW,реализовать,1

Как проверить
1 Запустить Main → создастся tasks.csv
2 Перезапустить через loadFromFile() → данные восстановятся
3 Все тесты зеленые (./gradlew test)

Важные моменты
Публичный API не изменился

Нет экранирования спецсимволов в CSV (по ТЗ)

Относительный путь к файлу (можно доработать)

Чек-лист

  • Автосохранение в файле после модификаций
  • Восстановление менеджера из CSV
  • Сохранение исходных id + корректный nextId
  • Тесты на историю и базовые сценарии
  • .gitignore и чистка артефактов

Sergey added 6 commits August 6, 2025 12:48
* src/manager/InMemoryHistoryManager.java
  + Реализован двусвязный список + HashMap<id,Node>
  + add(task) теперь удаляет дубликаты через removeNode за O(1)
  + remove(id) — новый метод HistoryManager

* src/manager/TaskManager.java
  + в интерфейс добавлен void remove(int id)

* src/manager/InMemoryTaskManager.java
  + вызовы historyManager.remove(...) в removeTask / removeEpic / removeSubtask

* src/manager/HistoryManager.java
  + объявлен метод remove(int id)

* tests
  + HistoryManagerTest — проверяет отсутствие дублей и порядок
  + InMemoryTaskManagerTest — проверка очистки истории при удалении,
    истории > 10, дубль-просмотров
  + TaskManagerHistoryIntegrationTest — интеграция: удаление эпика убирает
    эпик и все Subtask'и из истории

Issue: sprint-6 / ТЗ «неограниченная история без дублей»
Copy link
Copy Markdown

@LexLippi LexLippi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет!

Неплохая работа!

Есть некоторое количество замечаний. которые необходимо исправить!

Желаю удачи!

Comment thread out/production/java-kanban/Main$1.class Outdated
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Плохо, что эти классы попали в git, локально они уместны, но тут не нужны

Comment thread src/manager/FileBackedTaskManager.java Outdated
}

private void restore() {
if (!file.exists()) return;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В соответствии с Google Java Code Style надо добавить скобки:

https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used

Comment thread src/manager/FileBackedTaskManager.java Outdated
Comment on lines +46 to +48
List<Epic> epics = new ArrayList<>();
List<Task> tasks = new ArrayList<>();
List<Subtask> subtasks = new ArrayList<>();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Такое форматирование выглядит весьма странно :)

Comment thread src/manager/FileBackedTaskManager.java Outdated
r.readLine(); // пропускаем заголовок
String line;
while ((line = r.readLine()) != null) {
if (line.isBlank()) continue;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Аналогично про скобки

Comment on lines +56 to +61
Task t = fromCsv(line);
switch (t.getType()) {
case EPIC -> epics.add((Epic) t);
case TASK -> tasks.add(t);
case SUBTASK -> subtasks.add((Subtask) t);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Довольно странным выглядит сначала erasure типа до Task а потом снова кастинг его к конкретному значению, кажется, что этого можно избежать

Comment thread src/manager/FileBackedTaskManager.java Outdated


/*───────────── CSV ─────────────*/
private static String toCsv(Task t) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше в каждом типе задачи сделать метод toCsv тогда сможем воспользоваться преимуществами полиморфизма

Comment thread src/manager/FileBackedTaskManager.java Outdated
Comment on lines +68 to +70
for (Epic e : epics) super.addNewEpic(e);
for (Task t : tasks) super.addNewTask(t);
for (Subtask s : subtasks) super.addNewSubtask(s);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

При использовании этих методов изменятся существующие идентификаторы задач, чего бы не хотелось

import java.nio.file.Files;

/** Менеджер с автосохранением в CSV-файл. */
public class FileBackedTaskManager extends InMemoryTaskManager {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В целом советую добавить в Idea сheckstyle-плагин, он помогает избежать ошибок код стайла

Sergey added 15 commits August 9, 2025 00:25
… методах, сохранение исходных id
Copy link
Copy Markdown

@LexLippi LexLippi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет!

Хорошая работа!

Желаю удачи в следующих спринтах!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants