With
许多其中一种语言特征被认为属于"仅仅因为你拥有它并不意味着你必须使用它"类别.有极少数场合我给它的房子,房间-我发现一个或两种情况下,它的使用非常复杂的多层次结构,编译器在哪里并不完全如你所期望离不开使用时是必不可少的它更容易包含,但在德尔福编码的10年中,我认为这些可以用一只手的手指来计算.
它确实倾向于在示例中得到相当多的使用,因为代码看起来更清晰,但实际上,在查看您没有编写或未使用的代码时,确定变量是简单还是结构的一部分会对维护产生影响一段时间很容易超过这一点.在我使用过的每个版本的Delphi上调试器的已知问题都是关键.
With
许多其中一种语言特征被认为属于"仅仅因为你拥有它并不意味着你必须使用它"类别.有极少数场合我给它的房子,房间-我发现一个或两种情况下,它的使用非常复杂的多层次结构,编译器在哪里并不完全如你所期望离不开使用时是必不可少的它更容易包含,但在德尔福编码的10年中,我认为这些可以用一只手的手指来计算.
它确实倾向于在示例中得到相当多的使用,因为代码看起来更清晰,但实际上,在查看您没有编写或未使用的代码时,确定变量是简单还是结构的一部分会对维护产生影响一段时间很容易超过这一点.在我使用过的每个版本的Delphi上调试器的已知问题都是关键.
当鼠标悬停在变量上时,调试器无法在您要检查的源代码中显示的变量与相关的with语句之间建立连接.您必须检查debug-watch窗口中的值并在那里指定完整变量,例如MyNumber.Num.
with语句的调试问题是已知的.这是我看到它们时删除它们的原因之一.在我看来,你不应该以可维护性为代价来提高编码速度.
我看到很多(并且学会讨厌)的常见结构是:
with TMyObject.Create do try Method1(blah, blah, blah); Method2(blah, blah, blah); finally Free; end;
甚至可以在with语句中添加更多构造:
with A, B, C, D do // Aargh!
但话说回来,如果你可以替换有时使用with语句的有效用途:
A.B.C.D.E.Method1; A.B.C.D.E.Method2; A.B.C.D.E.Method3; A.B.C.D.E.Method4; A.B.C.D.E.Method5; A.B.C.D.E.Method6;
同
with A.B.C.D.E do begin Method1; Method2; Method3; Method4; Method5; Method6; end;
尽管使用A.B.C.D.E
有点疑问,但它往往是"delphi方式".但现在有了助手,我们可以拥有一个完美有效的解决方案:
TAHelper = class helper for TA public procedure Method1; endl procedure TAHelper.Method1; begin // You can (should) add sanity checks here. B.C.D.E.Method1; end;
所以现在你可以使用:
A.Method1;
在我看来哪个好多了.
在与语句语法阿斯巴甜:它的味道像很多语法糖,但留下一个不好的回味和原来实际上是在长期内对人体有害.最好不要使用它.
我很少使用With..do,并倾向于这样做
var Sc : TE_Type; begin Sc := A.B.C.D.E; sc.Method1; sc.Method2; sc.Method3; sc.Method4; sc.Method5; sc.Method6; end;
当然,Sc的一个不错的名字也不会受到伤害.而且我认为它比使用和调试器发现自己更好更清楚.所以,我非常喜欢'快捷'变量.