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

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

Software Engineering用户
提问于 2018-12-20 09:03:53
回答 2查看 88关注 0票数 -1

我已经在StackOverflow上发布了这个问题,但是我认为在不同的社区问这个问题可能会给我不同的见解。下面是这个问题的转贴:

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

相关构成部分:

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

业务流程流程:

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

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

我现在做的是:

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

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

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

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

EN

回答 2

Software Engineering用户

发布于 2018-12-20 11:09:16

我认为你把不同阶层的角色混合在一起,这样就不知道谁要对什么负责。因此,没有人是任何其他运动的“主人”,每一个运动都需要处理这三个方面的问题。

我们的目标应该是理解每个人之间的关系,并指定一个人作为“主人”和控制器,你依靠他们来处理与另外两个人有关的细节。例如,Payment在这里可能是一个很好的候选人。Payment为从一个帐户到另一个帐户的每一个移动创建并保存一个Transaction,并跟踪Transaction的S状态和它自己的状态。当每个Transaction得出结论时,您将更新Journal条目,以便保存日志。

打电话的人不知道,也不关心从一个帐户到另一个帐户的文章。它只知道源帐户是X,目标帐户是Y。移动的细节由Payment内部处理。

如果Payment不太符合要求,那么您可以始终创建一个专门的类来组织这些方面。将接口调用最小化为只传递基本元素,并让这个新类处理操作的复杂性。

票数 1
EN

Software Engineering用户

发布于 2018-12-20 12:29:13

只需创建一个定义此过程的接口,并将其实现为无状态类(即。(服务)。接口可以在任何您需要它的地方被要求,而具有后续步骤的实现可以是注入的实现。

你不应该在任何地方重复自己,特别是在执行重要步骤时。只做一个地方,做对的事。在系统中需要该流程的任何地方,都可以将逻辑外包到一个地方,在那里已经定义并测试了逻辑。

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

https://softwareengineering.stackexchange.com/questions/384331

复制
相关文章

相似问题

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