Design Pattern per avvolgere una serie di passaggi

-1

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 a unearned_revenue account, quindi user_deposit sarà l'account di debito e unearned_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 e withdrawTransaction
  • 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 e withdrawTransaction 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.

    
posta Luqman Sungkar 20.12.2018 - 10:03
fonte

2 risposte

1

Penso che stai mescolando i ruoli delle varie classi in modo tale da non sapere chi è responsabile di cosa. Quindi, di conseguenza, nessuno è il "proprietario" di nessun altro e ogni movimento richiede necessariamente di occuparsi di tutti e tre.

L'obiettivo dovrebbe essere quello di comprendere la relazione tra ciascuno e designarne uno come "master" e controller da cui dipendere per gestire i dettagli relativi agli altri due. Ad esempio, Payment potrebbe essere un buon candidato qui. Payment crea e salva un Transaction per ogni singolo movimento dall'account all'account e tiene traccia dello stato di Transaction e del suo. E ogni volta che% co_de giunge a una conclusione, aggiorni le voci Transaction in modo da conservare un registro.

Il chiamante non sa o non si preoccupa del passaggio dall'account al conto. Sa solo che l'account sorgente è X e l'account di destinazione è Y. I dettagli del movimento sono gestiti internamente da Journal .

Se Payment non si adatta perfettamente alla fattura, puoi sempre creare una classe dedicata per l'organizzazione di questi aspetti. Riduci al minimo le chiamate all'interfaccia per passare solo elementi essenziali e lascia che questa nuova classe si occupi delle intricate operazioni.

    
risposta data 20.12.2018 - 12:09
fonte
0

Crea un'interfaccia che definisca questo processo e sia implementata come una classe senza stato (ad esempio un servizio). L'interfaccia può essere richiesta ovunque sia necessario e l'implementazione con i passaggi da seguire può essere l'implementazione che viene iniettata.

Non dovresti ripeterti da nessuna parte, specialmente quando esegui passaggi importanti. Fallo in un posto e fallo nel modo giusto. Ovunque nel sistema in cui è necessario tale processo, è possibile esternalizzare la logica in un unico punto, in cui la logica è già definita e testata.

    
risposta data 20.12.2018 - 13:29
fonte

Leggi altre domande sui tag