代码之家  ›  专栏  ›  技术社区  ›  g.pickardou

如何重构元组<..>到具有描述性名称的类型化类?

  •  1
  • g.pickardou  · 技术社区  · 7 年前

    上下文

    我继承了大量使用元组的大型遗留代码库<&燃气轮机;类型。代码中有很多行,如:

    myVar = myTuple.Item4;
    

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

    问题

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

    3 回复  |  直到 7 年前
        1
  •  5
  •   nozzleman    7 年前

    我想这个答案不会完全是你所希望的,但既然我在那里,我想我会分享我的做法。

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

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

    但首先要做的事。。。

    寻找元组

    我查了所有 Tuple 已使用。

    独立Visual Studio和Resharper都可以通过使用 查找用法 查找高级用法 (如果元组是使用 Tuple.Create() )。

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

    根据这些信息,确定第一个 这需要加以介绍。

    1、创建 class

    。。。让它看起来像 元组 现在。XML文档可以帮助以后在重构中处理类。

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

    2、调出 元组 -通过声明和初始化创建 ClassThatWasMissing

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

    3、重构 缺少的类

    给出属性( Item{n} )更多描述名称。在这一点上,上面的评论可以派上用场。

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

    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";
    

    重复该过程

    。。。对于您最初或连续找到的所有位置。这样做直到没有 元组 剩下的(或者至少是那些你可以一起生活的人)。

    祝你好运

        2
  •  1
  •   ΩmegaMan    4 年前

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

    public List<(string opName, string fileName)> GenerateTable()

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

    enter image description here

        3
  •  0
  •   tmaj    4 年前

    (2021访问该问题)

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

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

    1. Regex声明来自 Tuple<Type1, Type2 ...> (Type1 Item1, Tupe2 Item2 ...)
    2. 重命名(例如使用VS Crtl+R ,则, Ctrl+R )发件人 Item1 AmazingName ,则, Item2 EvenBetterName 。。。。