这种重构有什么意义吗?

时间:2012-05-10 11:12:56

标签: c# web-services refactoring

给定Web服务方法:

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的定义
  3. 缺点:

    1. class SelectionParameters没有任何商业价值 - 它只是使用它 作为辅助类,它在单个方法中使用。结果我们会 有很多方法有1个参数和大量的一次性课程
    2. 实际上接口IS已经改变,我们只是稍微推动这些改变 更深。

3 个答案:

答案 0 :(得分:2)

我不确定这种重构有多大价值,因为正如你所说,支持类的数量将是/可能是一个痛苦的维护,并没有其他目的。

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

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

public void FindSomeEnteties(params object[] theParameters)

这取决于你是否想要挖掘一个数组以取出索引0并将其视为ID等等,或者你的方法是否只想对所有传递的参数做同样的事情。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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