Un intervalle est l'espace de temps qui sépare deux dates (date de début et date de fin).
Le billet Always use [closed, open) intervals explique pourquoi il vaut mieux les implémenter en [fermé, ouvert) plutôt que [fermé, fermé].
Ce sont les personnes de Xerox qui ont constaté que les intervalles [fermés, fermés] conduisent à un code plus complexe et plus bogué.
Ils ont l'air agréables et symétriques, et fonctionnent la plupart du temps, mais ils peuvent conduire à des cas particuliers compliqués à gérer.
Qu'est-ce qu'un intervalle [fermé, ouvert) ?
[a, b) signifie :
a <= x < b- soit l'ensemble des valeurs de
ainclus àbexclu - exemple :
[0,5) == 0, 1, 2, 3, 4
Ne jamais utiliser d'intervalle [fermé, fermé]
Sous peine de devoir ajouter du code pour gérer les cas particuliers suivants.
Intervalle vide
Pour décrire un intervalle vide qui commence au temps T=1 :
- avec
[closed, open):[T,T)suffit - avec
[closed, closed]:[T, T]est égal au pointT, ça nécessite de bricoler une solution[T, T-1]qui ne fonctionnerait pas avecTdécimal
Regroupement du temps
Pour faire des regroupement par heure de la journée, il faut "diviser" les 24 heures de la journée en intervalles d'une heure :
- avec
[closed, open):[0,1), [1,2), [2,3), [3,4), … [23,24) - avec
[closed, closed]:[0,0:59:59], [1, 1:59:59], … [23,23:59,59]- ça force une précicion dans l'ensemble du système
- les événements entre
0:59:59et1seront perdus
Calcul de la longueur d'un intervalle
- avec
[a, b):durée = b - a - avec
[a, b], il y a des cas particuliers :- la longueur de
[a, a-1]peut être égale à 0 - ou bien elle peut être négative si
a < 1
- la longueur de
Addition des intervalles
Idéalement, la division d'un intervalle en deux doit donner deux intervalles dont la somme est égale à la longueur de l'intervalle d'origine.
Par exemple, si l'on divise les heures d'une journée en deux intervalles, on obtient deux intervalles de longueur 12, soit 12 + 12 = 24.
Cette propriété est perdue lorsque l'on utilise des intervalles [a, b].