Merged
Conversation
jeggga
reviewed
Jun 24, 2025
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что было сделано
Согласно ТЗ финального задания спринта 8 в приложение были внесены следующие изменения:
Дополнительно:
В ходе работы на задачей было принято несколько компромиссных решений, не совсем точно соответствующих требованиям ТЗ:
Что:
Эпик не хранит отсортированный список своих подзадач для расчёта вычисляемых полей.
Почему:
Я решил не уходить от принципа разграничения слоёв приложения. Эпик не должен "знать" про менеджер или про подзадачи. Эпик хранит только ID (int) своих подздач, и управляется менеджером.
Как сделал:
Когда нужно обновить вычисляемые поля, менеджер вызывает у нужного эпика соответствующий метод и передаёт в виде аргумента уже отсортированный список его подзадач (менеджер знает про все эпики и все подзадачи).
Что:
Проверка на пересечение времени выполнения задач не использует StreamAPI и метод-предикат для сравнения. Дополнительное задание на поиск более оптимального алгоритма поиска пересечени за O(1) выполнено частично.
Почему:
Я рассматривал три возможных варианта поиска пересечений:
- StreamAPI + метод-предикат для сравнения. Относительно лаконичный и понятный способ, работает за O(n).
- Поиск "соседей" по дереву, и сравнение добавляемой задачи с задачей ДО и ПОСЛЕ неё на временной линии. Чуть более многословный, но работает за O(log n).
- Предложенный в подсказке к доп. заданию вариант через создание мапы со слотами бронирования интервалов по 15 минут. Очень многословный способ, потребуется написание большого количества кода, который потом легко может создать проблемы, но зато работает за O(k), где k - количество интервалов, которые нужно будет проверить. Будем считать, что это амортизированная O(1) сложность.
Я остановился на варианте поиска соседних задач в дереве. O(n) - намного медленнее чем O(log n) при минимальной разнице в сложности реализации, а вариант с O(1) даёт избыточную производительность, и при этом накладывает массу ограничений: чем точнее нужна сетка слотов, тем больше разрастётся структура для их хранения; ограничение времени планирования (а что, если я хочу запланировать задачу на 1 год и 1 день вперёд? переписывать метод?); если задача имеет длительность 16 минут, то она займёт два слота по 15 минут.
Как сделал:
Через методы TreeSet floor и ceiling находим потенциальных соседей по временной линии для добавляемой задачи, и проверяем пересечения только с ними.
Что:
В тесты не была добавлена проверка обязательного наличия связанного эпика у подзадачи.
Почему:
Аргумент epicId является обязательным в конструкторе подзадачи, но если жёстко проверять его на null - может всё поломаться при чтении из CSV, т.к. там может быть любая очерёдность добавления эпиков и подзадач. Например, подзадача уже загружена, а её эпик ещё нет - будет ложное срабатывание проверки.
Как сделал:
Невозможность создать подзадачу без эпика заложена на уровне архитектуры классов.