重构“with”块的工具

9
有没有一款重构工具可以删除“with”块?例如,将以下代码转换为:
with Form1 do
begin
  Height := Blah;
  Blubb := Name;
end;

为了

Form1.Height := Blah;
Blubb := Form1.Name;

其中Form1是VCL TForm。最好能与Delphi 2007兼容。


4
我认为并没有这样的东西,要实现这个需要大量解析,必须下降到TObject子类的级别才能达到这个目的... - user497849
2
顺便提一下:实现该重构的难度正是“with”可能危险的原因! - jpfollenius
2
@Smasher,由于编译器可以解析with语句,因此应进行重构。结果可能不是您所期望的。 - Uwe Raabe
4
@Smasher:并没有太大的困难。这段代码可以编译并按指示运行。任何重构只需要重新生成编译器遵循的作用域规则即可。你所担心的“危险”源于调试器在处理“with”时无法正确遵守这些规则。如果调试器能够正常工作,“with”可能会少一些问题(虽然仍然不完全安全)。 - Deltics
2
@Smasher - 关键是,虽然很难,但这并不妨碍创建一个可靠的“重构”。重构必须遵循的规则不必被推导出来,它们已经被编写并体现在编译器中。假设开发调试器代码的开发人员也放弃了,并说:“是的,我们可以修复它,但太难了。哦,我们真倒霉。”然而,编译器团队以某种方式成功了,这可以从编译器实现的事实中看出。 :) - Deltics
显示剩余3条评论
3个回答

13

其中一个Castalia重构工具被命名为“消除'WITH'”。

我无法评论它在非平凡代码中的表现,因为我倾向于避免使用"with"。


...因为你更快 :) - TLama
当然要点赞。我接受了User0815的答案,以支持SO的新手们。 :-) - Uli Gerhardt
5
我能接受那个。另一个答案同样正确,只比我的晚了两分钟。 - Bruce McGee
另一个答案没有链接,所以我接受了你的 :-) - fnkr

11

我觉得Jacob Thurman/TwoDesk Software最新的Castalia功能很强大


1

Model Maker Code Explorer 最近已经免费,它有一个“Convert with statement”工具。虽然它不是完全自动化的重构工具,但如果 Castalia 无法使用,它可能会很有用。


在看完你的回答后,我试了一下。但实际上并没有什么帮助。在所有测试中,自动生成的代码都无法编译,手动转换反而更快。 - dummzeuch
@dummzeuch,我发现它在处理大型(数十行)with语句时非常有用。它有几个选项,可能会使删除更容易。 然而,它仍然是一个简单的文本工具,而不是重构工具,这是一个品味问题,所以我不会坚持。 - Serhii Kheilyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接