Cada línea de tiempo CER tiene algunas propiedades importantes que necesitará conocer antes de
trabajar con líneas de tiempo en los conjuntos de reglas CER, pruebas de regla y cualquier código que
sea un cliente de CER:
- cada línea de tiempo CER es inmutable (como todos los tipos de datos utilizados en CER);
- cada referencia a la línea de tiempo se parametriza con el tipo de valor mantenido en la
línea de tiempo, que pueden ser primitivas como String, Date, Number, Boolean etc. o
un tipo complejo arbitrario, como una clase de regla u otro tipo parametrizado como
List. En cuanto a otros tipos parametrizados en CER, el propio parámetro debe ser un objeto inmutable;
- cada línea de tiempo de CER se extiende infinitamente lejos en el pasado y infinitamente lejos
en el futuro1. En otras palabras, cada
línea de tiempo de CER tiene un valor en cualquier fecha, sin importar lo lejos que pueda estar
esa fecha en el pasado o el futuro;
- cuando se crea una línea de tiempo de CER, la línea de tiempo se dividirá en una colección
de intervalos, cada uno de los cuales contendrá un valor constante durante un periodo de
tiempo dentro de la línea de tiempo. Los intervalos contiguos siempre tienen valores diferentes
2, de
lo contrario se hubieran fusionado en un solo intervalo.
Cada línea de tiempo de CER se extiende infinitamente lejos en el pasado e infinitamente
lejos en el futuro;
Hay varias consecuencias de estas propiedades:
- no es posible tener un "hueco" en medio de una línea de tiempo: todos los intervalos de
una línea de tiempo son contiguos;
- no es posible tener una línea de tiempo que se inicia en una fecha determinada; en
determinadas circunstancias será necesario elegir un valor predeterminado sensible, por
ejemplo si tiene una línea de tiempo<Número> para los ingresos
que proceden de un empleo, esos ingresos deben ser 0 en todas las fechas antes de la fecha
de inicio de empleo;
- no es posible tener una línea de tiempo que finalice en una fecha determinada:
el último valor de la línea de tiempo se aplica "hasta nuevo aviso", es decir de forma
arbitraria en el futuro; en determinadas circunstancias se deberá elegir
un valor predeterminado razonable, por ejemplo si tiene una línea de tiempo<Número>
para los ingresos procedentes de un empleo, si hay una fecha final conocida para ese empleo,
los ingresos deben ser 0 en todas las fechas posteriores a la finalización del empleo;
de lo contrario, si no hay ninguna fecha final conocida para ese empleo, se deben
aplicar los ingresos más recientes hasta nuevo aviso;
- fallará cualquier intento de crear una línea de tiempo que no tenga un valor para cualquier
fecha. En particular, cada línea de tiempo debe tener un valor que se aplique desde el
inicio del tiempo, representado por una fecha de inicio de null;
- cada línea de tiempo puede contener un número finito de cambios de valor. Esto presenta
una limitación para las líneas de tiempo que representan valores que cambian un número arbitrario
de veces. Por ejemplo, puede tener una línea de tiempo<Número> para representar la edad de
una persona, con el valor 0 hasta el primer cumpleaños de la persona, el valor 1 hasta
el segundo cumpleaños de la persona y así sucesivamente. Para personas que aún están vivas,
no es posible predecir cuántos cumpleaños más tendrán y, por lo tanto, se debe imponer un
límite práctico (por ejemplo 200). En la práctica, esta limitación no debe presentar ninguna
dificultad.
2 Los valores iguales/diferentes se detectan mediante la semántica de
Object.equals(...) de Java. Todos los tipos utilizados como tipo parametrizado
en la línea de tiempo deben tener implementaciones sensibles de
Object.equals(...) y
Object.hashCode().