【发布时间】:2017-10-06 22:07:36
【问题描述】:
我正在对某些代码进行重构。
我们有一份投资者名单,每个人都分配了金额。总金额应该等于另一个总金额,但有时会有几美分的差异,因此我们使用不同的算法将这些差异分配给每个投资者。
目前的代码是这样的:
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)
}
}
到目前为止,我们只有两种算法。我必须实施第三个。我有机会重构现有的实现以及编写一些通用代码来为未来的算法制作此功能,可能为每个客户定制。
我的第一个想法是“好吧,这是一种策略模式”。但我看到的问题是两种算法都接收到不同的参数列表(前两个除外)。未来的算法也可以接收不同的参数列表。唯一的“共同点”是投资者名单和其余部分。
我该如何设计它以使界面更简洁? 我想到了
- 建立一个包含所有可能参数的接口,并共享它 在所有实现中。
- 使用具有所有可能参数的对象作为属性,并将该通用对象用作接口的一部分。一世 将有 3 个参数:投资者列表、剩余对象和“参数”对象。但在这种情况下,我有一个类似的问题。实例化每个对象并填充所需的属性取决于算法(除非我设置了所有属性)。一世 必须使用工厂(或其他东西)来实例化它,使用界面中的所有参数,对吗?我会将参数过多的问题转移到那个“工厂”或其他什么地方。
- 使用动态对象而不是静态类型对象。仍然 和以前一样的问题,实例化
我也想过使用访问者模式,但据我所知,如果我有不同的算法供不同的实体使用,比如另一类投资者,就会出现这种情况。所以我认为这不是正确的方法。
到目前为止,最让我信服的是第二个,尽管我对此仍然有些沉默。
有什么想法吗?
谢谢
【问题讨论】:
-
参数都是同类型的吗?如果是这样,它们可以放在一个列表中。是否可以仅使用 1 个算法迭代参数列表并执行所需的操作?
-
当前实现有十进制值、整数和枚举。虽然可能有一个字符串
-
无论算法如何,所有参数都设置了吗?什么决定算法?为什么不在那里新建算法呢?似乎是不必要的额外关卡
-
一个枚举用于确定算法。到目前为止只有两个,我将添加第三个,我希望将来的算法代码更清晰
-
看来这个 Round 方法很没有意义。你不能只调用你想要的算法来代替调用这个 Round 方法吗?
标签: c# algorithm oop design-patterns strategy-pattern