如何将 Tuple<..> 重构为具有描述性名称的类型化类?

g.p*_*dou 2 c# resharper refactoring visual-studio

语境

我继承了一个大量使用 Tuple<...> 类型的大型遗留代码库。该代码充满了如下行:

myVar = myTuple.Item4;
Run Code Online (Sandbox Code Playgroud)

我想通过引入具有描述性属性名称的自定义类来重构此代码以使其更具可读性。

问题

有什么工具可以有效支持这种重构操作吗?

noz*_*man 6

我认为这个答案并不完全是你所希望的,但既然我去过那里,我想我应该分享我的做法。

不幸的是,我没有找到使用某些工具完全自动化此重构的方法。然而,我是这样处理这个问题的……

如果元组用于表示您现在想要引入的单个类,那么您很幸运。我想情况并非如此,所以你必须做一些分类。

但首先要做的事情是...

寻找元组

我查了一下所有使用过的地方Tuple

独立的 Visual Studio 和 Resharper 都可以通过使用“查找用法”“高级查找用法” (如果使用 创建元组Tuple.Create())来帮助您完成此操作。

否则或另外,您将需要搜索解决方案new Tuple<或只是Tuple搜索您的解决方案。

有了这些信息,就可以确定需要引入的第一个类。

1. 创建class

Tuple...现在让它看起来像一个。XML-Doc 可以在稍后的重构中处理类时提供帮助。

class ClassThatWasMissing
{
    /// <summary>
    /// Represents some Property.
    /// </summary>
    int Item1 { get; set; }

    /// <summary>
    /// Represents some other Property.
    /// </summary>
    string Item2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

2. 将Tuple-creation 替换为您的声明和初始化ClassThatWasMissing

- Tuple<int, string> myvar = new Tuple<int, string>();
+ ClassThatWasMissing myvar = new ClassThatWasMissing();
  myvar.Item1 = 42;
  myvar.Item2 = "Some information";
Run Code Online (Sandbox Code Playgroud)

3. 重构ClassThatWasMissing

为属性 ( Item{n}) 指定更具描述性的名称。上面的评论此时可以派上用场。

同样,Resharper 和独立的 Visual Studio 都可以提供帮助(例如 R#:重构 → 重命名):

class ClassThatWasMissing
{
    /// <summary>
    /// Represents some Property.
    /// </summary>
    int SomeProperty { get; set; }

    /// <summary>
    /// Represents some other Property.
    /// </summary>
    string SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

此时还要记住,有时在使用点应用名称可能更容易,而不是在声明点应用名称,因为它们的目的在这些点可能更明显。VS 和 R# 都能够从那里重命名属性。

ClassThatWasMissing myvar = new ClassThatWasMissing();
myvar.SomeProperty = 42;
myvar.SomeOtherProperty = "Some information";
Run Code Online (Sandbox Code Playgroud)

重复该过程

...您最初或连续找到的所有地方。这样做直到没有Tuple剩下的(或者至少只剩下你可以忍受的)。

祝你好运!