Форум: "Прочее";
Текущий архив: 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