47 votes

Question de conception: Comment concevriez-vous un système d’événements récurrents?

Si vous avez été chargée de construire un événement système de planification qui ont soutenu des événements récurrents, comment le feriez-vous? Comment gérez-vous lorsqu'un événement récurrent est retiré? Comment pourriez-vous voir quand les événements futurs qui va arriver?

c'est à dire Lors de la création d'un événement, vous pouvez choisir "répéter tous les jours" (ou hebdomadaire, annuelle, etc).

Une conception par réponse s'il vous plaît. Je suis habitué à Ruby/Rails, mais utiliser ce que vous voulez exprimer la conception.

On m'a demandé lors d'une interview, et ne pouvait pas venir avec une très bonne réponse que j'ai aimé.

Note: a été déjà posé la question/réponse ici. Mais j'espérais avoir plus de détails pratiques, comme détaillé ci-dessous:

  • S'il était nécessaire d'être en mesure de commenter ou sinon ajouter des données à une seule instance de l'événement récurrent, comment cela fonctionnerait-il?
  • Comment événement modifications et suppressions de travail?
  • Comment calculez-vous lorsque des événements futurs se produisent?

11voto

Lars Truijens Points 24005

Martin Fowler a écrit un article sur is. Voir http://martinfowler.com/apsupp/recurring.pdf

10voto

Greg Ogle Points 3964

J'ai commencé par la mise en œuvre de certaines expression temporelle comme décrit par Martin Fowler. Cela prend soin de déterminer quand une prévue élément doit effectivement se produire. C'est un moyen très élégant de le faire. Ce que j'ai est juste une accumulation de ce qui est dans l'article.

Le problème suivant a été de comprendre comment dans le monde pour stocker les expressions. L'autre problème, c'est quand vous lisez l'expression, comment ils s'insèrent dans une dynamique de l'interface utilisateur? On parlait juste de la sérialisation les expressions dans un BLOB, mais il serait difficile de marcher de l'arborescence d'expression pour savoir ce que signifie il.

La solution (dans mon cas) est de stocker les paramètres qui correspondent à un nombre limité de cas, l'Interface Utilisateur de soutien, et à partir de là, utiliser cette information pour générer les Expressions Temporelles à la volée (peut sérialiser lors de la création d'optimisation). Donc, le Calendrier de la classe finit par avoir plusieurs paramètres comme l'offset, la date de début, date de fin, le jour de la semaine, et ainsi de suite... et de ce que vous pouvez générer le Temporel des Expressions pour faire le travail.

Comme pour avoir des instances des tâches, il y a un "service" qui génère des tâches pour N jours. Puisque c'est une intégration à un système existant et de toutes les instances sont nécessaires, cela fait sens. Cependant, une API comme cela peut facilement être utilisé pour projeter les récidives sans stocker toutes les instances.

3voto

bdukes Points 54833

2voto

Joe Philllips Points 13616

Je devais le faire auparavant lorsque je gérais la fin du projet de la base de données. J'ai demandé que chaque événement soit stocké en tant qu'événements séparés. Cela vous permet de supprimer une seule occurrence ou de déplacer une étendue. Il est beaucoup plus facile de supprimer des multiples que d'essayer de modifier une seule occurrence et de la transformer en deux. Nous avons ensuite pu créer un autre tableau contenant simplement un ID de récurrence qui contenait les informations sur la récurrence.

0voto

henriksen Points 745

Lors de l'enregistrement de l'événement, je voudrais enregistrer la planification d'un magasin (nous allons l'appeler "Horaires" et je voudrais calculer lorsque l'événement a été le feu à la prochaine fois et enregistrer ainsi, par exemple, dans les "Événements". Ensuite, je regarde dans "Événements" et la figure la date du prochain événement était de prendre place et d'aller dormir jusqu'alors.

Lorsque l'application "se réveille" il serait à calculer lors de l'événement devrait avoir lieu encore une fois, les stocker dans "Événements", puis à nouveau célébrer l'événement.

Répétez.

Si un événement est créé pendant le sommeil le sommeil est interrompu et recalculé.

Si l'application est de commencer ou de récupération à partir d'un sommeil événement ou similaire, cochez la case "Événements" pour les événements passés, et agir en conséquence (selon ce que vous voulez faire avec les événements manqués).

Quelque chose qui serait flexible et de ne pas prendre inutilement des cycles de PROCESSEUR.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X