Attualmente sto progettando un'API di contabilità generale, che dovrebbe funzionare con diverse implementazioni (ad esempio basate su Blockchain, database tradizionali o file).
Il suo scopo è aggiungere / ricevere messaggi a / da un libro mastro di calcestruzzo. I messaggi vengono incapsulati nelle transazioni, che hanno ulteriori metadati come ora e autore, ecc. L'inizializzazione avviene in un LedgerProvider
, che non è incluso.
Ci sono anche altre parti che scrivono nel libro mastro (ad esempio nel caso di un'implementazione basata su blockchain).
Domanda L'interfaccia del libro mastro dovrebbe essere progettata sincrona o asincrona? E perché? A quali dati dovresti dare un'occhiata quando prendi questa decisione?
Un registro sincrono dovrebbe essere interrogato dai suoi utenti, i callback sembrano più convenienti. D'altra parte, anche classi come InputStream
sono sincrone e alcuni meccanismi di callback possono essere costruiti sopra (i polling di libraray sono internamente e richiama callback registrati).
Sotto la versione sincrona.
/**
*
* @param <M> Message type
*/
public interface Ledger<M> {
Transaction<M> addTransaction(M message);
List<Transaction<M>> getTransactions();
List<Transaction<M>> getTransactions(LocalTime since, LocalTime to);
}
Ecco come sarebbe la versione asincrona.
public interface Ledger<M> {
Transaction<M> addTransaction(M message);
void registerObserver(Observer o);
void unregisterObserver(Observer o);
}
public interface Observer<M> {
void update(Transaction<M> tx);
}