最近,在我正在进行的项目中,我遇到了以下问题:
假设我有一组(树状)数据结构:
SellingContract Buyer Address city phone Finance Seller Address Items Price Stuff OtherStuff
SellingContract
会经过几个商业用语,每个人都必须检查SellingContract
数据,以确定它是否满足某些条件。
首先,我让顶部容器(SellingContract
)提供所有条件检查器方法:
SellingChecker.tooMuchItems()
SellingChecker.canProceedToStepXXX()
但每次出现新情况时我都要修改SellingContract
。
有人能建议我一个优雅的方法来解决这个问题吗?
目前,我正在考虑两种方法:
为SellingContract
应用访客模式,SellingContract
将提供方法acceptConditionChecker(ConditionChecker)
,条件检查器将实现接口ConditionChecker
。
创建以SellingContract
为参数的实用程序类,然后检查条件。这种方法要求实用程序类知道SellingContract
的结构,对我来说似乎是程序性的。
答案 0 :(得分:0)
我会考虑chain-of-responsibility pattern,每个处理程序会检查一个条件,如果没有,它会传递下一个处理程序的信息。
答案 1 :(得分:0)
首先,我认为SellingContract
提供所有条件检查方法是不好的。该课程只应关注持有数据并提供对数据的访问。
至于你的两种方法:
SellingContract
或Contract
的不同类型。同样非常有用,应该需要不同类型的访客。但除了ConditionChecker
之外还会是什么。总而言之:我不认为访客模式在这里很有用。SellingContract
结构是一个问题;他们实际上只需要知道它的公共接口。但是他们无法在不知道任何相关信息的情况下合理地检查该对象的状况,所以我在这里看不到问题。此外,您的要求无论如何都意味着一步一步的程序,因此如果您的方法是一个简单的程序,它不是一个大问题。 我推荐这种做法。 根据您的条件,您可以为每个条件编写一个ConditionChecker
,然后编写一个类,逐步应用这些条件。这也将使代码更容易调试和读取,因为您可以轻松地执行诸如在您喜欢的IDE中逐步执行代码并查看中间结果的事情。
在我正在进行的项目中,我们遇到了类似的问题:对学生数据进行操作,检查他们是否符合学位的所有条件,并提供有关哪些条件得到满足而且未满足用户的信息。我们使用第二种方法,效果很好。我们的软件架构师也同意这是一个很好的解决方案。
您可以选择实现特定于域的语言来指定条件和规则。这将允许您让业务自己编写条件。但这需要花费更多的努力才能实现。