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

Вниз

оператор with   Найти похожие ветки 

 
cross   (2011-07-01 16:27) [0]

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


 
stas ©   (2011-07-01 16:30) [1]

я не использую, но не вижу в его использовании ничего плохого.


 
Dennis I. Komarov ©   (2011-07-01 16:31) [2]

вполне нормально, а что не так?


 
Kerk ©   (2011-07-01 16:38) [3]

В ситуациях типа:

with TForm.Create do
try
 ...
finally
 Free;
end;


отношусь хорошо.
В остальных - плохо. Читаемость убивает нахрен.


 
asail ©   (2011-07-01 16:44) [4]


> Kerk ©   (01.07.11 16:38) [3]

+1


 
antonn ©   (2011-07-01 16:45) [5]


> В ситуациях типа:

а я наоборот не люблю когда Create в блоке :)


 
alexdn ©   (2011-07-01 16:56) [6]

> antonn ©   (01.07.11 16:45) [5]
>
> > В ситуациях типа:
>
> а я наоборот не люблю когда Create в блоке :)
а что ж тогда остается..? show, visible..?


 
Anatoly Podgoretsky ©   (2011-07-01 16:56) [7]

> cross  (01.07.2011 16:27:00)  [0]

И что, прочитаного не хватает.


 
antonn ©   (2011-07-01 17:07) [8]


> а что ж тогда остается..?

я переменную завожу


 
clickmaker ©   (2011-07-01 17:08) [9]

> как вы относитесь к оператору with?

к любому оператору можно относиться, как к молотку, например. Кто-то забьет аккуратно гвоздь и повесит картину. А кто-то палец себе отобъет.


 
SQLEXPRESS   (2011-07-01 17:09) [10]

вот, например, кто на вскидку угадает?

 TA = class
   public
     AVal : Integer;
     BVal : Integer;
 end;

 TB = class
   public
     AVal : Integer;
     BVal : Integer;
 end;

procedure TForm1.btn1Click(Sender: TObject);
var
 A:TA;
 B:TB;
begin
 A := TA.Create;
 B := TB.Create;

 A.AVal := 11;
 A.BVal := 22;
 B.AVal := 111;
 B.BVal := 222;

 with A do
 with B do
   AVal := BVal;

end;


 
Dennis I. Komarov ©   (2011-07-01 17:10) [11]

Если дальше ссылаться не надо, то нафига переменныя?

напримет:

with TRegistry.Create do try
//читаем/пишем
finally
 Free;
end;


 
Dennis I. Komarov ©   (2011-07-01 17:12) [12]


> with A do
>  with B do

with A, B do...

а чего тут угадывать?


 
SQLEXPRESS   (2011-07-01 17:20) [13]


> а чего тут угадывать?


ну.. какие значения будут у всех 4х полей?


 
Игорь Шевченко ©   (2011-07-01 17:59) [14]


> как вы относитесь к оператору with? стоит ли его использовать?
>  


Как вы относитесь к оператору for ? Стоит ли его использовать ? Не лучше ли использовать while ?

Как вы относитесь к оператору case ? Стоит ли его использовать ? Не лучше ли использовать if ?


 
TUser ©   (2011-07-01 20:08) [15]

Я использую, и часто, потому что это сокращает код, следовательно  делает его читабельнее.

> прочитал много критики

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


 
TUser ©   (2011-07-01 20:14) [16]


> Читаемость убивает нахрен.

procedure AllAtoms (Protein: TProtein; Func: TAllAtomsFunc);
var m, c, r, a: integer;
begin
 with Protein do
   for m:=0 to ModCount-1 do
   with Models[m] do begin
     for c:=0 to ChCount-1 do
     with Chains[c] do
       for r:=0 to ResCount-1 do
       with Residues[r] do
         for a:=0 to AtCount-1 do begin
           if not Func(Atoms[a]) then
             exit;
{$ifdef SHOWPDBPROGRESS}
           waAddProgress;
{$endif}
           end;

     with HeteroAtoms do
       for a:=0 to AtCount-1 do begin
         if not Func(Atoms[a]) then
           exit;
{$ifdef SHOWPDBPROGRESS}
         waAddProgress;
{$endif}
         end;
     end;
end;


А теперь, тоже самое без with

if not Func(Protein.Models[m].Chains[c].Residues[r].Atoms[a]) then
 exit;

либо

базовый класс, от которого наследники - все классы в иерархии (Protein, Model, etc), имеет метод типа

function TAAA.Enum (Func: ...): boolean;
begin
 result := false;
 if i am TAtom then
   if not Func (Self) then exit;

 for i := 0 to ChildCount - 1 do
   if not Children[i].Enum (func) then
     exit;
end;

Что быстрее? Что читабельнее?


 
TUser ©   (2011-07-01 20:16) [17]

Разве что последнее оопэшнее, но не стоит использовать ооп вместо мозгов, имхо.


 
DiamondShark ©   (2011-07-01 20:17) [18]

Когда я писал на дельфи, считал этот оператор условно полезным.
Когда стал писать на C#, забыл, что такой оператор зачем-то нужен.

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


 
_Юрий   (2011-07-01 20:29) [19]

Отладчик отказывается показывать значения свойств и полей этой неявной переменной.
Поэтому использую только в простейших случаях, когда отладка заведомо не требуется, типа [3].
В одном проекте видел with с семью членами - за такое надо уже отрывать руки и вставлять в задницу.


 
Kerk ©   (2011-07-01 20:31) [20]


> А теперь, тоже самое без with
>
> if not Func(Protein.Models[m].Chains[c].Residues[r].Atoms[a])
> then
>  exit;

Ну и нормально. Намного лучше читается, чем вариант с with.


 
TUser ©   (2011-07-01 20:32) [21]


> Отладчик отказывается показывать значения свойств и полей
> этой неявной переменной.

Это глюк отладчика, который есть далеко не всегда.


 
TUser ©   (2011-07-01 20:34) [22]


> Ну и нормально. Намного лучше читается, чем вариант с with.

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


 
Kerk ©   (2011-07-01 20:35) [23]


> TUser ©   (01.07.11 20:08) [15]
>
> > прочитал много критики
>
> Критика обычно основана на том, что из кода не понятно,
> свойство или метод чего имеются ввиду. Это затрудняет отладку.
>  У меня такая путаница бывает очень редко, это одна из экзотических
> ошибок.

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


 
картман ©   (2011-07-01 20:35) [24]


> Это глюк отладчика, который есть далеко не всегда.

угу, не всегда, только когда ну очень нада!


 
TUser ©   (2011-07-01 20:41) [25]


> я же понятия не имею чего там у тебя за структуры и классы

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

Я как будет время проведу такой эксперимент. Покажу этот код людям, которые в паскале не знают ничего, а в программировании и в предметной области разбираются вполне. Замерю время, за которое они сообразят, что тут делается.


 
DiamondShark ©   (2011-07-01 20:46) [26]


> А теперь, тоже самое без with


А теперь то же самое без Паскаля:


void AllAtoms(Protein protein, AllAtomFunc func)
{
 foreach (var model in protein.Models)
 {
   foreach (var chain in model.Chains)
     foreach (var residue in chain.Residues)
       foreach (var atom in residue.Atoms)
       {
         if (!func(atom)) return;
#if SHOWPDBPROGRESS
         waAddProgress();
#enfif
       }
   foreach (var atom in model.HeteroAtoms)
   {
     if (!func(atom)) return;
#if SHOWPDBPROGRESS
     waAddProgress();
#enfif
   }
 }
}


Не в with дело, ой, не в with.


 
©   (2011-07-02 07:12) [27]

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


> TUser ©   (01.07.11 20:14) [16]

застрелить писателя, если сам не осознал и не застрелился


 
_Юрий   (2011-07-02 11:54) [28]


> Это глюк отладчика, который есть далеко не всегда.


У меня - всегда.
Глюк отладчика - это точно такая же данность, как и синтаксические правила языка, и эта данность должна быть учтена при выборе решения.
Точно также, как и глюки компилятора - если какая то новая фича теоретически должна сделать нам "удобно и быстро", а на практике приходится тратить больше времени на борьбу с internal error, то фича идет лесом.
В теории теория не отделима от практики, но на практике это не так.

По поводу [16] - вариант с with - ужасен.


 
_Юрий   (2011-07-02 12:18) [29]


> DiamondShark ©   (01.07.11 20:46) [26]

А теперь тоже самое с паскалем:

procedure AllAtoms (Protein: TProtein; Func: TAllAtomsFunc);
var
 model:   TModel;
 chain: TChain;
 residue: TResidue;
 atom: TAtom;
begin
 for model in ProteinModels do
   for chain in model.Chains do
    for residue in chain.Residues do
      for atom in residue.Atoms do
         begin
...
   
Чем то принципиально отличается?


 
Kerk ©   (2011-07-02 12:31) [30]


> _Юрий   (02.07.11 12:18) [29]

Это не паскаль, это delphi :)
Но в остальном ты прав.


 
Думкин (с отпуска)   (2011-07-02 17:05) [31]

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


 
eXAAAXe   (2011-07-02 19:56) [32]

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


 
©   (2011-07-02 20:01) [33]


> И создавая объект, без экземпляра класса.

чо? о_О


 
uw ©   (2011-07-02 21:02) [34]


 with XMLDoc.DocumentElement do
 begin
   with AddChild("countries") do
   begin
     with AddChild("country") do
     begin
         Attributes["countryCode"] := "HN";
         Attributes["nameRu"] := Гондурас";
         Attributes["nameEn"] := Honduras";
         AddChild("notes").NodeValue := "Прекрасное место для отдыха";
     end;
     with AddChild("country") do
     begin
       ...
     end;
     ...
   end;
 ...
 end;


 
uw ©   (2011-07-02 21:13) [35]


 with TXMLDocument.Create(TComponent.Create(nil)) do
   try
   ...
   finally
     Owner.Free;
   end;


 
картман ©   (2011-07-02 21:32) [36]


> И создавая объект, без экземпляра класса.

до чего ж, однако, технологии дошли


> uw ©   (02.07.11 21:02) [34]

а это что - демонстрация оных?


 
eXAAAXe   (2011-07-02 21:44) [37]


> картман ©   (02.07.11 21:32) [36]
>
>
> > И создавая объект, без экземпляра класса.
>
> до чего ж, однако, технологии дошли


Имелось ввиду такое:
Экземпляр создается, но в вар не прописывается.


with TRegistry.Create do try
//читаем/пишем
finally
Free;
end;


 
картман ©   (2011-07-02 22:53) [38]


> eXAAAXe   (02.07.11 21:44) [37]

так это:

> Имелось ввиду такое:
> Экземпляр создается, но в вар не прописывается.


или то:

> И создавая объект, без экземпляра класса.

?


 
eXAAAXe   (2011-07-02 23:03) [39]


> картман ©   (02.07.11 22:53) [38]


> И создавая объект, без экземпляра класса + "прописанного в вар".

Надо дописать.


 
jack128_   (2011-07-02 23:04) [40]


> Чем то принципиально отличается?

да. Сложностью реализации iterator паттерна на дельфи. Пока в дельфи не появится yield - не взлетит.



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

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

Наверх





Память: 0.55 MB
Время: 0.005 c
15-1309523246
cross
2011-07-01 16:27
2011.10.30
оператор with


2-1309782724
DSIoffe
2011-07-04 16:32
2011.10.30
Не могу нормально принять данные по UDP


15-1309633372
eXAAAXe
2011-07-02 23:02
2011.10.30
Инвайт для ВКонтакта


1-1269848008
Pavel
2010-03-29 11:33
2011.10.30
Динамическое создание формы при HTTP-запросе


2-1310126824
MsGuns
2011-07-08 16:07
2011.10.30
TEdit с правым выравниванием





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