【问题标题】:How to avoid methods with different parameters如何避免使用不同参数的方法
【发布时间】:2017-06-02 11:01:31
【问题描述】:

我有许多具有不同参数的类似方法。我试图找到一个好的和简单的重构解决方案,但没有结果。我可以使用参数对象,但我认为我需要创建另一个辅助类,它会使一切变得更复杂和更慢。

void Foo(ref int test2)
{
    Goo(test2);
}

void Foo(ref long test2)
{
    Goo(test2);
}

void Foo(ref double test2)
{
    Goo(test2);
}

void Foo(ref string test2)
{
    if (!test2.IsNull())
        test2 = "sth";
    Goo(test2);
}

【问题讨论】:

  • 您在寻找泛型吗? void Foo<T>(ref T test2)
  • 如果你能提供一个更复杂的例子会有所帮助。我们不知道 Goo 做了什么,也不知道为什么您的前三个方法接受 ref 参数,尽管没有更改它们。

标签: c# methods parameters


【解决方案1】:

使用generics:

void Foo<T>(ref T test2)
{
    Goo(test2);
}

【讨论】:

  • 这仅适用于Goo 是泛型方法而不是与Foo 相同的重载系列。
  • 这在最后一个处理特定类型(即!test2.IsNull())的场景中有何帮助?
【解决方案2】:
  1. 多方法重载并不是必须避免或重构的坏事。所以在重构之前要三思。
  2. 您的方法似乎是平等的,但事实并非如此。请查看字符串参数的 Foo 方法的实现。在 null 的情况下有一个输入值替换。在 generic 实现的情况下,该情况仍应涵盖在类型检查中
  3. 从您的示例中,我看到您有一个嵌套方法调用,但重新实现了一致的输入参数类型。请找出它可能是故意的吗?可能您的代码是 API 的一部分,将被其他没有泛型概念的语言引用。

如果您仍然确定必须重构它,那么以下选项是可能的:

  • 通用
  • OOP(多态性和虚拟化)
  • 使用动态或对象类型的输入参数(对装箱和类型比较要非常小心)
  • 如果你想减少你必须维护的代码量,但最终代码有很多相同方法的实现对你来说是可以的,在这种情况下 T4 可以是一个选项

【讨论】:

  • 是的,我认为你是对的。实际上有很多代码行,但总的来说还不错。在我的情况下,泛型并不好,因为这些功能中的其他操作。我考虑过对象类型,但这很危险,而且可能比现在更糟糕。 OOP 可以是一个答案,但我必须更多地考虑这个案例。周末后我会发布答案,也许我会找到好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 2015-04-05
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
相关资源
最近更新 更多