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

Вниз

Отношение к использованию 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.034 c
14-1084713446
Gero
2004-05-16 17:17
2004.06.06
Вкладка "Безопасность" в XP.


8-1080544421
WAlgo
2004-03-29 11:13
2004.06.06
Выбор конкретной области изображения


4-1083538982
Equillibrium
2004-05-03 03:03
2004.06.06
Как динамически создавать TrackBar (ползунок)


3-1084869152
It
2004-05-18 12:32
2004.06.06
Редактирование наборов данных в БД через Internet Explorer


6-1081974657
Morph
2004-04-15 00:30
2004.06.06
ClientSocket в цикл ?





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