Skip to content

Conversation

@Slavakorgg
Copy link
Owner

No description provided.

Copy link

@EugeneLenkevich EugeneLenkevich left a comment

Choose a reason for hiding this comment

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

Привет, Вячеслав! Спасибо за PR.

Отличная работа! :)
Есть совсем небольшие пометки, посмотри комментарии ниже, пожалуйста

В первую очередь переделать бы исключение в проверяемое и сделать на него тест, остальное в принципе мелочи. НУ и закомментированный код лучше не оставлять, толку не особо, но заметно захлямляет

@@ -0,0 +1,8 @@
package exception;

public class IntersectionException extends RuntimeException {

Choose a reason for hiding this comment

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

extends Exception

Тут наверно лучше проверяемое исключение, то что задачи пересеклись - это же ожидаемая ситуация, а не непредвиденная ошибка :)

return o1.getStartTime().compareTo(o2.getStartTime());
}
};
private TreeSet<Task> prioritizedTasks = new TreeSet<>(comparator);

Choose a reason for hiding this comment

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

private Set prioritizedTasks = ...

Давай, все таки, будем использовать абстрактные интерфейсы как типы переменных, можно даже Collection. По сути дела это сокрытие деталей внутренней реализации, упрощение кода

subtasks.put(subtask.getId(), subtask);
subtask.getEpic().getSubtaskList().put(subtask.getId(), subtask);
if (subtask.getStartTime() != null) { //для создания сабтасок без времени в конструкторе.
// Может есть смысл в принципе убрать возможность создавать таски без времени, но пока не уверен

Choose a reason for hiding this comment

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

Пусть будет, не сильно мешает же

List<Task> intersectionList = getPrioritizedTasks().stream()
.filter(task1 -> newTask.getStartTime().isBefore(task1.getEndTime()) && newTask.getEndTime().isAfter(task1.getStartTime()))
.collect(Collectors.toList());
if (!intersectionList.isEmpty()) {

Choose a reason for hiding this comment

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

вместо .collect(Collectors.toList()) можно было попробовать сделать, например, anyMatch() и обойтись без цикла :)

image

https://www.baeldung.com/java-streams-findany-anymatch

.stream()
.filter(task -> task.getStartTime() != null)
.collect(Collectors.toList());
prioritizedTasks.addAll(notNullTasks);

Choose a reason for hiding this comment

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

Кстати, а нужен ли тут TreeSet если можно было список отсортировать и получилось бы то же самое ...

Он бы был очень кстати если бы мы при добавлении задач сразу их складывали в TreeSet, тогда бы у нас был всегда отсортированный список, а тут мы его сортируем при каждом обращении, можно был любую коллекцию использовать :)

taskManager.createSubtask(subtask2);
assertEquals(epic1.getStatus(), Status.IN_PROGRESS);

}

Choose a reason for hiding this comment

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

Хорошо бы еще исключение при пересечении задач протестировать :)

Copy link

@EugeneLenkevich EugeneLenkevich left a comment

Choose a reason for hiding this comment

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

Моментик с исключением

if (intersection) {
throw new IntersectionException("Задача " + newTask.getName() + " пересекается с уже существующей");
}
} catch (IntersectionException e) {

Choose a reason for hiding this comment

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

Что то не то, мы кидаем проверяемое исключение чтобы обернуть тут же в менеджере в непроверяемое. В таком виде так не делают :)
Достаточно не ловить это исключение. Компилятор добавит его в сигнатуру метода, ну и хватит в рамках этого задания. А в целом, так мы обяжем внешний код обрабатывать ситуацию пересечения задач. Внешний код добавляет задачу, вот пусть и решает что делать с тем что данные не корректны

А тест ок, в нем только тип исключения поменять надо будет :)

Copy link

@EugeneLenkevich EugeneLenkevich left a comment

Choose a reason for hiding this comment

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

Ага, именно так. Мы в общем случае не знаем как обрабатывать эту ситуацию и вот, с помощью таких исключений, мы делегируем эту проверку на уровень выше. Причем работает это на уровне компилятора. Вышестоящий код обязан или обработать ситуацию или выбросить еще выше. Если же совсем никто не перехватит исключение, то приложение будет вовсе падать так как поведение получится неопределенным.
Еще важная особенность - проверяемое исключение есть в бизнес-процессе потому мы его явно и объявляем в сигнатурах методов и пр. В отличие от непроверяемых которых в БП нет, предугадать их невозможно и означают они вообще другое - дефекты в самих алгоритмах :)

@Slavakorgg Slavakorgg merged commit 6c629a4 into main Dec 13, 2024
1 check passed
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.

4 participants