Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];

Вниз

Отношение к использованию with.   Найти похожие ветки 

 
MVova ©   (2004-05-21 11:04) [0]

Интересует ваше мнение к использованию with ... do.

Я лично использую только в одном случае:
with TStringList.Create do
try
 .....
finally
Free
end;

И то только как временные вставки, когда надо в текстовый файл что-то записать. В рабочем варианте и того нет.

И еще вопрос.
Дает ли использование with какую-то пользу для кода, в смысле оптимизации компилятором?


 
PVOzerski ©   (2004-05-21 11:05) [1]

Отлаживать с ним неудобно. Выигрыша в скорости тоже не замечал.


 
Игорь Шевченко ©   (2004-05-21 11:13) [2]


> Дает ли использование with какую-то пользу для кода, в смысле
> оптимизации компилятором?


Дает.


 
Johnmen ©   (2004-05-21 11:20) [3]

>Дает ли использование with какую-то пользу для кода, в смысле
>оптимизации компилятором?

Дает. Выигрыш в скорости можно не заметить...:)


 
Vit@ly ©   (2004-05-21 11:20) [4]

With Datamodule1 do
и т.п.
достаточно удобно?


 
Algol   (2004-05-21 11:50) [5]

На королевстве есть обсуждение по этому вопросу http://www.delphikingdom.com/asp/talktopic.asp?ID=327


 
Паниковский ©   (2004-05-21 12:19) [6]

Дает возможность работать с интерфейсом и при смене названия
или обьекта класса с подобным интерфейсом нне так много надо
переписывать.


 
DiamondShark ©   (2004-05-21 12:31) [7]


> Отлаживать с ним неудобно

Вы всё ещё отлаживаете? Тогда мы летим к вам!


> Дает ли использование with какую-то пользу для кода, в смысле
> оптимизации компилятором?

Тупой пример:

with MyControl.Font do
 begin
   Style := [fsBold];
   Name := "Times New Roman";
   Size := 20;
 end;


Если для чтения свойства используется не поле, а метод, то без with было бы три вызова метода чтения.


 
Гаврила ©   (2004-05-21 12:31) [8]

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

with Item1, Item2, Item3, Item4, Item4, Item5, Item7 do
.... // далее блок на 3 экрана

C трудом поборол желание набить морду


 
panov ©   (2004-05-21 12:33) [9]

Если для чтения свойства используется не поле, а метод, то без with было бы три вызова метода чтения.

С лихвой окупается избежанием многочисленных ошибок, связанных с With


 
Empleado ©   (2004-05-21 13:53) [10]

Часто использую так:
with DataModule, Dataset do
...
порой очень удобно.

Gracias


 
Игорь Шевченко ©   (2004-05-21 14:01) [11]

panov ©   (21.05.04 12:33)
Гаврила ©   (21.05.04 12:31)

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


 
default ©   (2004-05-21 14:05) [12]

а мне в with-е не нравится то что всплывающей подсказкой нельзя пользоваться


 
Романов Р.В. ©   (2004-05-21 14:08) [13]

В основном в виде
with TSomeThing.Create do
try
 DoSomeThing;
finally
 Free;
end;


 
Игорь Шевченко ©   (2004-05-21 14:14) [14]

Всем утверждающим, что with является источником ошибок в программе, могу посоветовать посмотреть исходные тексты VCL и поискать там слово with, где и как оно используется.


 
Johnmen ©   (2004-05-21 14:20) [15]

>Игорь Шевченко ©   (21.05.04 14:01) [11]

:)))
Полностью согласен...


 
Agent13 ©   (2004-05-21 14:25) [16]

with использую с удовольствием и с удобством везде, где нужно. За единственным исключением - если написал без него, а потом пришлось модифицировать код и оказалось, что with бы не помешал, чаще всего уже не дописываю, оставляю как есть :)


 
vuk ©   (2004-05-21 14:38) [17]

Кстати, я уже на Королевстве этот вопрос задавал противникам with. Вам неявный self в методах не мешает? :o)

Кстати, об использовании with...
Как вам такое? :o)


with Iterator([Button1, Button2, Button3, Edit1, Panel2]) do
 while not IsDone do
 begin
   TControl(Current).Enabled := false;
   Next;
 end;


 
euru ©   (2004-05-21 14:48) [18]

>Игорь Шевченко ©   (21.05.04 14:01) [11]
Согласен.

Всем противникам использования в программе with предлагаю перед идентификаторами в обязательном порядке указывать имя модуля, где они были объявлены.


 
Dmitriy O. ©   (2004-05-21 14:53) [19]

НУ вот with не стоит GOTO  отстой. Скоро воще только один IF останется.


 
panov ©   (2004-05-21 15:08) [20]

>Игорь Шевченко ©   (21.05.04 14:14) [14]

Всем утверждающим, что with является источником ошибок в программе, могу посоветовать посмотреть исходные тексты VCL и поискать там слово with, где и как оно используется.


Посмотрел, ничего особенного не увидел.

Предлагаю найти отличие в коде:


function TRegGroups.GetClass(const AClassName: string): TPersistentClass;
var
  I: Integer;
begin
  Result := nil;
  for I := 0 to FGroups.Count - 1 do
    with TRegGroup(FGroups[I]) do
    begin
      if Active then Result := GetClass(AClassName);
      if Result <> nil then Exit;
    end;
end;
</>

и


function TRegGroups.GetClass(const AClassName: string): TPersistentClass;
var
  I: Integer;
begin
  Result := nil;
  for I := 0 to FGroups.Count - 1 do
    with TRegGroup(FGroups[I]) do
    begin
      if FActive then Result := GetClass(AClassName);
      if Result <> nil then Exit;
    end;
end;


With можно использовать для самых простейших конструкций (Романов Р.В. ©   (21.05.04 14:08) [13])

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


 
Song   (2004-05-21 15:09) [21]

Любимая штука!
У меня With"ов в программе больше чем begin"ов и end"ов :)
В основном из-за лени.
Чем писать ShowMessage(ListBox1.Items[ListBox1.ItemIndex]);
я напишу With ListBox1 Do ShowMessage(Items[ItemIndex]); что короче, быстрей и красивей.


 
Игорь Шевченко ©   (2004-05-21 15:13) [22]


> Предлагаю найти отличие в коде:



>  if Active then Result := GetClass(AClassName);


>      if FActive then Result := GetClass(AClassName);


И что ?


> With можно использовать для самых простейших конструкций
>


Еще раз - смотреть VCL до полного просветления.


 
Song ©   (2004-05-21 15:13) [23]

Мда.. анкетка-то слетела


 
Тимохов ©   (2004-05-21 15:14) [24]

я перестал использовать with года три назад.
пока не жалею.


 
Song ©   (2004-05-21 15:14) [25]

>>В более сложных случаях чтение кода и отладку можно превратить в кошмар.
ИМХО неправда. Это только для нетренированных :)


 
Anatoly Podgoretsky ©   (2004-05-21 15:14) [26]

panov ©   (21.05.04 15:08) [20]
В букве F
В этои и проблема наверно.


 
Игорь Шевченко ©   (2004-05-21 15:16) [27]

Тимохов ©   (21.05.04 15:14)


> я перестал использовать with года три назад.
> пока не жалею.


Марксизм не догма, а руководство к действию. Не жалко пальцев и читателей кода - можно и with не использовать. Еще раз про овощ.


 
Song ©   (2004-05-21 15:19) [28]

Причём у меня даже до смешного доходит :)
Когда нужно написать
Font.Color:=ClRed;
Font.Style:=[fsBold];

я напишу
With Font Do
Begin
 Color:=ClRed;
 Style:=[fsBold;]
End; {With}

Хотя получается на 2 строчки больше. Просто уже привычка :)


 
Тимохов ©   (2004-05-21 15:20) [29]


> Игорь Шевченко ©   (21.05.04 15:16) [27]

это вопрос религии.
предлагаю не делать выводы про овощи и про удобство читателей.

угодить всем все равно не получится.
зато я (автор) не имею проблем.
разве это не важно?


 
panov ©   (2004-05-21 15:28) [30]

>Anatoly Podgoretsky ©   (21.05.04 15:14) [26]

В букве F
Конечно.

>Игорь Шевченко ©   (21.05.04 15:13) [22]

И что ?

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

Если в наследнике добавлено поле Active, а в родительском классе есть FActive, тут, в случае ошибки, и получаем проблемы, например.

Не вижу особого смысла в использовании with.

Только 2 причины вижу:
1. Самые простые конструкции (или там, где сложнее написать без with) (Романов Р.В. ©   (21.05.04 14:08)  [13] и
(FList - TThreadList))
   with FList.LockList do
   try
     for I := 0 to Count - 1 do
       IInterface(List[I]) := nil;
     Clear;
   finally
     Self.FList.UnlockList;
   end;

2. Природная лень, при которой лень нажать 2 кнопки Copy,Paste (Ctrl-Ins,Shift-Ins).

Пример совершенно нечитабельного кода привел vuk ©   (21.05.04 14:38) [17]

with Iterator([Button1, Button2, Button3, Edit1, Panel2]) do
while not IsDone do
begin
  TControl(Current).Enabled := false;
  Next;
end;


 
Тимохов ©   (2004-05-21 15:30) [31]


> panov ©   (21.05.04 15:28) [30]

приятно, что я не одинок - есть люди, отказавшиеся от with :)))))


 
vuk ©   (2004-05-21 15:30) [32]

to panov ©   (21.05.04 15:28) [30]:
>Пример совершенно нечитабельного кода привел vuk ©   (21.05.04
>14:38) [17]
Хм... А это кому как. :o)


 
panov ©   (2004-05-21 15:35) [33]

>vuk ©   (21.05.04 15:30) [32]

Думаю, что это из-за того, что нет контекста.

with Iterator([Button1, Button2, Button3, Edit1, Panel2]) do
while not IsDone do
begin
 TControl(Current).Enabled := false;
 Next;
end;

Что есть Next ? Метод класса или метод Iterator?
Что есть TControl(Current)?

Без with все было бы понятнее.


 
Johnmen ©   (2004-05-21 15:38) [34]

>приятно, что я не одинок - есть люди, отказавшиеся от with :)))))

Приятно, что и разумные почитатели with не одиноки - с ними в компании разработчики собственно инструмента.


 
Anatoly Podgoretsky ©   (2004-05-21 15:39) [35]

panov ©   (21.05.04 15:28) [30]
Не только добавление, но и переиманование, может даже еще опаснее, поскольку глядя на текст, который работал и не сообразишь. Но есть места где использование with не только оправдано, но и целесобразно, например создание анонимных объектов, или такие места где ошибка маловероятна, например если одна строка [21].

В общем это дело овощей, каждый должен сам решить.


 
Игорь Шевченко ©   (2004-05-21 15:39) [36]

Тимохов ©   (21.05.04 15:20)


> это вопрос религии.


Вот я и предлагаю не переводить использование той или иной конструкции в вопросы религии. Для меня одним из образцов служат исходные коды VCL (чего и всем рекомендую)


 
vuk ©   (2004-05-21 15:40) [37]

to panov ©   (21.05.04 15:35) [33]
>Без with все было бы понятнее.
Это дело привычки. Но без with было бы длинеее:

var
I: IIterator;
...
 i := Iterator([Button1, Button2, Button3, Edit1, Panel2]);
 while not i.IsDone do
 begin
   TControl(i.Current).Enabled := false;
   i.Next;
 end;
...



 
panov ©   (2004-05-21 15:40) [38]

>Johnmen ©   (21.05.04 15:38) [34]

Ты почитатель?

Тогда приведи аргументы в пользу использования with?


 
Anatoly Podgoretsky ©   (2004-05-21 15:41) [39]

Игорь Шевченко ©   (21.05.04 15:39) [36]
При том в который раз.


 
panov ©   (2004-05-21 15:42) [40]

>Anatoly Podgoretsky ©   (21.05.04 15:39) [35]
Абсолютно согласен.

with TMyClass.Create do
begin
  try
    ...
  finally
    Free;
  end;
end;


 
Тимохов ©   (2004-05-21 15:45) [41]


> Игорь Шевченко ©   (21.05.04 15:39) [36]

отступ 2 вас тоже удовлетворяет?
меня знаете ли нет, мне больше нравится (уже лет 15 как) отступ 3.

всему свое место.
with, допускаю, можно использовать.
мне он просто не нравится - имея его в коде мне сложно поддерживать свои 1мнл чистых строк знаете ли.

:))


 
Anatoly Podgoretsky ©   (2004-05-21 15:46) [42]

panov ©   (21.05.04 15:42) [40]

with TMyForm.Create do Show;

TMyForm.Create.Show;


 
VMcL ©   (2004-05-21 15:46) [43]

Не понимаю, о чем спор. Все мы, люди разные и, естественно, что у нас разные типы интеллекта и типы восприятия.


 
Johnmen ©   (2004-05-21 15:48) [44]

>panov ©   (21.05.04 15:40) [38]
>Ты почитатель?
>Тогда приведи аргументы в пользу использования with?

Я разумный использователь, скажем так...:)
А аргументов уже наприводили.


 
panov ©   (2004-05-21 15:53) [45]

>Игорь Шевченко ©   (21.05.04 15:39) [36]

Вот я и предлагаю не переводить использование той или иной конструкции в вопросы религии. Для меня одним из образцов служат исходные коды VCL (чего и всем рекомендую)


Это не вопрос религии-)

Пара высказываний по теме топика:
1. With надо использовать только в тех случаях, когда это действительно необходимо

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


 
Плохиш   (2004-05-21 15:57) [46]

Весеннее обострение :-)
Скоро лето, всё пройдёт ;-)


 
Игорь Шевченко ©   (2004-05-21 15:58) [47]


> Пара высказываний по теме топика:
> 1. With надо использовать только в тех случаях, когда это
> действительно необходимо


Таких случаев нету вообще. Всегда можно заменить конструкцию с использованием with, конструкцией, не использующей этого оператора. Чаще - более громоздкой и нечитабельной, реже - менее громоздкой. Кроме того, как уже было сказано, использование with влияет на быстродействие откомпилированного кода.


 
Тимохов ©   (2004-05-21 15:58) [48]


> panov ©   (21.05.04 15:53) [45]
> Это не вопрос религии-)

Не могу с вами согласится.
Когда держишь большой проект (для одного-двух человек), то нужна именно религия, в которую следует свято верить.
Иначе, концов не соберешь.

Не использовать with для меня вопрос именно религии.
Также как делать отступы, также как параметры начинать с буквы "а", также как private начинать с "f".


 
panov ©   (2004-05-21 16:00) [49]

Таких случаев нету вообще.

Я думаю, что есть такие случаи. А именно - если код без использования Width становится совершенно нечитабельным, то это веская причина для его использования...


 
Тимохов ©   (2004-05-21 16:02) [50]


> Кроме того, как уже было сказано, использование with влияет
> на быстродействие откомпилированного кода.

Был время я просил Анатолия прокомментировать данное утверждение. Он сказал, что это его личное наблюдение.

На чем строится ваше мнение?
Есть ли это в какой-нибудь доке?


 
Johnmen ©   (2004-05-21 16:02) [51]

>Тимохов ©   (21.05.04 15:58) [48]
>Не использовать with для меня вопрос именно религии.

"Почём опиум для народа ?" (c) О.Бендер

:)


 
Anatoly Podgoretsky ©   (2004-05-21 16:03) [52]

panov ©   (21.05.04 15:53) [45]
пример нерационального использования в Anatoly Podgoretsky ©   (21.05.04 15:46) [42]
Но конструкция часто встречается


 
Тимохов ©   (2004-05-21 16:05) [53]


> Johnmen ©   (21.05.04 16:02) [51]

Зря смеетесь. :))
Я же объяснил, что я его не люблю, т.к. плохо воспринимаю.
При большом коде иметь плоховоспринимаемую конструкцию думаю не вполне разумно.

ЗЫ. Вот, блин, втянулся в обсуждение не пойми чего. :))


 
Anatoly Podgoretsky ©   (2004-05-21 16:06) [54]

Тимохов ©   (21.05.04 16:02) [50]
Я встречал и утверждение об обратном, видимо зависит от ситуации, что мы знаем об внутренней кухне компилятора/оптимизатора, которая не догма и тоже меняется.
Для меня это литеральная подстановка, но это не означает, что это истина, может кое где оптимизатор и делает что то.
Но как правило это не важно, если это не гигантский цикл.


 
Игорь Шевченко ©   (2004-05-21 16:08) [55]


> На чем строится ваше мнение?
> Есть ли это в какой-нибудь доке?


View|Debug windows|CPU


> Не использовать with для меня вопрос именно религии.


А смысл ?

Borland, как было отмечено, в момент разработки vcl тоже "держал" немаленький проект, даже свои стандарты к оформлению кода разработал, в том числе и префикс F у полей классов и, иногда, A у параметров и локальных переменных.


 
DiamondShark ©   (2004-05-21 16:14) [56]


> Кроме того, как уже было сказано, использование with влияет
> на быстродействие откомпилированного кода.

Больше, чем на быстродействие. На семантику.


 
Тимохов ©   (2004-05-21 16:14) [57]


> Borland, как было отмечено, в момент разработки vcl тоже
> "держал" немаленький проект,

у меня больше.... :((( а людей меньше (двое).


 
Внук ©   (2004-05-21 16:28) [58]

>>приятно, что я не одинок - есть люди, отказавшиеся от with :)))))
 Теперь нас трое. Впрочем, я свои вргументы приводил неоднократно, а спорить смысла не вижу.


 
Тимохов ©   (2004-05-21 16:33) [59]


> Внук ©   (21.05.04 16:28) [58]

если ваш цвет считать почти белым, то мы могем составить с Panov российский флаг!

:)))

Ура!!!


 
Mim1 ©   (2004-05-21 16:37) [60]

А я вот использовал with и никогда об этом не задумывался :). Проблемм с ошибками (изза with) и т.п. не возникает.

PS Щас вспомнилась фраза из КВН "Вам ТАКИМ надо держаться вместе".


 
App ©   (2004-05-21 16:50) [61]

Панов далеко


 
nikkie ©   (2004-05-21 17:02) [62]

крамольная мысль: если бы with в паскале был такой же классный, как в VB, то и споров не было б.


 
Mystic ©   (2004-05-21 17:09) [63]

1. with я использую
2. Код от vuk вполне читабелен

Off: Кстати, недавно наткнулся на такую реализацию итераторов:

with Iterator([Button1, Button2, Button3, Edit1, Panel2]) do
 while
Next do
   TControl(Current).Enabled := false;


(набор расширяется начальным пустым элементом, функция Next возвращает False, если это последний элемент). Удобно, что не надо вызывать метод Next, который редко, но иногда все же пропускается...


 
euru ©   (2004-05-21 17:15) [64]

>nikkie ©   (21.05.04 17:02) [62]
Тогда уж, по-моему, лучше был бы такой вариант:

with A.B as x, A as y do begin
 x.method();
 y.method();
end;


 
ламер ©   (2004-05-21 17:28) [65]

спорить о том, использовать with или нет - тоже самое, что спорить о том, что лучше - while...do или repeat...until. всё зависит от конкретного случая.

например, так (пример, конечно, надуманный, но всё-таки):

btnOk := TButton.Create(nil);
with btkOk do
begin
 Caption := "Ok";
 Left := 10;
 Top := 10;
 Width := 100;
 Height := 100;
 OnClick := frmMain.OkButtonClick;
end;


> DiamondShark ©   (21.05.04 12:31) [7]
> with MyControl.Font do
>  begin
>    Style := [fsBold];
>    Name := "Times New Roman";
>    Size := 20;
>  end;
>
> Если для чтения свойства используется не поле, а метод, то без > with было бы три вызова метода чтения.

неправда. компилятор автоматически произведёт вынос выражения MyControl.Font.


 
Anatoly Podgoretsky ©   (2004-05-21 17:37) [66]

Ник ламер заняли, но LMD еще свободен, шутники вперед!


 
Тимохов ©   (2004-05-21 17:39) [67]

похоже Анатолия доставать все начали :)))))


 
Anatoly Podgoretsky ©   (2004-05-21 17:41) [68]

Тимохов ©   (21.05.04 17:39) [67]
Меня не в жизнь, я тоже хочу веселиться :-)


 
Тимохов ©   (2004-05-21 17:43) [69]


> Anatoly Podgoretsky ©   (21.05.04 17:41) [68]

Что же останавливаешь, сами же сказали, что ник ЛМД свободен :))


 
ламер ©   (2004-05-21 17:45) [70]

> Anatoly Podgoretsky ©   (21.05.04 17:37) [66]
> Ник ламер заняли, но LMD еще свободен, шутники вперед!

а почему, собственно, шутники? ответ был вполне серьёзный.


 
Gero ©   (2004-05-21 17:47) [71]

Иногда приходится сталкиваться с подобным кодом:

SomeClass.Property_1 := Value_1;
SomeClass.Property_2 := Value_2;
SomeClass.Property_3 := Value_3;
SomeClass.Property_4 := Value_4;
SomeClass.Property_5 := Value_5;
SomeClass.Property_6 := Value_6;
SomeClass.Property_7 := Value_7;
SomeClass.Property_8 := Value_8;
SomeClass.Property_9 := Value_9;
SomeClass.Property_10 := Value_10;
SomeClass.Property_11 := Value_11;
SomeClass.Property_12 := Value_12;

Когда это можно было бы заменить на:

with SomeClass do
 begin
   Property_1 := Value_1;
   Property_2 := Value_2;
   Property_3 := Value_3;
   Property_4 := Value_4;
   Property_5 := Value_5;
   Property_6 := Value_6;
   Property_7 := Value_7;
   Property_8 := Value_8;
   Property_9 := Value_9;
   Property_10 := Value_10;
   Property_11 := Value_11;
   Property_12 := Value_12;
 end;

Еще скажите, что он не стал более читабельным.

P.S. Могу привести программу, в которой такого (1 вариант) кода - уйма.
AvtoShema называется. :)


 
Anatoly Podgoretsky ©   (2004-05-21 17:50) [72]

ламер ©   (21.05.04 17:45) [70]
Несоответсвие ника остальному, принимаю как шутку или отместку некоторым обсуждениям, надеюсь, что не в пику кому либо или как?


 
Anatoly Podgoretsky ©   (2004-05-21 17:53) [73]

Gero ©   (21.05.04 17:47) [71]
Конечно нет, читабельный, но не надежный, стоит появитсья у SomeClass полю, свойству или методу с именами Value_х и все, а вот в первом варианте проблемы не будет.
Ведь возражения не столько по читабельности, а с ним тоже иногда проблемы, сколько об надежности.


 
Mystic ©   (2004-05-21 17:54) [74]


> Иногда приходится сталкиваться с подобным кодом:
>
> SomeClass.Property_1 := Value_1;


Скорее даже:

PaintBox.Canvas.Brush.Color := clBtnFace;
PaintBox.Canvas.FillRect(Rect(0, 0, PaintBox.Width, PaintBox.Height));
// Другие операторы рисования несметным числом


все это обычно заменяется:

with PaintBox, PaintBox.Canvas do
begin
 Brush.Color := clBtnFace;
 FillRect(Rect(0, 0, PaintBox.Width, PaintBox.Height));
 // Другие операторы рисования...
end;


 
vuk ©   (2004-05-21 17:55) [75]

to Mystic ©   (21.05.04 17:09) [63]:
У меня Next тоже возвращает boolean. Правда есть одно отличие.  Решение, наверное, неудачное и я уже не помню почему так сделал, но у меня true возвращается в случае достижения конца набора. А дополнительный элемент в начале списка, если очень хочется, можно добавить при задании набора.
:o)


 
ламер ©   (2004-05-21 17:58) [76]

> Anatoly Podgoretsky ©   (21.05.04 17:50) [72]
хм, можно и так сказать.
разумеется, ник взят не из-за кого-то конкретного. просто с другим ником меня рано или поздно обвинят в ламерстве :) а дискуссии здесь грозные :)


 
Mystic ©   (2004-05-21 17:59) [77]

Имеется в виду, чтобы попасть на первый элемент надо вызвать Next (иначе Current = nil). Основная идея --- заменить цикл вида

while not RS.EOF do
begin
 Operator;
 RS.MoveNext;
end;

на

while RS.MoveNext do Operator;

Так сделано в Cache", если я не ошибаюсь.


 
Gero ©   (2004-05-21 18:04) [78]

А вобще глупо спорить о подобных вещах.
Я полностью согласен с [11] Игорь Шевченко ©   (21.05.04 14:01).
with иногда бывает очень полезен.
Но нужно знать меру, когда лучше с ним, а когда без него.
Возвращаясь к примеру [71] скажу, что возможно я захочу переименовать SomeClass в SomeClass2...
Repace придется. А нафига, если в 2 достаточно изменить только одну строку...


 
vuk ©   (2004-05-21 18:10) [79]

to Mystic ©   (21.05.04 17:59) [77]:
Да я все понял. В моем случае такой код тоже можно получить. Только условие будет обратным и начальный элемент будет задан явно:

with Iterator([nil, Button1, Button2, Button3, Edit1, Panel2]) do
while not Next do
  TControl(Current).Enabled := false;


 
kaif ©   (2004-05-21 18:15) [80]

Видимо я редко допускаю ошибки вообще, поэтому никаких кошмаров не припомню, хотя всегда отдавал предпочтение оператору with.
Мои ограничения:

- не использовать под with сразу множество разных объектов типа
 with a,b,c
 здесь действительно возможны серьезные ошибки.

- стараться не использовать много вложенных with

- не использовать with, если возможны разночтения, но если применение self может спасти от разночтения, предпочитать использовать with и self, чем отказываться от with.

- стараться не использовать with, если имеется два симметричных объекта, одному из которых приходится искусственно отдавать предпочтение для with, например:

 with DataSet1 do
 begin
   First;
   while not Eof do
   begin
     DataSet2.First;
     while not DataSet2.Eof do
       DataSet2.Next;
   end;
   Next;
 end;

Иногда мне не хватает внутри with кроме идентификатора self еще какого-нибудь идентификатора current, чтобы обратиться не к методу объекта, на который намекает with, а к указателю на сам объект, если, скажем, его нужно бывает чему-то присвоить или засунуть в List, а он не self :(. И вот тут-то и возникает, ИМХО, главная бяка с with.

А в целом with очень даже хорош.

А сделать через Ж можно все. Для некоторых и DataAware контролы чем-то не угодили и чуваки все в Edit-ах руками редактируют. Или, например, вместо того, чтобы написать просто:
Query1.SQL.Text := "select * from AAA"
или
Query1.SQL.Text := "select"#13" *"#13"from"#13" AAA"
или на худой конец:
Query1.SQL.Text :=
      "select"#13 +
      "*"#13+
      "from"#13+
      " AAA"

пишут обязательно:

Query1.SQL.Clear;
Query1.SQL.Add("select");
Query1.SQL.Add(" *");
Query1.SQL.Add("from");
Query1.SQL.Add(" AAA");

Тоже религия...
Особенно если и здесь with не использовать очень даже читабельный и прикольнй текстик получается...


 
Gero ©   (2004-05-21 18:18) [81]


> Иногда мне не хватает внутри with кроме идентификатора self
> еще какого-нибудь идентификатора current, чтобы обратиться
> не к методу объекта, на который намекает with, а к указателю
> на сам объект, если, скажем, его нужно бывает чему-то присвоить
> или засунуть в List, а он не self :(. И вот тут-то и возникает,
> ИМХО, главная бяка с with.

Да, это точно...
Не понятно, почему этого не сделали.
Было бы намного удобнее использовать with.


 
nikkie ©   (2004-05-21 18:19) [82]

>Для некоторых и DataAware контролы чем-то не угодили и чуваки все в Edit-ах руками редактируют.
это ты зря сказал. имхо :)


 
jack128 ©   (2004-05-21 18:23) [83]

Тут ярых противников with уже спрашивали про неявный Self, так же хотелось бы спросить как часто они используют конструкцию SameModule.SameFunction(...)  ? ;-)


 
panov ©   (2004-05-21 18:27) [84]

>jack128 ©   (21.05.04 18:23) [83]

Тут ярых противников with уже спрашивали про неявный Self, так же хотелось бы спросить как часто они используют конструкцию SameModule.SameFunction(...)  ? ;-)

Не ярые противники, а "трезвые материалисты"-))

Префикс-модуль нжно использовть только пр инеобходимости, так же, как и with.

А отказаться от with по максимуму может заставить отладка ошибки в результате оного в течение нескольких дней.


 
Mystic ©   (2004-05-21 18:37) [85]

> А отказаться от with по максимуму может заставить отладка
> ошибки в результате оного в течение нескольких дней.


Memory leak я тоже ловил несколько дней. Ошибки, связанные с синхронизацией потоков (только на многопроцессорной машине)... Так что, их тоже не использовать? Ошибки с with вылавливались мной гораздо быстрее ;)


 
Тимохов ©   (2004-05-21 18:41) [86]


> Mystic ©   (21.05.04 18:37) [85]


что кассается меня, то мне такая аналогия не понятна.

потоки - это благо
указатели - благо.
with - для меня не является благом, т.к. я его плохо "вижу". Потому я (например) его и не использую - зачем усложнять себе жизнь.

т.е. не вижу смысла вашей аналогии.


 
TUser   (2004-05-21 18:45) [87]

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


 
panov ©   (2004-05-21 18:55) [88]

После приватной беседы я убедился, что в некоторых случаях испльзование все-таки, оправдано.
Например, когда длина операторов многократно превышает видимую на экране часть строки.

Вижу 2 выхода - 1. использовать широкий монитор 2. Использовать оператор with...

Первый вариант предпочтительней, однако-)


 
Mim1 ©   (2004-05-21 18:55) [89]

Конечно ускоряет, с какого бугра компилятор решит что фунуцию get (для чтения свойства) можно выполнять только раз.


 
kaif ©   (2004-05-21 18:55) [90]

Не понимаю, как можно искать такую ошибку несколько дней. Наверно зарплату хорошую платят...


 
jack128 ©   (2004-05-21 19:12) [91]


>
> Префикс-модуль нжно использовть только пр инеобходимости,
> так же, как и with.
как ловко повернул ;-) А не находишь, что если ты явно не пишешь имя модуля(считай, что пишешь with ModuleName do begin end; на весь код в модуле), то аналогично должен поступать и с with

Вообще мне не понятно, почму вы миритесь с межмодульным конфликтом имен, который несет НЕнаписание имени модуля перед функцией, но не хотите мириться с возможным конфликтом имен, который несет with


 
kaif ©   (2004-05-21 19:26) [92]

Согласен с jack128 ©   (21.05.04 19:12) [91]
Проблема неоднозначностей шире, чем применение with.
Например, дубликаты одноименных функций могут оказаться в модулях программы и библиотеках VCL.
Но никто ведь не пишет
 SysUtils.IntToStr(n)
А согласно этой логике даже программа

 procedure  Form1Button1Click(Sender: TObject);
 begin
   ShowMessage("Hello, World")
 end;


содержит грубейшую ошибку.

Нужно писать:

 procedure  Form1Button1Click(Sender: TObject);
 begin
   Dialogs.ShowMessage("Hello, World")
 end;


 
panov ©   (2004-05-21 19:33) [93]

>jack128 ©   (21.05.04 19:12) [91]
Вообще мне не понятно, почму вы миритесь с межмодульным конфликтом имен,...

Непонятно, что за конфликты?

Пока сталкивался толтько с FindClose, по-моему...


 
panov ©   (2004-05-21 19:35) [94]

>kaif ©   (21.05.04 18:55) [90]

Не понимаю, как можно искать такую ошибку несколько дней. Наверно зарплату хорошую платят...

Можно исать долго... можно очень долго... Из-за with...
Переписав без with, ошибка обнаружится сразу.
Так зачем себе проблемы создавать?

>kaif ©   (21.05.04 19:26) [92]

Утрировать не надо.
Для того, чтобы не было межмодульных конфликтов, остаточно наименования функций и процедур вести как следует.


 
jack128 ©   (2004-05-21 19:36) [95]


> Пока сталкивался толтько с FindClose, по-моему...
именно про них и говорю ;-)


 
panov ©   (2004-05-21 19:37) [96]

>jack128 ©   (21.05.04 19:36) [95]

И сколько таких? Много?

Я думаю, что пяток штук, если наберется столько, пусть даже десяток, я на память запомню.


 
Anatoly Podgoretsky ©   (2004-05-21 19:39) [97]

FindClose это не тот конфликт, еще на стадии компиляции обнаруживается, опасны другие, когда и имена и список параметров одинаковые (разрешается правильным именованием), но так же и отлаживается легко в отличии от with


 
Sergp ©   (2004-05-21 20:29) [98]

А мне нравится with. Как это не парадоксально, но для меня код становится  типа более красивым и читабельным.... :-)))
Пару раз натыкался на ошибки, типа использования имен переменных таких-же как и свойства той фигни что писал в with, но ничего страшного, нашел. Да и я использую with в сравнительно простых конструкциях.


 
LMD ©   (2004-05-21 20:34) [99]


> Ник ламер заняли, но LMD еще свободен, шутники вперед!


Разве ?


 
GuAV ©   (2004-05-21 21:37) [100]


> а мне в with-е не нравится то что всплывающей подсказкой
> нельзя пользоваться

Вообще-то можно - надо нажать Ctrl+Space

что насчет with - с record смысла нет.

Игорь Шевченко ©   (21.05.04 16:08) [55]
DiamondShark ©   (21.05.04 16:14) [56]

Вы имеете в виду что если
with MyFunc(I).MyProp do,
то MyFunc(I).MyProp не считается много раз, то можно использовать локальные переменные. физиченский смысл тот же.
но я все же считаю что with приносит удобство. например:
with TMyObj1.Create do
try
 ...
 with TMyObj1.Create do
 try
 ...
 finally
   free;
 end;
 ...
finally
 free;
end;

без with у меня была путаница кого Free


 
Rouse_ ©   (2004-05-21 21:40) [101]

У меня нормальное отношение, но по поводу и без повода не использую...


 
Sergey Masloff   (2004-05-21 22:02) [102]

>Игорь Шевченко ©   (21.05.04 11:13) [2]
>> Дает ли использование with какую-то пользу для кода, в смысле
>> оптимизации компилятором?
>Дает.
Точно?


 
kaif ©   (2004-05-21 22:11) [103]

panov ©   (21.05.04 19:35) [94]
Для того, чтобы не было межмодульных конфликтов, остаточно наименования функций и процедур вести как следует.


А как следует?
Например, бессознательно объявить у себя где-нибудь функцию IntToStr, перекрывающую одноименную из SysUtils можно?
Или мы исходим из того, что разработчик знает все имена функций? Но тогда почему мы не требуем точно так же, чтобы он знал имена свойств и методов объектов, которые использует? Или просто вероятность совпадения неизвестных разработчику имен свойств и методов у разных объектов выше, чем вероятность совпадения имен функций?
Согласитесь, что если разработчик знает имена всех свойств и методов объектов, которые использует в своей работе и если у него с логикой все в порядке, то он и не допустит ошибок с whith, которые потом придется долго искать.
Значит рекомендация отказаться от with - лучшая панацея именно для ламеров? Так ведь получается. Можно вообще ничего не знать и нигде не ошибешься. Даже ценой того, что писать будешь принципиально плохообозреваемый глазами код. А если хочется переименовать какую-то переменную, то всегда использовать Ctrl+R с заменой в десятках мест.
 Кстати, вопрос к противникам with. А не приходилось ли днями искать ошибку, возникшую именно из-за пренебрежения к with при переименовании переменной (с целью освободить этот идентификатор для другого использования) из-за того, что где- то что-то забыли переименовать (Ctrl+R не с той строки запустили)?
 Мне кажется, что если этот оператор существует в Object Pascal и до сих пор не объявлен obsolete, значит в нем есть какой-то смысл... За бугром народ свое время тоже умеет ценить. Не так?


 
kaif ©   (2004-05-21 22:20) [104]

2 Sergey Masloff   (21.05.04 22:02) [102]
Кстати, в тех случаях, когда я колеблюсь, применить with или не применять, именно соображение оптимизации по скорости использую как решающее. То есть если действие происходит в цикле - предпочтение будет отдано with. Если это какой-то редко исполняемый код - предпочтение будет отдано отказу от использования with.
Я никому не навязываю свой подход.
Просто автор спросил наше мнение.
Вот я и сказал свое мнение. А спорить никакого желания просто нет. Я за золотую середину во всем. И у меня почему-то никогда with не приводил к тем кошмарам при отладке, на которые столько здесь намекают. Может быть было пару раз, да и то, когда я еще только Delphi начинал изучать...


 
Sergey Masloff   (2004-05-21 22:30) [105]

kaif ©   (21.05.04 22:20) [104]
Ну я ведь в том смысле и спросил. With я применяю часто, никаких проблем не испытываю в связи с этим. Я считаю что программа с несколькими тысячами (конечно пока не десятками тысяч) инсталляций может считаться достаточным полигоном для испытаний.


 
Song ©   (2004-05-21 22:36) [106]

With плоха только для отладки.
К примеру написали мы процедуру, запускаем - не работает. Начинаем отлаживать, хотим посмотреть значение проперти. Выделяем мышкой фрагмент, нажимаем Ctrl + F7. Если бы With не было, тогда бы значение сразу появилось. Когда With нет, надо ещё дописать перед проперти объект, к которому оно принадлежит. Когда это нужно делать часто, это доканывает. В таких случаях я копирую название объекта в буфер обмена и каждый раз добавляю. А не было бы With - не было б проблемы.


 
default ©   (2004-05-21 22:37) [107]

Song ©   (21.05.04 22:36) [106]
я про это же писал, неудобно


 
Song ©   (2004-05-21 22:44) [108]

Предлагаю написать маленькую программку, которая обойдёт все pas файлы в вашем проекте и подсчитает количество With и общее количество "слов". :)
Так мы и узнаем кто как его любит.


 
Verg ©   (2004-05-21 22:52) [109]


> [103] kaif ©   (21.05.04 22:11)


Звучит несколько демагогично.


> Значит рекомендация отказаться от with - лучшая панацея
> именно для ламеров? Так ведь получается.


Опять блин, про ламеров.... Типа самомодифицирующися код может еще вспоним, а кто его не применяет тот - ламер, ага...

Зачем рисковать в Case-индеферентном языке "схлеснуть" поля объектов, одни из которых твои, и знаешь ты их на зубок, а другие чужие и у который этих свойств и полей сотни немерянные?
Какой-то латентый ламеризм. Ламерофобия. Любой ценой не показаться ламером в чьих-то пристрастных глазах. Наоборот показать на пустом месте свою удаль молодецкую. Вот опять вместо лестницы спрыгнул с болкона, и опять точнехонько на коня! Пока точнехонько.... Молодца!
Только какой смысл в этом риске? Боимься пальцы в мозоли стереть об клаву?
Насмотрелся я уже на джигитов-with-либителей вдоволь...


 
LMD ©   (2004-05-21 22:53) [110]


> А не было бы With - не было б проблемы.


А не было бы причин для отладки - тоже проблем было бы меньше.
Не так ли ?


 
Song ©   (2004-05-21 23:00) [111]

>> А не было бы причин для отладки - тоже проблем было бы меньше.
Такого не бывает. Человек есть человек.


 
panov ©   (2004-05-21 23:14) [112]

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

Вот код и результаты:


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TTest=class
 function TestProc: String;
 end;

 TTest1=class
   FTest: TTest;
 public
   constructor Create;
   destructor Destroy;override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function TTest.TestProc: String;
begin
 Result := "s";
end;

constructor TTest1.Create;
begin
 FTest := TTest.Create;
end;

destructor TTest1.Destroy;
begin
 FTest.Free;
end;

function TickCount:Int64;
begin
 QueryPerformanceCounter(Result);
end;

function DeltaTickToSeconds(const Delta: Int64):Double;
var
 TickFreq: Int64;
begin
 QueryPerformanceFrequency(TickFreq);
 Result := Delta/TickFreq;
end;

function Test1(counter: Integer): String;
var
 tt: TTest1;
 i: Integer;
 s1,s2,s3: String;
begin
 tt := TTest1.Create;
 for i := 0 to Counter do
 begin
   s1 := tt.FTest.TestProc;
   s2 := tt.FTest.TestProc;
   s3 := tt.FTest.TestProc;
 end;
 tt.Free;
 Result := s1+s2+s3;
end;

function Test2(counter: Integer): String;
var
 tt: TTest1;
 i: Integer;
 s1,s2,s3: String;
begin
 tt := TTest1.Create;
 for i := 0 to Counter do
 with tt.FTest do
 begin
   s1 := TestProc;
   s2 := TestProc;
   s3 := TestProc;
 end;
 tt.Free;
 Result := s1+s2+s3;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 s1,s2: String;
 i: Integer;
 t1,t2: Int64;
 Delta,DeltaSumm: Double;
 nCount: Integer;
begin
 nCount := 1000000;
 Memo1.Lines.Clear;
 Memo1.Lines.Add("{$O-}");
 DeltaSumm := 0;
{$O-}
 for i := 1 to 10 do
 begin
   t1 := TickCount;

   s1 := Test1(nCount);
   t1 := TickCount-t1;
   Delta := DeltaTickToSeconds(t1);

   t2 := TickCount;
   s2 := Test2(nCount);
   t2 := TickCount-t2;
   Delta := DeltaTickToSeconds(t2)- Delta;

   DeltaSumm := DeltaSumm + Delta;

   Memo1.Lines.Add("Test2-Test1("+s1+s2+"):"+FloatToStr(Delta));
 end;
 Memo1.Lines.Add("Test2-Test1(Среднее):"+FloatToStr(DeltaSumm/10));
 Memo1.Lines.Add("---");

 DeltaSumm := 0;

 for i := 1 to 10 do
 begin
   t2 := TickCount;
   s2 := Test2(nCount);
   t2 := TickCount-t2;
   Delta := DeltaTickToSeconds(t2);

   t1 := TickCount;
   s1 := Test1(nCount);
   t1 := TickCount-t1;
   Delta := DeltaTickToSeconds(t1)- Delta;

   DeltaSumm := DeltaSumm + Delta;

   Memo1.Lines.Add("Test1-Test2("+s1+s2+"):"+FloatToStr(Delta));
 end;
 Memo1.Lines.Add("Test1-Test2(Среднее):"+FloatToStr(DeltaSumm/10));

 Memo1.Lines.Add("{$O+}");

{$O+}

 for i := 1 to 10 do
 begin
   t1 := TickCount;

   s1 := Test1(nCount);
   t1 := TickCount-t1;
   Delta := DeltaTickToSeconds(t1);

   t2 := TickCount;
   s2 := Test2(nCount);
   t2 := TickCount-t2;
   Delta := DeltaTickToSeconds(t2)- Delta;

   DeltaSumm := DeltaSumm + Delta;

   Memo1.Lines.Add("Test2-Test1("+s1+s2+"):"+FloatToStr(Delta));
 end;
 Memo1.Lines.Add("Test2-Test1(Среднее):"+FloatToStr(DeltaSumm/10));
 Memo1.Lines.Add("---");

 DeltaSumm := 0;

 for i := 1 to 10 do
 begin
   t2 := TickCount;
   s2 := Test2(nCount);
   t2 := TickCount-t2;
   Delta := DeltaTickToSeconds(t2);

   t1 := TickCount;
   s1 := Test1(nCount);
   t1 := TickCount-t1;
   Delta := DeltaTickToSeconds(t1)- Delta;

   DeltaSumm := DeltaSumm + Delta;

   Memo1.Lines.Add("Test1-Test2("+s1+s2+"):"+FloatToStr(Delta));
 end;
 Memo1.Lines.Add("Test1-Test2(Среднее):"+FloatToStr(DeltaSumm/10));

end;

end.


Результаты:

Test2-Test1(ssssss):0,0270190764468667
Test2-Test1(ssssss):0,0360559791817117
Test2-Test1(ssssss):0,0379699095834807
Test2-Test1(ssssss):0,0392728684790944
Test2-Test1(ssssss):-0,0434879293318007
Test2-Test1(ssssss):0,0017681018118223
Test2-Test1(ssssss):0,0147479637775192
Test2-Test1(ssssss):-0,0174681419007165
Test2-Test1(ssssss):0,0660796274386828
Test2-Test1(ssssss):0,0227755203524471
Test2-Test1(Среднее):0,0184732975839108
---
Test1-Test2(ssssss):-0,0232417807291152
Test1-Test2(ssssss):-0,0402442209833931
Test1-Test2(ssssss):-0,0139598747885556
Test1-Test2(ssssss):-0,018530846797568
Test1-Test2(ssssss):-0,0154134114810682
Test1-Test2(ssssss):-0,0241606125918237
Test1-Test2(ssssss):-0,0129393540240448
Test1-Test2(ssssss):-0,0249062380833318
Test1-Test2(ssssss):-0,0133768397938845
Test1-Test2(ssssss):-0,018556827753248
Test1-Test2(Среднее):-0,0205330007026033
{$O+}
Test2-Test1(ssssss):-0,057512616826999
Test2-Test1(ssssss):0,00460756883905633
Test2-Test1(ssssss):0,0262033303115339
Test2-Test1(ssssss):0,011977220568536
Test2-Test1(ssssss):0,0644945097770806
Test2-Test1(ssssss):0,0564448833580804
Test2-Test1(ssssss):-0,0440813008357208
Test2-Test1(ssssss):0,0123781095083313
Test2-Test1(ssssss):0,12273096161663
Test2-Test1(ssssss):-0,0665129227317998
Test2-Test1(Среднее):-0,00746002634413039
---
Test1-Test2(ssssss):-0,0356740870697252
Test1-Test2(ssssss):0,0492984443553579
Test1-Test2(ssssss):-0,10286027972829
Test1-Test2(ssssss):0,00570156262876975
Test1-Test2(ssssss):-0,0595209726375838
Test1-Test2(ssssss):-0,0379903032368638
Test1-Test2(ssssss):-0,0156673543704575
Test1-Test2(ssssss):0,0225009044445594
Test1-Test2(ssssss):-0,0221371710650375
Test1-Test2(ssssss):0,0181746562761469
Test1-Test2(Среднее):-0,0178174600403123

Может кто-нибудь прокомментировать?


 
LMD ©   (2004-05-21 23:25) [113]


> Может кто-нибудь прокомментировать?


А что нужно комментировать ?

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


 
GuAV ©   (2004-05-21 23:37) [114]

panov ©   (21.05.04 23:14) [112]

1. FTest - поле а не свойство.
2. Объект создан как лок. перменная
поэтому от with толку как с record"ом - никакого
приведите, пожалуйста результаты теста с Form1.Memo1.Lines св-во Count


 
kaif ©   (2004-05-22 01:19) [115]

2 Verg ©   (21.05.04 22:52) [109]
 Я как только написал, сразу пожалел, что вообще упомянул про ламеров. Прошу извинить. Это на самом деле смахивает на демагогию. Но видит бог, я это слово практически никогда не употребляю... У меня нет страха показаться ламером, потому что я вообще слишком устал от этого самого программирования, чтобы еще хотеть кому-то кем-то в программировании показаться...
 
 Возможно, мы все ломимся в открытые ворота. И просто от характера кода многое зависит. Иначе бы здесь столько копья не ломали...
 Ну нет у меня таких проблем с отладкой, о которых здесь говорят!!! Это что-нибудь означает или нет? Ну включите логику, наконец. Если не у всех программистов, использующих with, возникают кошмары с отладкой программ, значит, по крайней мере, утверждения о том, что они всегда должны возникать, ложны. Значит здесь больше одной причины.

 Возможно, проблемы с отладкой возникают в случаях:

1. Например, если юзаются какие-то компоненты сторонних производителей с последующими апгрейтами, добавляющими новые свойства с новыми именами, могущие вызвать неоднозначности при новой сборке.
2. Если пишутся системы, в которых куски одного модуля пишут одновременно десятки программистов и сложная система используемых классов и их свойств эволюционирует параллельно с их работой.
3. Если взято за правило вместо with всегда юзать промежуточные локальные переменные, что-то вроде:

var
lItms : TStrings;
...
begin
...
lItms := Form1.Memo1.Lines;
for i := lItms.Count - 1 downto 0 do
begin
  TMyClass(lItms.Objects[i]).Free;
  lItms.Delete(i);
end;      


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

P.S. А насчет джигитов я что-то не понял. Вообще-то это тоже на демагогию смахивает. :(


 
LMD ©   (2004-05-22 01:32) [116]

Verg ©   (21.05.04 22:52)


> Только какой смысл в этом риске? Боимься пальцы в мозоли
> стереть об клаву?


Дело не в мозолях, а в том, что в ряде случаев отказ от with приведет к раздуванию кода за счет введения дополнительных переменных, например, или просто усложнения имен, что довольно часто приводит если не к ошибкам, то к затруднению ясного понимания кода, ведь не секрет, что чем меньше строк в качественном коде, тем легче его понять.


> Насмотрелся я уже на джигитов-with-либителей вдоволь...


А извратить все можно, операторы языка программирования не являются единственно пригодным для этого способом.


 
Johnmen ©   (2004-05-22 01:40) [117]

>Mystic ©  (21.05.04 17:54) [74]
>все это обычно заменяется:
>with PaintBox, PaintBox.Canvas do
>...

Что, естественно, эквивалентно
with PaintBox, Canvas do


 
Knight ©   (2004-05-22 01:48) [118]

Открываю with как только начинается серия обращений (4-5) к ОДНОМУ объекту и закрываю, как только появляется угроза разночтений... что сохраняет читабельность, да и проблем пока не наблюдал.


 
LMD ©   (2004-05-22 01:57) [119]

Противники использования with могут выполнить следующее упражнение: взять те методы TControl, где используется with, переписать их без использования этой конструкции и выложить результат сюда.


 
Petr V. Abramov ©   (2004-05-22 02:39) [120]

Без with приходится часто использовать copy/past. А copy/past - прогрессивная методика китайского программиста!
:)


 
Petr V. Abramov ©   (2004-05-22 02:40) [121]

А без прогрессивной методики 1 млн. строк кода не напишешь
:)



Страницы: 1 2 3 4 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.83 MB
Время: 0.033 c
14-1085133993
Q
2004-05-21 14:06
2004.06.06
Windows для профессионалов Дж.Рихтер


14-1084964113
blackweber
2004-05-19 14:55
2004.06.06
ВЕСНА. СКОРО ЛЕТО, ОТДЫХ, ПРИРОДА.....


14-1085062009
Копир
2004-05-20 18:06
2004.06.06
Израиль мало-помалу забывает свою историю.


14-1085133857
Sanek_metaller
2004-05-21 14:04
2004.06.06
Opera


3-1084791114
IBNovice
2004-05-17 14:51
2004.06.06
InterBase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский