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
a
inclus àb
exclu - 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 avecT
dé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:59
et1
seront 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]
.