为什么我应该使用基类型声明方法参数?

时间:2014-08-05 17:35:46

标签: c# automated-refactoring

我已经声明了一种简单的方法来尝试将输入从文本框转换为int,如下所示:

int TryConvertTextToInt(TextBox box)
{
    //do try catch
}

我的IDE(SharpDevelop)试图给我一些重构建议;具体来说,box参数可以声明为基本类型(工具给我的两个选项是TextBoxBase和Control)。我知道我不想将此方法用于TextBox以外的任何其他方法,如果我确实改变了我的想法,具体的参数类型将提醒我可能需要稍微更改方法以适应更宽的输入范围。我现在没有看到改变类型的价值,因为我没有预料到后一种情况而且项目很小。

我是否有理由想要这样做,我缺少,或者IDE是否过于有用?

2 个答案:

答案 0 :(得分:4)

在您的特定情况下,它可能不会产生太大的差异。鉴于您通过了TextBox,您可能无法通过除TextBox以外的其他任何内容。

但是,在更一般化的情况下,通常最佳做法是为方法提供最基本的参数类型和最具体的返回类型。正如您的IDE建议的那样,这个想法允许在以后的各个地方使用该方法。

作为一个例子,我们可以看一下集合的经典案例。许多开发人员将编写接受List<T>作为参数的代码,然后执行foreach。这很棒,如果他们只处理List<T>,但是如果他们想要在路上展开,在那里加入一些LINQ表达式,突然之间他们正在处理{IEnumerable<T> {1}}。 foreach循环中的任何内容都不需要List<T>,但是因为他们没有使用基类(或者在这种情况下通常更好的界面),所以他们不会这样做。现在要么必须改变方法签名 - 一个非破坏性的改变,但仍然不是一个好的改变 - 或者向他们的LINQ添加.ToList(),这破坏了使用LINQ的许多优点(因为突然之间,他们必须至少三次遍历集合。

您始终希望确保您能够接受最小的课程或界面,这仍然为您提供所需的成员。当然,不要过于保守:如果有正确的方式和一般化的方式,选择正确的方式,但如果相同,那么概括是最好的。

但是,在你的情况下,我并不认为这是一件大事。您希望使用TextBox提供的其他成员,而不是您想要将TextBoxBaseControl的其他继承人传递给您的机会可能会更高方法。真的,它只是依赖于你的应用程序。检查您拥有的和您需要的内容,然后根据该警告建立您对此警告的响应。对我而言,听起来你理所当然地离开它,这就是你应该做的事情。但是为了将来参考,这就是这个想法。

答案 1 :(得分:1)

  

具体的参数类型会提醒我方法可能   需要稍微改变以适应更广泛的输入

不会需要更改以适应更广泛的输入,所以这个&#34;提醒&#34;会误导。您的IDE已检测到它已经可以容纳它们,因为您在实现中没有做任何特定于TextBox的操作。只有当你计划将来实际上使它成为特定于TextBox的时候才应该忽略这个建议。