我将抽象的意图,以便它并不重要它是如何实现的,还是怎么着源代码的组织。在基本层面上,您拥有的是一组检查器,生成一系列失败解释。
的伪代码将主要是:
let reasons be a new, empty collection of failure reasons
let checkers be the list of relevant checkers
for each checker in checkers
if checker passes, continue
if checker fails, add explanation to reasons
if number of reasons is zero,
voucher is valid, success
if number of reasons > zero,
the voucher is invalid, format each element in reasons for display to the user
有了这个逻辑,不要紧的跳棋是如何组织的,只要他们能够获得通过的这部分代码在一个列表。你可以有一个单一的方法与许多检查,可能会增加很多原因。你可以有许多类,每个检查器列表中有一个实例。至关重要的是,实际的检查人员与此逻辑脱钩,随时可以使用不同的检查人员(考虑业务规则变化或不同地区的不同规则)。
根据您的语言,这至少会涉及抽象用于检查者的类型。
从那开始。如果您发现相同的数据库查询,则开始考虑用于运行检查程序集的缓存。
至于跳棋是如何在源级别上组织的......没关系。只有抽象才会。一旦你提供了一个可以隐藏起来的抽象级别,细节就相当灵活了。
优点:
- 执行检查不关心实际的,具体的检查(这可能会改变根据业务规则)位。
- 无论您想要如何组织跳棋,您都可以组织跳棋:在一个源文件中一起定义跳棋,或者根据其他方案进行分组。它还允许自由分离出一个检查器来进行测试。
- 集合和漂亮的格式化只需执行一次,无论检查的类型或数量如何。
缺点:
- 这需要时间的前期做设计抽象的一份体面的工作。这可能会在稍后得到回报。
- 有一层间接性可能使其更难以理解,并追查正在进行的实际检查。灵活性不利于可理解性。这些是你必须考虑的情况。在我看来,优惠券的规则似乎是随着时间的推移可能会改变的东西,这里的抽象并不难理解,所以我认为这是值得的。
我花时间在Java中编写了一个例子,但它确实没有增加太多。如果试图从抽象的角度思考,实际的机制并不重要。