Является ли Delphi ключевым словом "with" плохая практика? - PullRequest
33 голосов
/ 05 февраля 2009

Я читал плохие вещи о с ключевым словом в delphi, но, на мой взгляд, если вы не используете его слишком часто Это может сделать ваш код простым.

Я часто помещаю все свои TClientDataSets и TFields в TDataModules. Так что в моих формах у меня был такой код

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;

без с ключевым словом Я должен написать код, подобный этому

    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;

Я думаю, что легче читать, используя с ключевым словом .

Следует ли мне избегать использования с ключевым словом ?

Ответы [ 14 ]

3 голосов
/ 05 февраля 2009

Основная проблема с «with» заключается в том, что вы не знаете, где заканчивается его область действия, и вы можете иметь несколько совпадений с операторами.

Не думаю, что вам следует избегать его использования, если ваш код читабелен.

Одно из предложений сделать его более читабельным (и менее запутанным в длинном коде) заключалось в том, чтобы codegear добавил опцию , чтобы разрешить псевдонимы в with и, возможно, разрешить множественные символы в одном:

procedure TMyForm.AddButtonClick(Sender: TObject);
begin  
  with LongNameDataModule as dm, dm.LongNameTable1 as t1, dm.LongNameTable2 as t2 do
  begin
    t1.Insert;
    t1.FieldByName('Field1').AsString := 'some value';
    t1.FieldByName('Field2').AsString := t2.FieldByName('Field2').AsString;
    t1.Post;
    dm.Connection.Commit;
  end
end;
2 голосов
/ 06 февраля 2009

Здесь много отличных ответов о том, почему утверждение with плохо, поэтому я постараюсь не повторять их. Я годами пользуюсь оператором with, и я начинаю уклоняться от него. Это отчасти потому, что может быть сложно определить область действия, но в последнее время я начинаю заниматься рефакторингом, и ни один из автоматических рефакторингов не работает с оператором with - и автоматический рефакторинг - это круто.

Также некоторое время назад я снял видео о том, почему утверждение with плохо, это не одна из моих лучших работ, но Вот оно

0 голосов
/ 08 мая 2018

Использовать with только временно (так же, как вы временно комментируете).

Это помогает вам писать наброски кода, чтобы что-то компилировалось и работало быстро. Если вы консолидируете решение, очистите его! Удалите with при перемещении кода в нужное место.

0 голосов
/ 15 марта 2014

Текущее утверждение With является «опасным», но его можно существенно улучшить:

  With TForm1.Create (Nil) Do  // New TForm1 instance
    Try
      LogForm (");  // That same instance as parameter to an outer method
      "ShowModal;  // Instance.ShowModal
    Finally
      "Free;  // Instance.Free
    End;

Мое предложение:

  1. Не более одного объекта / записи в заголовке With.
  2. Вложенные блоки не допускаются.
  3. Использование "для обозначения объекта / записи (двойные кавычки похожи до такой же отметки: http://en.wikipedia.org/wiki/Ditto_mark).
...