In un progetto, ho un servizio di pianificazione delle attività, che è autorizzato ad eseguire determinati metodi pubblici da altri servizi. Ogni servizio decide da solo, quali metodi rendere disponibili per il servizio di pianificazione delle attività annotandoli con @Operation
. Il servizio di pianificazione delle attività analizzerà semplicemente tutti i servizi forniti per questa annotazione per ottenere informazioni sui metodi che è possibile configurare per l'esecuzione. Ciò significa che un utente che desidera creare un'attività avrà un elenco di metodi @Operation
presentati.
Prendiamo l'esempio che segue di un servizio di aggiornamento (un servizio tra pochi)
public interface UpdateService extends Service{
@Operation
public void update(String updateFileName);
public List<String> getAvailableUpdateFileNames();
@Operation
public void ...
...
}
Il modo in cui viene dichiarata l'interfaccia UpdateService
, un utente può creare un'attività sul servizio delle attività eseguendo il metodo update
. Consentendo all'utente di configurare liberamente un'attività con qualsiasi stringa è per lo più certo errata. L'interfaccia, in questo caso, dovrebbe quindi presentare un elenco di valori predefiniti che possono essere utilizzati con il metodo update
.
Allo stesso modo, il servizio di aggiornamento conosce anche un metodo getter che rivela tutti gli aggiornamenti disponibili. Questo sarebbe ideale come fonte per i valori predefiniti.
Ecco perché sono arrivato con il seguente approccio:
public interface UpdateService extends Service{
@Operation(sourceClass=UpdateService.class,sourceMethod="getAvailableUpdateFileNames")
public void update(String updateFileName);
public List<String> getAvailableUpdateFileNames();
}
L'interfaccia @Operation
viene introdotta in un paio di parametri.
Il servizio attività esegue ancora la scansione di tutte le interfacce di servizio fornite per le annotazioni @Operation
, per presentare all'utente un elenco definito.
Il Task Manager comprende anche gli argomenti:
- sourceClass: questa classe deve contenere il metodo source
- sourceMethod: questo metodo restituisce valori che possono essere utilizzati per la funzione di interfaccia annotata.
Con l'aiuto della reflection, il servizio task esegue il metodo sourceMethod e offrirà i valori restituiti genericamente come valori predefiniti per la configurazione dell'attività del metodo update(String updateFileName)
nell'interfaccia utente. L'utente può selezionare tale valore e pianificare il metodo update
con questo valore selezionato come argomento.
Questo esempio è molto semplice e al momento funzionerebbe solo se il metodo annotato avesse 1 argomento. Anche se sarebbe completamente generico e disaccoppiato.
C'è un modo migliore per risolvere questo problema? O questo approccio non è affatto male?