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

Вниз

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

 
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 - прогрессивная методика китайского программиста!
:)



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

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

Наверх





Память: 0.73 MB
Время: 0.042 c
9-1076232713
Bortel
2004-02-08 12:31
2004.06.06
ИИ


1-1085404238
Valeri
2004-05-24 17:10
2004.06.06
Align ы, Splitter ы


1-1085399943
С Виктор Н
2004-05-24 15:59
2004.06.06
Программа написанная на Delphi не завершается


14-1084876296
Карелин Артем
2004-05-18 14:31
2004.06.06
А есть ли аналог КЛАДРА на Украине.


14-1084737671
>|<yk
2004-05-17 00:01
2004.06.06
Где можно скачать нормальные компоненты многомерного анализа?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский