Почему я не должен использовать «с» в Delphi? - PullRequest
19 голосов
/ 16 сентября 2008

Я слышал, что многие программисты, особенно программисты на Delphi, презирают использование 'with'.

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

Вот пример:

procedure TBitmap32.FillRectS(const ARect: TRect; Value: TColor32);
begin
  with ARect do FillRectS(Left, Top, Right, Bottom, Value);
end;

Мне нравится использовать with. Что со мной не так?

Ответы [ 16 ]

2 голосов
/ 16 сентября 2008

Мне это не нравится, потому что это затрудняет отладку. Вы не можете прочитать значение переменной или тому подобное, просто наведя на нее курсор мыши.

1 голос
/ 16 сентября 2008
... беги быстрее ...

Не обязательно - ваш компилятор / интерпретатор обычно лучше оптимизирует код, чем вы.

Я думаю, что это заставляет меня сказать "гадость!" потому что это лениво - когда я читаю код (особенно чужой), мне нравится видеть явный код. Так что я бы даже написал «this.field» вместо «field» в Java.

1 голос
/ 16 сентября 2008

Это позволяет некомпетентным или злым программистам писать нечитаемый код. Поэтому используйте эту функцию только в том случае, если вы не некомпетентны и не злы.

1 голос
/ 16 сентября 2008

В этом нет ничего плохого, если вы сохраняете это простым и избегаете двусмысленностей.

Насколько я знаю, это ничего не ускоряет - это чисто синтаксический сахар.

0 голосов
/ 27 июля 2010

В Delphi 2005 существует серьезная ошибка в операторе with-do - оценка указателя потеряна и повторная передача указателем вверх. Там нужно использовать локальную переменную, а не тип объекта напрямую.

0 голосов
/ 16 сентября 2008

Мы недавно запретили его в наших стандартах кодирования Delphi.

Плюсы часто перевешивали минусы.

То есть ошибки были введены из-за их неправильного использования. Это не оправдывает экономию времени на написание или выполнение кода.

Да, использование с can может (слегка) ускорить выполнение кода.

Ниже foo оценивается только один раз:

with foo do
begin
  bar := 1;
  bin := x;
  box := 'abc';
end

Но здесь оно оценивается трижды:

foo.bar := 1;
foo.bin := x;
foo.box := 'abc';
...