复杂逻辑的设计模式/编码方法有哪些?

3
我需要清理在线大学申请的代码。它没有什么特别的问题,但是它很复杂。不同的学位课程有不同的先决条件、费用、必要文件和问题。此外,来自军队的学生有不同的费用,而之前的学生则不需支付费用并跳过步骤。
显然,所有这些逻辑都可能变得非常复杂,并导致错误。我想知道是否有一种设计模式或编码方法可以帮助组织逻辑。我使用PHP,但这并不重要。 策略模式似乎具有最大的潜力,但我觉得我需要在策略之上再加上策略。
我想象"业务逻辑"领域可能部分涵盖了这个问题,但搜索并没有找到任何优雅的编码方法。

1
这可能应该是一个社区维基。 - Matthew J Morrison
这真的取决于您的具体要求... - Paddy
5个回答

2

我并不认为这种问题可以通过某种模式或模式来解决。在某种程度上,这只是“设计”——你构建一个设计,并发现关系和弹性点,在那个时候,面向对象技术(例如)有所帮助,模式才会发挥作用。

多年来,我观察到许多尝试通过“不编写代码”来解决这些问题的尝试。也就是说,我们找到了一些方法将业务逻辑外部化为比代码更易塑造的东西。因此,您可能只需将费用规则外部化:

  Thinking 101  Standard $100   Alumni $50   Ex-Military $0
  Hard Sums     Standard $500   Alumni $100  Ex-Military $0

现在,这些规则的更改是一种配置更改,而不是代码更改。这种数据驱动的方法可能比代码更好。

然后,您想将逻辑外部化,因此规则引擎出现了。

并外部化处理逻辑,因此我们得到了BPEL。

我看到了所有这些方法的成功,但问题在于:实际上您已经将逻辑外部化到某个地方,因此仍然存在两个问题:

  1. 您能多快地测试这个逻辑?您可能没有减少所需测试的数量。
  2. 您能多快地管理这个外部化逻辑的生命周期?您能试用它吗,例如为小客户群体,当发现错误时可以回滚吗?允许多个版本同时在线吗?

这些都是软件,它们真的是伪装成代码。


这是一个公正的观点,但在我看来,从无组织的代码到实现规则引擎是一个相当大的步骤。我认为有一些中间步骤,正如人们所建议的那样,在这种情况下可能更合适。当然,有些人喜欢一开始就跳入深水区,所以我的看法可能是错误的。 - Grant Crofton
数据驱动方法?你会被当成异端烧死的! - JulesLt
@Grant,我并不建议提问者完全采用规则引擎,而是试图引起注意,如果数据驱动方法被推向逻辑结论,可能会产生的结果。我认为应该认真考虑哪些逻辑更适合以数据驱动的方式表达。 - djna

1

我认为将几种模式结合使用可能会很有帮助。Fowler的领域模型模式旨在驯服复杂的领域逻辑。另一种选择是使用分层架构模式,就像POSA1中所描述的那样。策略模式似乎也是定义一系列相关算法的好方法。


1

作为起点,你是否了解单元测试?快速搜索PHP单元测试,可以找到http://www.phpunit.de/

作为起点,你应该尝试查看是否可以对现有代码进行单元测试。这样,你就可以确信它能够按照预期工作,并且在未来进行更改时不必过于担心破坏现有逻辑。此外,一旦你在现有代码上建立了单元测试,就可以开始进行改进逻辑的更改,并保持同样的信心水平。


1

正如你所建议的,策略模式似乎非常适合这种情况 - 但是由于有相当复杂的逻辑,你需要将其放在领域模型中,而不是你现在可能正在使用的事务脚本

Fowler的书《企业应用架构模式》对这整个思考应用程序的领域有很好的解释(他建议你从那里开始并从那里开始工作)。

正如其他人所说,单元测试总是有帮助的!


谢谢 - 看了一下,这似乎是一个很好的起点。 - Burton Kent

0

应用一些设计模式并不能解决所有问题,但有些模式可以帮助更好地组织代码。如果想要减少错误,那么需要实施某种形式的自动化测试,可以查看测试驱动开发和持续集成方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接