0

给定网络服务方法:

public void FindSomeEntities(int? Id, string param1, int? param2, ...)

重构:

public void FindSomeEntities(SelectionParameters selectionParameters)

class SelectionParameters
{
    public int? Id;
    public string param1;
    public int? param2
    ...
}

优点:

  1. 原始Web服务方法中的太多参数减少到唯一的一个
  2. 如果需要更改,我们不必更改方法的接口 - 只需更改 SelectionParameters 的定义

缺点:

  1. 类 SelectionParameters 没有任何商业价值 - 它仅用作辅助类,并且在单个方法中使用。结果,我们将拥有许多带有 1 个参数的方法和大量一次性类
  2. 实际上界面改变了,我们只是把这些改变推得更深一点。
4

3 回答 3

2

我不确定这种重构有多大价值,因为正如您所说,支持类的数量将/可能难以维护并且没有其他用途。

如果参数有不同的用途,例如在您的示例“ID”中,那么我认为将它们分开以便于识别它们以及您想在方法主体中对它们做什么是明智的。

但是,如果您的参数只是在方法主体中执行相似/相同功能的值的集合,您可以查看使用params关键字并像这样定义您的方法:

public void FindSomeEnteties(params object[] theParameters)

这取决于您是否需要挖掘数组以提取索引 0 并将其视为 ID 等,或者您的方法是否只是想对传递的所有参数执行相同的操作。

于 2012-05-10T11:24:35.633 回答
2

这种重构称为Introduce Parameter Object。如果参数彼此自然相关,尤其是当它们经常一起用作多个方法的参数列表时,这可能是一个好主意。

于 2012-05-10T11:35:57.123 回答
0

如果有任何理由相信其他 Web 服务共享相同的(子)参数集,这是合理的。

不管你不这样做,你有一个事实上的结构作为参数列表。这个观察是在我们的PARLANSE编程语言中实现的,它总是有一个函数参数,名为“?” (有点像 OO 中的“自我”)。该参数有一个类型;它可以是标量或复数变量(int 或 string),也可以是 struct。通常通过结构声明来定义结构;在 PARLANSE 中,编写看似多个参数的内容隐式定义了一个结构。在将参数列表传递给子函数的情况下,可以简单地在“?”上调用该子函数。并传递整个参数列表。

于 2012-05-10T12:03:57.633 回答