Voglio esporre le API in python per il mio software di automazione del carico di lavoro. Ho una classe di lavoro come definito / descritto di seguito. L'istanza di questa classe di lavoro rappresenta una particolare esecuzione di lavoro. Il lavoro può avere più checkpoint e ogni checkpoint può avere più comandi.
Job
- JobName
- [JobCheckpoint]
- StartTime
- EndTime
- Status
- ...
JobCheckpoint
- JobCheckpointName
- [JobCommand]
- StartTime
- EndTime
- Status
- ...
JobCommand
- JobCommandName
- [Command]
- StartTime
- EndTime
- Status
- ...
Voglio le API utente per soddisfare i seguenti casi d'uso:
- Capacità di interrogare i lavori in base a un criterio (ad esempio, restituire lavori eseguiti in una determinata durata, restituire lavori in stato non riuscito, restituire checkpoint / comandi di un particolare lavoro e molti altri ...).
- Possibilità di creare ed eseguire lavori usando l'API Python.
- Possibilità di prendere azioni di controllo come rieseguire già il lavoro, uccidere il lavoro in esecuzione ecc.
Sto pensando di fornire il seguente metodo nella mia API utente.
get_jobs(Filter) - This serves/solves use-case#1
Domanda 1:
Non sono sicuro di come sia possibile progettare la classe Filter migliore. L'obiettivo è fornire agli utenti API intuitive e potenti.
Domanda 2:
Non sono sicuro di come dovrei risolvere il caso d'uso n. 2 e n. 3 sopra. Ho un paio di soluzioni nella mia mente, ma non sono sicuro di quale sia il migliore.
Soluzione # 1. Per creare lavori, gli utenti possono creare direttamente un'istanza dell'oggetto della classe Lavoro. Fornirò i metodi nella classe del modello di lavoro per eseguire e rieseguire il lavoro. Gli utenti creeranno istanze di metodi di classe e chiamata di lavoro (esegui, riesegui, uccidi ecc.) Sull'oggetto di lavoro.
Soluzione # 2. Insieme all'API get_job, esponi API separate per le azioni di controllo come eseguire e rieseguire nell'interfaccia utente.
get_job(Filter)
run_job(Job)
rerun_job(Job)
...
Che cosa succede se in futuro desidero supportare molte più azioni di controllo sull'oggetto Job (per e.x. hold, resume ecc.). Se vado con la soluzione n. 2, finirò per creare molti metodi nell'API utente. Se vado con la soluzione n. 1, non sono sicuro che la classe Job possa essere chiamata come classe modello.
Non sono sicuro quale approccio sopra menzionato sia migliore e perché? O c'è un altro modo in cui dovrei pensare.