【发布时间】:2018-09-05 11:54:51
【问题描述】:
上下文
我继承了大量使用 Tuple<...> 类型的大型遗留代码库。代码充满了这样的行:
myVar = myTuple.Item4;
我想通过引入具有描述性属性名称的自定义类来重构此代码以提高可读性。
问题
有什么工具可以有效地支持这种重构操作吗?
【问题讨论】:
标签: c# visual-studio refactoring resharper
上下文
我继承了大量使用 Tuple<...> 类型的大型遗留代码库。代码充满了这样的行:
myVar = myTuple.Item4;
我想通过引入具有描述性属性名称的自定义类来重构此代码以提高可读性。
问题
有什么工具可以有效地支持这种重构操作吗?
【问题讨论】:
标签: c# visual-studio refactoring resharper
我认为这个答案不会完全符合您的期望,但自从我去过那里以来,我想我会分享我的做法。
不幸的是,我没有找到一种方法来使用一些工具来完全自动化这种重构。但是,我是这样处理这个问题的......
如果元组用于表示您现在要介绍的单个类,那么您很幸运。我想情况并非如此,因此您必须进行一些分类。
但首先要做的是……
我查找了所有使用Tuple 的地方。
独立的 Visual Studio 和 Resharper 都可以通过使用 Find Usages 或 Find Usages Advanced 来帮助您(如果元组是使用 Tuple.Create() 创建的)。 p>
否则,您将需要在您的解决方案中搜索new Tuple< 或只是Tuple。
利用这些信息,确定需要引入的第一个类。
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; }
}
ClassThatWasMissing 的声明和初始化替换 Tuple-creation
- Tuple<int, string> myvar = new Tuple<int, string>();
+ ClassThatWasMissing myvar = new ClassThatWasMissing();
myvar.Item1 = 42;
myvar.Item2 = "Some information";
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 离开(或者至少只有你可以忍受的那些)。
祝你好运!
【讨论】:
(2021年访题)
如果可用,您可以重构为 c# 7+ Tuple types。
我认为该过程将分为两个阶段:
Tuple<Type1, Type2 ...> 到(Type1 Item1, Tupe2 Item2 ...) 的声明
Crtl+R、Ctrl+R)从 Item1 到 AmazingName、Item2 到 EvenBetterName,...【讨论】: