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.
答案 0 :(得分:0)
我会说,单独使用约20个参数的方法本身就很糟糕,甚至没有考虑OOP模式。让我们努力做得更好;更重要的是,让我们尽量不重新发明轮子。
重要而明显的观察:无论匹配的逻辑是什么,任何对象要么匹配要么不匹配,而不是两者都匹配。因此,坚持使用布尔代数和predicate: t -> bool
或bool 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)有更多优点,但我厌倦了输入;)