Это был камень преткновения.Предупреждение: следующее не вопрос, скорее объяснение того, что я придумал.У меня вопрос - есть ли у вас лучший способ сделать это?Есть ли какая-то распространенная техника для этого, с которой я не знаком?Похоже, это тривиальная проблема.
Итак, у вас есть модель задач.Вы можете создавать задания, выполнять их, уничтожать их.Тогда у вас есть повторяющиеся задачи.Это как обычная задача, но к ней прикреплено правило повторения.Тем не менее, задачи могут повторяться бесконечно - вы можете пойти на год вперед в расписании, и вы должны увидеть, как задача появляется.
Поэтому, когда пользователь создает повторяющуюся задачу, вы не хотите создавать тысячизадачи на сто лет в будущее, и сохранить их в базе данных, верно?Поэтому я начал думать - как вы их создаете?
Один из способов - создать их при просмотре расписания.Таким образом, когда пользователь перемещается на месяц вперед, будут созданы любые повторяющиеся задачи.Конечно, это означает, что вы больше не можете просто работать с записями задач в базе данных.Каждая операция SELECT для задач, которые вы когда-либо выполняете, должна быть в контексте определенного диапазона дат, чтобы запускать повторяющиеся задачи в этом диапазоне дат для сохранения.Это бремя обслуживания и производительности, но выполнимое.
Хорошо, но как насчет первоначальной задачи?Каждая повторяющаяся задача связывается с правилом повторения, которое ее создало, и каждому правилу повторения необходимо знать исходную задачу, которая запустила повторение.Последнее важно, потому что вам нужно клонировать исходную задачу в новые даты, когда пользователь просматривает их расписание.Я думаю, выполнимо тоже.
Но что произойдет, если исходное задание будет обновлено?Это означает, что теперь, когда мы просматриваем расписание, мы будем создавать повторяющиеся задачи, клонированные из измененной задачи.Это нежелательно.Все неявно сохраняющиеся повторяющиеся задачи должны отображать то, как исходная задача выглядела при добавлении повторения.Поэтому нам нужно хранить копию исходной задачи отдельно и клонировать ее, чтобы возобновить работу.
Однако, когда пользователь перемещается по задачам в расписании, как мы узнаем, чтоконкретный момент новая задача повторения должна быть создана?Мы просим правило повторения: «Эй, я должен сохранить задачу на этот день?»и это говорит да или нет.Если на этот день уже есть задача для этого повторения, мы ее не создаем.Все хорошо, кроме того, что пользователь также сможет просто удалить одну из повторяющихся задач, которая была автоматически сохранена.В этом случае, следуя нашей логике, система заново создаст задачу, которая была удалена.Нехорошо.Таким образом, это означает, что мы должны продолжать сохранять задачу, но пометить ее как удаленную задачу для этого повторения.Мех.
Как я сказал в начале, я хочу знать, занимался ли кто-нибудь еще этой проблемой и может ли дать здесь архитектурный совет.Это должно быть так грязно?Есть ли что-нибудь более изящное, что мне не хватает?
Обновление : поскольку на этот вопрос сложно ответить идеально, я одобрю наиболее полезную информацию о дизайне / архитектуре, которая лучше всего помогаетсоотношение компромиссов для этого типа проблемы.Он не должен охватывать все детали.