是德尔福“与”关键词不好的做法? [英] Is Delphi "with" keyword a bad practice?

查看:277
本文介绍了是德尔福“与”关键词不好的做法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在delphi中,我一直在阅读关于 关键字的不好的东西,但是在我看来,如果你不使用它。它可以使你的代码看起来很简单。



我经常把我所有的TClientDataSets和TField放在TDataModules中。所以在我的表单中,我有这样的代码

 过程TMyForm.AddButtonClick(发件人:TObject); 
begin
with LongNameDataModule do
begin
LongNameTable1.Insert;
LongNameTable1_Field1.Value:=some value;
LongNameTable1_Field2.Value:= LongNameTable2_LongNameField1.Value;
LongNameTable1_Field3.Value:= LongNameTable3_LongNameField1.Value;
LongNameTable1_Field4.Value:= LongNameTable4_LongNameField1.Value;
LongNameTable1.Post;
end
end;

没有关键字我必须写这样的代码



 程序TMyForm.AddButtonClick(发件人:TObject); 
begin
LongNameDataModule.LongNameTable1.Insert;
LongNameDataModule.LongNameTable1_LongNameField1.Value:=some value;

LongNameDataModule.LongNameTable1_LongNameField2.Value:= $​​ b $ b LongNameDataModule.LongNameTable2_LongNameField1.Value;

LongNameDataModule.LongNameTable1_LongNameField3.Value:= $​​ b $ b LongNameDataModule.LongNameTable3_LongNameField1.Value;

LongNameDataModule.LongNameTable1_LongNameField4.Value:= $​​ b $ b LongNameDataModule.LongNameTable4_LongNameField1.Value;

LongNameDataModule.LongNameTable1.Post;
结束

我认为使用关键字更容易阅读。 >

我应该避免使用关键字吗?

解决方案

p>在A,B,C,D等病态之外,最大的危险在于,你的代码可以默认地改变意思,而不用通知你。考虑这个例子:

  with TFoo.Create 
try
Bar:= Baz;
DoSomething();
终于
免费;
结束

你写这个代码知道Bar是TFoo的属性,而Baz是类型的属性包含具有此代码的方法。



现在,两年后,一些很有意义的开发人员将一个Baz属性添加到TFoo。你的代码默默地改变了意义。编译器不会抱怨,但代码现在已经坏了。


I been reading bad things about the with keyword in delphi but, in my opinion, if you don't over use it. It can make your code look simple.

I often put all my TClientDataSets and TFields in TDataModules. So in my forms I had code like this

procedure TMyForm.AddButtonClick(Sender: TObject);
begin  
  with LongNameDataModule do
  begin
     LongNameTable1.Insert;
     LongNameTable1_Field1.Value := "some value";
     LongNameTable1_Field2.Value := LongNameTable2_LongNameField1.Value;
     LongNameTable1_Field3.Value := LongNameTable3_LongNameField1.Value;
     LongNameTable1_Field4.Value := LongNameTable4_LongNameField1.Value;
     LongNameTable1.Post;
  end
end;

without the with keyword I have to write the code like this

    procedure TMyForm.AddButtonClick(Sender: TObject);
    begin            
      LongNameDataModule.LongNameTable1.Insert;
      LongNameDataModule.LongNameTable1_LongNameField1.Value := "some value";

      LongNameDataModule.LongNameTable1_LongNameField2.Value :=
               LongNameDataModule.LongNameTable2_LongNameField1.Value;

      LongNameDataModule.LongNameTable1_LongNameField3.Value :=
               LongNameDataModule.LongNameTable3_LongNameField1.Value;

      LongNameDataModule.LongNameTable1_LongNameField4.Value :=
               LongNameDataModule.LongNameTable4_LongNameField1.Value;

      LongNameDataModule.LongNameTable1.Post;
    end;

I think is easier to read using the with keyword.

Should I avoid using the with keyword?

解决方案

The biggest danger of with, outside of pathological conditions like "with A, B, C, D" is that your code can silently change meaning with no notice to you. Consider this example:

with TFoo.Create
try
  Bar := Baz;
  DoSomething();
finally
  Free;
end;

You write this code knowing that Bar is a property of TFoo, and Baz is a property of the type containing the method which has this code.

Now, two years later, some well-meaning developer comes in adds a Baz property to TFoo. Your code has silently changed meaning. The compiler won't complain, but the code is now broken.

这篇关于是德尔福“与”关键词不好的做法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆