Contesto
Sto facendo una classe di servizio che funziona essenzialmente come un calcolatore di business datetime. Cioè, può eseguire vari calcoli come ad esempio la data è X giorni lavorativi da una determinata data, quando è l'inizio della prossima data di lavoro, è una data specifica in orario di lavoro, ecc.
Il problema è che questa classe deve prendere vari parametri che lo rendono un po 'più complesso. In particolare, le ore di lavoro e le festività definite dall'utente vengono passate quando la classe viene inizializzata; tutti i metodi che eseguono questi calcoli datetime aziendali devono tenere conto di tali orari di lavoro e festività. Le ore di lavoro sono definite da un dizionario che mappa i giorni della settimana alle ore di lavoro di ciascuno di quei giorni. Ciò significa che questa classe deve gestire orari di lavoro "non standard", come martedì-giovedì 14: 00-01: 00, venerdì-sabato 16: 00-03: 00. (Sto definendo ciò che un programma di lavoro "standard" e "non standard" si basa su una metrica che ho elaborato - non è importante per questa domanda come sono definiti).
Le pianificazioni di lavoro standard sono facili da gestire, mentre le pianificazioni di lavoro non standard rendono le cose più complesse. Ho pensato a come affrontare questo problema e sono giunto alla conclusione che l'implementazione di questi calcoli dovrebbe differire tra i piani di lavoro standard e non standard. Cioè, per ogni metodo, se abbiamo a che fare con una pianificazione di lavoro standard, fai X; se abbiamo a che fare con una pianificazione non standard, fai Y.
Domanda
Qual è la migliore pratica per impostare questa classe? Ecco le opzioni a cui posso pensare:
-
Ogni metodo dovrebbe avere solo un'istruzione if / else:
if (standardWorkSchedule) { // do standard work schedule stuff } else { // do non-standard work schedule stuff }
-
Crea un'interfaccia,
IBusinessDateTime
, con tutti i metodi per i calcoli aziendali datetime. Quindi, crea due classi di servizio distinte,StandardBusinessDateTime : IBusinessDateTime
eNonStandardBusinessDateTime : IBusinessDateTime
, che implementano questa interfaccia.StandardBusinessDateTime
implementerà la logica di pianificazione del lavoro standard per i suoi metodi, mentreNonStandardBusinessDateTime
implementerà la logica di pianificazione del lavoro non standard. Infine, crea una classe intermedia aggiuntiva,BusinessDateTime : IBusinessDateTime
, che includa il piano di lavoro e determini se è standard o non standard. Ovunque che utilizza questa classe di servizio è sufficiente chiamare i metodi di questa classe intermedia e scaricare il lavoro effettivo nelle altre due classi. Se è standard, usaStandardBusinessDateTime
; se non è standard, usaNonStandardBusinessDateTime
.
Non ho molta familiarità con i modelli di progettazione, quindi è possibile che sto descrivendo un problema abbastanza comune e di base, e le soluzioni che ho proposto sono schemi di progettazione comunemente utilizzati. Sento che l'opzione 2 è la soluzione migliore, ma voglio solo assicurarmi. Inoltre, sono sicuro che ci sono altre e forse migliori soluzioni - apprezzo ogni aiuto che posso ottenere con questo.
Infine, voglio sottolineare che sono non a chiedere una delle seguenti cose :
-
Come implementare un calcolatore di data / ora aziendale
-
Come definire pianificazioni di lavoro standard e non standard
-
Se dovessi occuparmi anche di pianificazioni di lavoro non standard