0

最近在我正在进行的项目中,我遇到了以下问题:

假设我有一组(树状)数据结构:

销售合同
    买方
        地址
            城市
            电话
        金融
    卖方
        地址
    项目
        价格
        东西
    其他的东西

并且SellingContract会经历几个商业短语,每个短语都必须检查SellingContract数据以确定它是否满足某些特定条件。

首先,我让顶部容器 ( SellingContract) 提供所有条件检查器方法:

SellingChecker.tooMuchItems()
SellingChecker.canProceedToStepXXX()

但每次出现新情况时,我都必须修改SellingContract.

有人可以建议我一种优雅的方法来解决这个问题吗?

目前,我正在考虑两种方法:

  1. 应用访问者模式SellingContractSellingContract将提供一个方法acceptConditionChecker(ConditionChecker),条件检查器将实现接口ConditionChecker

  2. 创建以SellingContract作为参数的实用程序类,然后检查条件。这种方法要求实用程序类知道它的结构,SellingContract并且对我来说似乎是程序性的。

4

2 回答 2

0

首先,我认为SellingContract提供所有条件检查方法是不好的。该类应该只关心保存数据和提供对数据的访问。

至于你的两种方法:

  1. 我不认为访客模式在这里有用。为了正确应用,访问者应该能够访问不同类型的对象;在您的情况下,这将是不同类型的SellingContract或者可能是Contract. 同样要真正有用,应该需要不同类型的访问者。但除了ConditionChecker那会是什么。所以总结一下:我不认为访问者模式在这里有用。
  2. 这种方法似乎是明智的。我认为实用程序类了解SellingContract结构不是问题。他们实际上只需要知道它的公共接口。但是他们无法在不了解该对象的情况下合理地检查该对象的条件,因此我在这里看不到问题。此外,您的要求也暗示了一个循序渐进的过程,所以如果您的方法是一个小程序,这不是一个大问题。 我推荐这种方法。

对于您的条件,您可以ConditionChecker为每个条件编写一个,然后编写一个逐步应用这些条件的类。这也将使代码更易于调试和阅读,因为您可以轻松地在您喜欢的 IDE 中逐步执行代码并查看中间结果。

在我目前正在进行的项目中,我们遇到了类似的问题:对学生数据进行操作并检查他们是否满足学位的所有条件,并向用户提供有关哪些条件满足和不满足的信息。我们使用了第二种方法,效果很好。我们的软件架构师也同意这是一个很好的解决方案。

或者,您可以实现一种特定于域的语言来指定条件和规则。这将允许您让企业自己编写条件。但这需要相当多的努力来实施。

于 2012-09-28T09:01:57.903 回答
0

我会考虑责任链模式,每个处理程序都会检查一个条件,如果没问题,它会将信息传递给下一个处理程序。

于 2012-09-28T08:55:26.307 回答