我正在对某些代码进行重构。策略模式,每种算法都有不同的方法签名
我们有一个投资者名单,分配给每个投资者。总金额应该等于另一个总额,但有时会有几美分的差异,所以我们使用不同的算法将这些差异分配给每个投资者。
当前的代码是这样的:
public void Round(IList<Investors> investors, Enum algorithm, [here goes a list of many parameters]) {
// some checks and logic here - OMMITED FOR BREVITY
// pick method given algorithm Enum
if (algoritm == Enum.Algorithm1) {
SomeStaticClass.Algorithm1(investors, remainders, someParameter1, someParameter2, someParameter3, someParameter4)
} else if (algoritm == Enum.Algorithm2) {
SomeStaticClass.Algorithm2(investors, remainders, someParameter3)
}
}
到目前为止,我们只有两种算法。我必须执行第三个。我被赋予重构现有实现的可能性,以及为将来的算法做一些通用代码,以便为每个客户定制。
我的第一个想法是“好的,这是一种战略模式”。但是我看到的问题是两种算法都会收到不同的参数列表(前两个除外)。未来的算法也可以接收不同的参数列表。 “共同”唯一的事情是投资者名单和其余部分。
我该如何设计这个,所以我有一个更清洁的界面? 我想到
- 建立与所有可能的参数的接口,并且所有的实现之间共享 。
- 将具有所有可能参数的对象用作属性,并将该通用对象用作接口的一部分。 I 将具有3个参数:投资者列表,剩余物对象和“参数”对象。但在这种情况下,我有类似的问题。实例化每个对象并填充所需的属性取决于算法(除非我将它们全部设置)。 I 将不得不使用工厂(或其他)来实例化它,使用界面中的所有参数,对吗?我会将参数过多的问题转移到“工厂”或其他任何方面。
- 使用动态对象而不是静态类型的对象。不过 像以前提出了同样的问题,实例化
我也想过用访问者模式的,但据我所知,如果我有不同的实体不同的算法来使用,这样会出现这种情况,另一投资者类别。所以我不认为这是正确的做法。
到目前为止,最令我信服的是第二个,尽管我仍然对此保持低调。
任何想法?
感谢
参数是否都是同一类型?如果是这样,他们可以放在一个列表中。只有1个算法可以迭代参数列表并执行所需的操作吗? – brumScouse
当前实现具有小数值,整数和枚举。可能有一个字符串,虽然 –
所有的参数设置,无论算法?什么决定算法?为什么不在这里新增阿尔戈?似乎不必要的额外级别 – brumScouse