Sto già postando questa domanda su StackOverflow , ma ho pensato che chiederlo a diverse comunità potrebbe darmi una visione diversa. Quindi ecco il repost della domanda:
Ciao, sto avendo un servizio finanziario che consente ai nostri utenti di bilanciare il loro saldo nel nostro sistema, e quindi di erogare i soldi. Verranno addebitati per ogni esborso. Il problema è che ho bisogno di fare una serie di passaggi che devono essere eseguiti in diversi punti.
Componente correlato:
- Transazione: registrazione delle informazioni sulla transazione (importo, conto del beneficiario, ecc.)
- Pagamento: registrazione delle informazioni di pagamento (importo, stato del pagamento)
- Voci di diario: registra il flusso di denaro per ogni transazione e pagamento (per ogni movimento di denaro nel nostro sistema, teniamo traccia di quale account agisce come account di debito e quale conto di credito, come nella contabilità)
Flusso del processo di business:
- Supponiamo che ci sia una transazione e un pagamento già creati, il passo successivo è confermare la transazione
- Modifica lo stato della transazione in confermato
- Modifica lo stato del pagamento su confermato
- Inserisci il nuovo record nelle voci del diario, con il conto di addebito e il credito specificatamente specificato per questo processo
- Incrementa o decrementa il saldo dell'account di credito e di debito
Quelle serie di passi potrebbero essere fatte in diversi punti, quindi cerco di trovare un modo per evitare che altri programmatori provino a implementare questo flusso dimenticando un passaggio o facendolo male.
Cosa faccio ora:
-
Crea un helper di immissione a giornale . Consiste in un sacco di funzioni statiche per ciascuno dei possibili processi aziendali che comportano lo spostamento di denaro tra conti. Ad esempio in questa domanda, quando si conferma un pagamento, è stato trasferito denaro da
user_deposit
aunearned_revenue
account, quindiuser_deposit
sarà l'account di debito eunearned_revenue
sarà l'account di credito nella registrazione a giornale appena inserita. Ognuna di queste funzioni statiche differisce solo nel dire quale account sarà il conto del credito e quale sarà l'account di debito. Inoltre, questo aiuto diminuirà o incrementerà il saldo del conto credito e del debito. Quindi, in questo esempio, decrementeràuser_deposit
balance e incrementeràunearned_revenue
balance. Esempio di nome funzione relativo a questo esempio:withdrawPayment
ewithdrawTransaction
-
Crea un helper di pagamento . Diversi tipi di pagamento, in stato diverso, necessitano di diversi helper per l'inserimento nel journal. Pertanto, in questo helper sono presenti molte funzioni statiche che modificano lo stato del pagamento, quindi chiamano l'helper relativo alle voci di diario correlate. Esempio di nome funzione relativo a questo esempio:
confirmAndWithdrawCashPayment
-
Crea un metodo di istanza sulla transazione denominato
confirmAndwithdraw
, che chiameràconfirmAndWithdrawCashPayment
su helper di pagamento ewithdrawTransaction
su helper di immissione a giornale, che chiameràwithdrawPayment
su helper di registrazione a giornale. - Ogni volta che un programmatore deve eseguire questo passaggio, chiama semplicemente la funzione
confirmAndwithdraw
dall'oggetto di transazione
Ovviamente funzionerà, ma so anche che questo è un pessimo design. Qualche suggerimento di un modello di progettazione o di una soluzione adatta a questo caso?
Principalmente sto cercando un modo per completare una serie di passaggi in modo da poter rimuovere quella classe di helper, fornendo allo stesso tempo un modo conveniente per gli altri programmatori di implementare questo processo aziendale.
Ci scusiamo per la lunga domanda. Se la domanda non è chiara, ti preghiamo di comunicarmelo per fornirti ulteriori informazioni.