【问题标题】:How can I refactor Tuple<..> to a typed class with descriptive names?如何将 Tuple<..> 重构为具有描述性名称的类型化类?
【发布时间】:2018-09-05 11:54:51
【问题描述】:

上下文

我继承了大量使用 Tuple<...> 类型的大型遗留代码库。代码充满了这样的行:

myVar = myTuple.Item4;

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

问题

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

【问题讨论】:

    标签: c# visual-studio refactoring resharper


    【解决方案1】:

    我认为这个答案不会完全符合您的期望,但自从我去过那里以来,我想我会分享我的做法。

    不幸的是,我没有找到一种方法来使用一些工具来完全自动化这种重构。但是,我是这样处理这个问题的......

    如果元组用于表示您现在要介绍的单个类,那么您很幸运。我想情况并非如此,因此您必须进行一些分类。

    但首先要做的是……

    寻找元组

    我查找了所有使用Tuple 的地方。

    独立的 Visual Studio 和 Resharper 都可以通过使用 Find UsagesFind Usages Advanced 来帮助您(如果元组是使用 Tuple.Create() 创建的)。 p>

    否则,您将需要在您的解决方案中搜索new Tuple&lt; 或只是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; }
    }
    

    2。用 ClassThatWasMissing 的声明和初始化替换 Tuple-creation

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

    3。重构ClassThatWasMissing

    为属性 (Item{n}) 提供更具描述性的名称。此时上面的 cmets 就可以派上用场了。

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

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

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

    ClassThatWasMissing myvar = new ClassThatWasMissing();
    myvar.SomeProperty = 42;
    myvar.SomeOtherProperty = "Some information";
    

    重复该过程

    ...对于您最初或连续找到的所有地方。这样做直到没有Tuples 离开(或者至少只有你可以忍受的那些)。

    祝你好运!

    【讨论】:

    • 请注意,这个答案不包括 Tuple 提供的相等性检查,因此不是一个完美的函数再现重构!
    【解决方案2】:

    (2021年访题)

    如果可用,您可以重构为 c# 7+ Tuple types

    我认为该过程将分为两个阶段:

    1. 正则表达式从Tuple&lt;Type1, Type2 ...&gt;(Type1 Item1, Tupe2 Item2 ...) 的声明
    2. 重命名(例如使用 VS 的 Crtl+RCtrl+R)从 Item1AmazingNameItem2EvenBetterName,...

    【讨论】:

      【解决方案3】:

      在 Visual Studio 2022 中,可以突出显示元组并将其更改为结构。例如:

      public List&lt;(string opName, string fileName)&gt; GenerateTable()

      右键单击并选择Quick Actions and Refactorings(或CTRL.)并提供将其更改为结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 2021-06-26
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多