![]() |
1
4
也许最简单的重构方法是将名称“withage”更改为“initage”,使
如果
如果有好的单元测试,将隔离引入错误的地方。 |
![]() |
2
3
假设withage是返回一个人的方法,那么
或更广义:
然后,如果你不想让FluentMethod私有化,或者如果你想允许两种方式,就让它公开化。 |
![]() |
3
2
如果这是C(理想情况下,您可以用语言标记问题),那么Person类需要这个构造函数:
要更改所有客户端代码以在适当的情况下调用这个新的构造函数,您需要找到模式的所有出现:
其中,x1和x2是表达式,并将其替换为:
如果除了Withage还有其他的修改方法,它可能会变得更复杂。例如:
也许你希望它成为:
这完全取决于您是否有一个允许您定义语言感知的搜索/替换模式的IDE。通过简单的文本搜索和替换,再加上一个可以重放一系列按键的宏,您可以获得很长的解决方案。
不是特别的-更重要的是,IDES中的重构特性要么设计得足够灵活,可以让您创造性地发明新的重构,要么它们针对某些常见情况进行了硬编码。我更喜欢将常见的案例定义为我可以变异来发明新案例的例子。 |
![]() |
4
1
我对这类事情没有任何实际经验,但如果我处在你的情况下,我会去寻找的地方是 custom Eclipse refactorings (或重构中的等效项)!如果你使用的是pro for.net)。 基本上,您需要的是匹配和替换,除了正则表达式应该匹配抽象语法树而不是纯文本。这就是自动重构。 这种重构的一个风险是,目标版本不如原始版本精确。考虑: class Person { public Person(String name, int age); public Person(String name, int numberOfChildren); } 无法判断这些构造函数中的哪一个是对person.withage的链接调用。 因此,在允许您继续操作之前,对这一点的自动支持必须检查是否存在这样的歧义。如果已经有一个带有目标参数的构造函数,请中止重构。 除此之外,这似乎很简单。为新的构造函数提供以下内容: public Person(String name, int age) { this(name); withAge(age); } 然后您可以安全地用新的替换原来的呼叫。 (还有一个微妙的额外风险,即在构造函数内调用withage,即在部分构造的对象上,与在构造函数之后调用它不同。如果你有一个继承链,那么差异就很重要。 和 如果随着年龄的增长做了一些不平凡的事情。但这就是你的单元测试的目的……) |
![]() |
5
0
|
![]() |
Glory Raj · 有什么方法可以使这两个块具有共同的功能吗 3 年前 |
![]() |
Justin · Python自属性重命名 7 年前 |
![]() |
Sabutobi · 长dict属性行的重构 7 年前 |
![]() |
Falco Alexander · 简单LINQ重构/样式 7 年前 |
|
05bs001 · Euler 12需要优化 7 年前 |
![]() |
slartidan · 如何将lambda表达式重构为方法引用? 7 年前 |
|
Alex · 在Java类中频繁使用与映射键相同的字符串[已关闭] 7 年前 |