Design patterns for finding a match

时间:2018-03-23 00:26:17

标签: c# design-patterns

Need assistance in structuring my code with design patterns.

So I have a single method in service class that looks like this. The constructor loads a json file into a List<Option> of Option class instances. Finally when the service method is called it does some logic to find the Option match based on the parameter values and returns a new instance of 'Tool' class with the configured "options".

public Tool BestOptionFinderService.FindBestMatch(string value 1, int value2, int value3, .. bool value20, etc...) {..}

I'm not sure if I a "service" class is correct for this versus a "factory" or something else. I would appreciate your thoughts and suggestions on how you would design your code for this problem or similar.

1 个答案:

答案 0 :(得分:0)

我会说,单独使用约20个参数的方法本身就很糟糕,甚至没有考虑OOP模式。让我们努力做得更好;更重要的是,让我们尽量不重新发明轮子。

重要而明显的观察:无论匹配的逻辑是什么,任何对象要么匹配要么不匹配,而不是两者都匹配。因此,坚持使用布尔代数和predicate: t -> boolbool Predicate<T>(T obj)等签名是有意义的。我们对谓词的另一个了解是,人们可以轻松地将任意两个减少为一个:有不同的方法可以做到这一点,但是你显然对and&&感兴趣操作

因此,您可以拥有20个不同的简单,清晰,自我描述谓词,而不是20个参数,以后可以减少&#34;减少&#34;进入一个单一的实例。 Linq.Aggregate()可以帮助您不仅美化您的代码,还可以使其并行(如果需要)。然后,您可以将您的输入映射到足够的(由您自己决定是否需要更多或不需要)数量的标志,代表&#34;健身&#34;您正在检查的特定对象。

这种做法确实会更好,因为:

1)你坚持使用着名的布尔代数

1.A)实际上,在各种操作下形成一个monoid,包括and,而这又是{{1}}

1.B)可以在任何计算集群上轻松分发

1.C)紧凑,富有表现力,不言自明。

2)你的代码讲述了更多的故事:简单谓词易于阅读,维护,单元测试和重构,对于20-params方法来说绝对不是这样。

3)你清楚地将你的原语与一个成分分开 - 更复杂的结构,由一些已知的原语构成。这就是数学的方式,因而唯一已知可靠,经过数千年验证方式来解决复杂性,并且在某些时候不被它所奴役

4)有更多优点,但我厌倦了输入;)