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