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

Вниз

оператор 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.009 c
2-1310347116
R_R
2011-07-11 05:18
2011.10.30
Компонент TUdp; событие OnDataReceived


15-1309840625
dxc
2011-07-05 08:37
2011.10.30
биллиардный шар


15-1309440076
SQLEXPRESS
2011-06-30 17:21
2011.10.30
Сортировка


2-1310131029
set666
2011-07-08 17:17
2011.10.30
Данные в графическом виде.


15-1302502607
OW
2011-04-11 10:16
2011.10.30
Смотрел вчера Властелин колец, режиссерскую версию