首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于包装一系列步骤的设计模式

用于包装一系列步骤的设计模式
EN

Stack Overflow用户
提问于 2018-12-20 07:04:36
回答 1查看 114关注 1票数 0

我有一个金融相关的服务,使我们的用户可以补充他们的余额在我们的系统,然后支付的钱。他们每次付款都要收费。问题是,我需要做一系列需要在几个地方完成的步骤。

相关构成部分:

  • 交易:交易信息的记录(金额、受益人帐户等)
  • 付款:付款信息的记录(金额,支付状态)
  • 日记账分录:记录每笔交易和付款的资金流(对于我们系统中的每一笔资金流动,我们跟踪哪个账户充当借方账户,哪个账户作为信用账户,就像在会计中一样)。

业务流程流程:

  • 假设已经创建了事务和支付,下一步是确认事务
  • 将事务状态更改为已确认
  • 将付款状态更改为确认
  • 将新记录插入日记账分录,并为此过程指定借方和贷方帐户。
  • 贷方和借方账户余额的增加或减少

这些步骤可能在几个地方完成,所以我试图找到一种方法来防止其他程序员试图实现这个流程,忘记了一个步骤或者做错了一个步骤。

我现在做的是:

  • 创建日志条目助手。每个可能的业务流程都包含大量的静态功能,涉及到在帐户之间移动资金。例如,在这个问题中,在确认付款时,它将资金从user_deposit转移到unearned_revenue帐户,因此user_deposit将成为借方帐户,而unearned_revenue将成为新插入的日记账分录中的信用帐户。每个静态函数只在区分哪个帐户将是信贷帐户和哪个帐户将是借方帐户方面有所不同。除此之外,这个帮助者还会减少或增加贷方和借方账户的余额。因此,在本例中,它将减少user_deposit余额,并增加unearned_revenue余额。与此示例相关的示例函数名:withdrawPaymentwithdrawTransaction
  • 创建一个支付助手。不同的支付类型,在不同的状态下,将需要不同的日记账输入助手。因此,这个助手中有很多静态函数,可以更改支付状态,然后调用相关的日记记录助手。与此示例相关的示例函数名:confirmAndWithdrawCashPayment
  • 在事务上创建一个实例方法,名为confirmAndwithdraw,它将在支付助手上调用confirmAndWithdrawCashPayment,在日记条目助手上调用withdrawTransaction,后者将在日记条目助手上调用withdrawPayment
  • 每当程序员需要执行此步骤时,他们只需从事务对象调用confirmAndwithdraw函数即可。

当然,这是可行的,但我也知道这是一个非常糟糕的设计。是否有任何设计模式或适合这种情况的解决方案的建议?

主要是,我正在寻找一种方法来包装一系列步骤,以便我可以删除那些助手类,同时也为其他程序员实现这个业务流程提供了一种方便的方法。

很抱歉有这么长的问题。如果问题不清楚,请告诉我,我可以提供更多的信息。

EN

回答 1

Stack Overflow用户

发布于 2018-12-21 12:16:14

在这种情况下,实例化类型需要一定的步骤顺序,我建议查看Builder模式。通过这种方式,您可以通过存储对象的中间状态来链接所需的步骤,并在任何时候(延迟)执行它们。完成后,您将调用build()作为接收初始化实例。构建器的每个方法都可以返回不同的对象,因此可以强制客户端只使用依赖于先前调用的操作的方法选择。

可能是这样的:

代码语言:javascript
复制
PaymentBuilder paymentBuilder = new PaymentBuilder();
paymentBuilder.OpenTransaction(); 
// PaymentBuilder e.g. has only the OpenTransaction() method which returns a 
// PaymentTransactionOptions instance. This instance contains the 
// state of OpenTransaction() and adds further information by 
// invoking its SetPayment() method. 
paymentBuilder.OpenTransaction(args).SetPaymentMethod(moreArgs); 
// SetPaymentMethod(moreArgs) returns a PaymentJournalOptions instance 
// that contains the prior collected information and a method SetJournalData(). 
paymentBuilder.OpenTransaction(args).SetPaymentMethod(moreArgs).SetJournalData(journalArgs); 

您继续这样做,直到您的事务数据完成以供执行。然后调用(在最后一个结果对象上) build()来检索构建实例,该实例可能公开一个方法'commit()‘。与其将方法调用链接起来,您还可以存储中间结果并传递它,并在代码中的任何点完成它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53863888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档