Toujours utiliser des intervalles [fermés, ouverts)

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 point T, ça nécessite de bricoler une solution [T, T-1] qui ne fonctionnerait pas avec T 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 et 1 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

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].

Avant Aperçu des fonctions de confidentialité des navigateurs Après ExitStack en Python

Tag Kemar Joint