Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 0 additions & 86 deletions Test/manager/InMemoryHistoryManagerTest.java

This file was deleted.

5 changes: 5 additions & 0 deletions src/manager/HistoryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
import java.util.List;

public interface HistoryManager {

void add(Task task);

void remove(int id);

List<Task> getHistory();

}
118 changes: 110 additions & 8 deletions src/manager/InMemoryHistoryManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,122 @@

import java.util.*;


public class InMemoryHistoryManager implements HistoryManager {
private final List<Task> history = new ArrayList<>();
private static class CustomLinkedList {

Choose a reason for hiding this comment

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

private static class CustomLinkedList {

Это класс можно было и не создавать, а его методы реализовать как приватные методы менеджера истории.
Необязательно, на Ваше усмотрение.

private final Map<Integer, Node> table = new HashMap<>();
private Node head;
private Node tail;

private static class Node {
private Task task;
private Node prev;
private Node next;

public Task getTask() {
return task;
}

public void setTask(Task task) {
this.task = task;
}

public Node getPrev() {
return prev;
}

public void setPrev(Node prev) {
this.prev = prev;
}

public Node getNext() {
return next;
}

public void setNext(Node next) {
this.next = next;
}
}

private void linkLast(Task task) {
Node element = new Node();
element.setTask(task);

if (table.containsKey(task.getId())) {
removeNode(table.get(task.getId()));
}

if (head == null) {
tail = element;
head = element;
element.setNext(null);
element.setPrev(null);
} else {
element.setPrev(tail);
element.setNext(null);
tail.setNext(element);
tail = element;
}

table.put(task.getId(), element);
}

private List<Task> getTasks() {
List<Task> result = new ArrayList<>();
Node element = head;
while (element != null) {
result.add(element.getTask());
element = element.getNext();
}
return result;
}

private void removeNode(Node node) {
if (node != null) {
table.remove(node.getTask().getId());
Node prev = node.getPrev();
Node next = node.getNext();

if (head == node) {
head = node.getNext();
}
if (tail == node) {
tail = node.getPrev();
}

if (prev != null) {
prev.setNext(next);
}

if (next != null) {
next.setPrev(prev);
}
}
}

private Node getNode(int id) {
return table.get(id);
}
}

private final CustomLinkedList list = new CustomLinkedList();

// Добавление нового просмотра задачи в историю
@Override
public void add(Task task) {
if (history.size() >= 10) {
history.remove(0);
}
history.add(task);
list.linkLast(task);
}

// Удаление просмотра из истории
@Override
public void remove(int id) {
list.removeNode(list.getNode(id));
}

// Получение истории просмотров
@Override
public List<Task> getHistory() {
return List.copyOf(history);
return list.getTasks();
}
}
}


33 changes: 17 additions & 16 deletions src/manager/InMemoryTaskManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,13 @@ public Subtask addSubtask(Subtask subtask) {
return subtask;
}

@Override
public Task updateTask(Task task) {
Integer taskID = task.getId();
if (taskID == null || !tasks.containsKey(taskID)) {
return null;
public Task updateTask(Task updatedTask) {
Task existingTask = getTaskByID(updatedTask.getId());
if (existingTask != null) {
historyManager.add(new Task(existingTask)); // Добавляем старую версию в историю
tasks.put(updatedTask.getId(), updatedTask);
}
tasks.replace(taskID, task);
return task;
return existingTask;
}

@Override
Expand Down Expand Up @@ -92,7 +91,6 @@ public Subtask updateSubtask(Subtask subtask) {
int epicID = subtask.getEpicID();
Subtask oldSubtask = subtasks.get(subtaskID);
subtasks.replace(subtaskID, subtask);
// обновляем подзадачу в списке подзадач эпика и проверяем статус эпика
Epic epic = epics.get(epicID);
ArrayList<Subtask> subtaskList = epic.getSubtaskList();
subtaskList.remove(oldSubtask);
Expand Down Expand Up @@ -186,14 +184,17 @@ public void deleteEpicByID(int id) {
@Override
public void deleteSubtaskByID(int id) {
Subtask subtask = subtasks.get(id);
int epicID = subtask.getEpicID();
subtasks.remove(id);
// обновляем список подзадач и статус эпика
Epic epic = epics.get(epicID);
ArrayList<Subtask> subtaskList = epic.getSubtaskList();
subtaskList.remove(subtask);
epic.setSubtaskList(subtaskList);
updateEpicStatus(epic);
if (subtask != null) {
int epicID = subtask.getEpicID();
subtasks.remove(id);
// Remove from history
historyManager.remove(id);
Epic epic = epics.get(epicID);
ArrayList<Subtask> subtaskList = epic.getSubtaskList();
subtaskList.remove(subtask);
epic.setSubtaskList(subtaskList);
updateEpicStatus(epic);
}
}

@Override
Expand Down
21 changes: 21 additions & 0 deletions src/manager/TaskManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,45 @@
import java.util.List;

public interface TaskManager {

Task addTask(Task task);

Epic addEpic(Epic epic);

Subtask addSubtask(Subtask subtask);

Task updateTask(Task task);

Epic updateEpic(Epic epic);

Subtask updateSubtask(Subtask subtask);

Task getTaskByID(int id);

Epic getEpicByID(int id);

Subtask getSubtaskByID(int id);

ArrayList<Task> getTasks();

Choose a reason for hiding this comment

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

ArrayList

Вообще в качестве типов, возвращаемых из методов, не стоит использовать типы конкретных реализаций, лучше использовать более высокие абстракции, List<..>, Map<..> или даже Collection<..> Детали реализации лучше скрывать :)
Необязательно, на Ваше усмотрение.


ArrayList<Epic> getEpics();

ArrayList<Subtask> getSubtasks();

ArrayList<Subtask> getEpicSubtasks(Epic epic);

void deleteTasks();

void deleteEpics();

void deleteSubtasks();

void deleteTaskByID(int id);

void deleteEpicByID(int id);

void deleteSubtaskByID(int id);

List<Task> getHistory();

}
1 change: 1 addition & 0 deletions src/model/Subtask.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public String toString() {
", status=" + getStatus() +
'}';
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down
Loading
Loading