Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

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

 
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 не использовать очень даже читабельный и прикольнй текстик получается...



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

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.054 c
14-1085132133
VictorT
2004-05-21 13:35
2004.06.06
Часто в коде страниц встречаю в конце тегов бакслеш...


6-1082459141
SergeySS
2004-04-20 15:05
2004.06.06
помогите с WebBrowser


1-1085128914
-SeM-
2004-05-21 12:41
2004.06.06
EXE как DLL


1-1085179106
DelPHist
2004-05-22 02:38
2004.06.06
Компиляция математических выражений


14-1084962975
ISP
2004-05-19 14:36
2004.06.06
Покупка Delphi. Что брать?