Sto davvero riconsiderando la mia attuale gerarchia di classi per timeslot (in un programma). Volevo renderli il più flessibili possibile in modo da coprire molte possibilità di ciò che potremmo capire come un periodo di applicazione, così ho finito con questo progetto:
Tutte le timeslot condividono un ordine cronologico / gerarchico, quindi siamo in grado di definire funzioni di confronto. Fornisce i mezzi più basilari per determinare se una finestra temporale viene prima o dopo un'altra.
public interface Timeslot extends Comparable<Timeslot> {
int getChronologicalOrder();
}
Questa è la finestra temporale "base", ha solo un numero intero di ordine cronologico.
public class AbstractTimeslot extends Entity implements Timeslot {
protected final int chronologicalOrder;
}
Questo è per le finestre temporali che definiscono un intervallo, ovvero l'intervallo della finestra temporale nella pianificazione, ad esempio 10 minuti, 1 ora, 3 giorni, ecc. Per rappresentare questo, utilizziamo un membro TemporalAmount
. Tuttavia, il punto di partenza del periodo di applicazione è sconosciuto o irrilevante.
public abstract class RangedTimeslot extends AbstractTimeslot {
protected final TemporalAmount duration;
}
Quindi abbiamo questa finestra temporale simile alla precedente, ma definisce un punto di partenza definito utilizzando l'interfaccia Java% TemporalAccessor
. In questo modo possiamo dire quando inizia un intervallo temporale, come un particolare giorno o un'ora con LocalDate
, LocalTime
, DayOfWeek
, ecc.
public class DefiniteTimeslot extends RangedTimeslot {
protected final TemporalAccessor start;
}
Infine c'è questa finestra temporale che non definisce una durata perché è sconosciuta o irrilevante, ma conosciamo l'ora di inizio. È esattamente come RangedTimeslot
, ma volevo mantenere quest'ultimo come una classe abstract
nel caso in cui avessimo bisogno di un'ulteriore espansione della gerarchia.
public class UndefiniteTimeslot extends RangedTimeslot {}
Visivamente, ecco come appare la gerarchia:
Oramichiedosequestostarendendolecosepiùdifficilidiquantononsianoinrealtà.IlprimograndemurochestoaffrontandoconquestodesignècheorahobisognodiserializzareedeserializzarecomeJSONmoltedellemieclassi,comeTournament
eSchedule
,eincludonoquesteclassiditimeslot.Questotipodipolimorfismorendequasiuninfernoaffrontarelaserializzazioneeladeserializzazione(stousandoJackson),quindihoiniziatoachiedermisequestoèunbuonprogettoesesarebbeunabuonaidea"semplificarlo". Dovrei ancora affrontare il problema del polimorfismo di TemporalAmount
e TemporalAccessor
, ma è inevitabile.
Penso che l'altro modo di pensare a questo scenario sia tagliare l'intero albero e lasciare solo una Timeslot
di classe con Optional
membri, quindi ogni situazione in cui vogliamo tempi di inizio indefiniti e / o intervallo temporale non definito sono coperti. Ci ritroveremmo con una classe in più o come quella che segue:
public class Timeslot extends Comparable<Timeslot> {
private int chronologicalOrder;
private final Optional<TemporalAccessor> start;
private final Optional<TemporalAmount> duration;
public Timeslot(int c) {
chronologicalOrder = c;
start = Optional.empty();
duration = Optional.empty();
}
public Timeslot(int c, TemporalAccessor s) {
chronologicalOrder = c;
start = s;
duration = Optional.empty();
}
public Timeslot(int c, TemporalAmount d) {
chronologicalOrder = c;
start = Optional.empty();
duration = d;
}
public Timeslot(int c, TemporalAccessor s, TemporalAmount d) {
chronologicalOrder = c;
start = s;
duration = d;
}
}
Quale pensi che sia il miglior design? Devo scaricare la mia attuale gerarchia e prendere l'ultima soluzione? Sarebbe più facile testare la lezione? (Ho già dei test per il design attuale)