Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 35 36 37 38 39 40 41 [42] 43 44   вперед  Ctrl
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58454
Блог
makhaon
у себя в коде насчитал около 1000 вхождений with, за всё время ну наверно 3 или 4 проблем, которые почти сразу вылезли и поправлены.

Основная неприятность with связана с тем, что при смене версий дельфы возможна ситуация, когда в стандартный класс добавляется свойство, имя которого совпадает с локальной переменной, ранее использованной внутри with. С точки зрения дизайна языка, пожалуй, было бы лучше, если бы обращение шло, например, через точку:

with Form1 do
  .Caption := 'Abcde';


Но это, в общем, мелочи. А что до вышеописанного случая... а кто будет тесты писать, Пушкин?
3 июн 19, 00:11    [21900026]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
DmSer,

Вообще говоря это ваша хотелка выделять поля или аргументы первой буквой :)
Так тоже не комильфо: YouParam, YouParamField, YouParamArg
Но, напр., методы никто не заставдяет обзывать М... Разве что геттеры/сеттеры уже в крови
3 июн 19, 00:15    [21900030]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
makhaon
у себя в коде насчитал около 1000 вхождений with...

Завтра протрезвеешь, заглянешь сюда, и станет стыдно.
3 июн 19, 00:24    [21900033]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
В С++ вместо with иногда используют ссылки.
Вместо

Obj.InnerObj.NestedObj.Name = "Vodka";
Obj.InnerObj.NestedObj.Size = 0.5;
Obj.InnerObj.NestedObj.Price = 3.62;

- пишут:
CNestedObjType & no = Obj.InnerObj.NestedObj;
no.Name = "Vodka";
no.Size = 0.5;
no.Price = 3.62;

Т.е., no - альтернативное имя свойству Obj.InnerObj.NestedObj.

Тут, в дельфях, тоже можно так.
Почти. ;)
3 июн 19, 00:38    [21900041]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
rgreat
Member

Откуда:
Сообщений: 5211
ёёёёё,

В дельфях нынче даже лучше можно:
var no := Obj.InnerObj.NestedObj;
no.Name := 'Vodka';
no.Size := 0.5;
no.Price := 3.62;
3 июн 19, 03:33    [21900055]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
rgreat,

не лучше. Если NestedObj - рекорд, будет фигня.
3 июн 19, 08:05    [21900077]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
rgreat,

а в с++ "лудше" можно так:
auto & no = Obj.InnerObj.NestedObj;
no.Name = "Vodka";
no.Size = 0.5;
no.Price = 3.62;
3 июн 19, 08:09    [21900079]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11154
ёёёёё
не лучше. Если NestedObj - рекорд, будет фигня.

var no := @Obj.InnerObj.NestedObj;
no^.Name := 'Vodka';
no^.Size := 0.5;
no^.Price := 3.62;
и пофиг объект или рекорд
3 июн 19, 14:08    [21900504]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
_Vasilisk_,

да.

...почти. :)
3 июн 19, 15:14    [21900595]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9744
Даже:
no.Name := 'Vodka';
no.Size := 0.5;
no.Price := 3.62;

ёёёёё
...почти. :)

Фактическая разница только в размещении закорючек.
3 июн 19, 15:28    [21900610]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11154
Dmitry Arefiev
Фактическая разница только в размещении закорючек.
Когда-то забыл указать ^ при записи в Stream. Теперь пишу всегда. Да и в коде видно, что работаем с указателем
3 июн 19, 15:35    [21900613]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
Dmitry Arefiev
Даже:
no.Name := 'Vodka';
no.Size := 0.5;
no.Price := 3.62;

ёёёёё
...почти. :)

Фактическая разница только в размещении закорючек.

Ну, "там"-то закорючки не нужны. И ссылка в с++ - это наверное все же не указатель, а алиас.
... а 21900504 - уж и не знаю, пусть лучше with останется...
3 июн 19, 16:21    [21900683]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
rgreat
Member

Откуда:
Сообщений: 5211
ёёёёё,

With - опасен.
3 июн 19, 16:35    [21900696]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9744
ёёёёё
И ссылка в с++ - это наверное все же не указатель, а алиас.

Да ну ... ?
3 июн 19, 16:55    [21900717]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
bk0010
Member

Откуда:
Сообщений: 4827
rgreat
With - опасен.
Теоритически да, практически - не помню ни одной проблемы из-за with.
4 июн 19, 00:00    [21901024]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3326
softwarer,

я у себя решаю проблемы с with довольно просто: крайне желательно, что бы все переменные в блоке with не имели общеупотребительного названия (Caption, Text, Left, Right), а так же имели максимально уникальные имена. Примеры: OvlCaption, OvlText, ShowRefOvl, и т п.

думаю, что это небольшая плата за красоту кода:

 with Guid do
  Result := Format('%s.%u.%u.%u.%u.%u.%u.%u%u%u%u%u', [LIB_REGISTERED_UIDHEAD, D1, D2, D3,
   D4[0], D4[1], D4[2], D4[3], D4[4], D4[5], D4[6], D4[7]]);


вместо

 Result := Format('%s.%u.%u.%u.%u.%u.%u.%u%u%u%u%u', [LIB_REGISTERED_UIDHEAD, Guid.D1, Guid.D2,
  Guid.D3, Guid.D4[0], Guid.D4[1], Guid.D4[2], Guid.D4[3], Guid.D4[4], Guid.D4[5], Guid.D4[6], Guid.D4[7]]);


 with Result, SequenceItems[Index] do
 begin
  RegionSpatialFormat := TRegionSpatialFormat(GetElement($0018, $6012).AsInteger);
  RegionDataType := TRegionDataType(GetElement($0018, $6014).AsInteger);
  RegionFlags := GetElement($0018, $6016).AsInteger;
  RegionLocationMinX0 := GetElement($0018, $6018).AsInteger;
  RegionLocationMinY0 := GetElement($0018, $601A).AsInteger;
  RegionLocationMaxX1 := GetElement($0018, $601C).AsInteger;
  RegionLocationMaxY1 := GetElement($0018, $601E).AsInteger;
  PhysicalUnitsXDirection := TPhysicalUnitsDirection(GetElement($0018, $6024).AsInteger);
  PhysicalUnitsYDirection := TPhysicalUnitsDirection(GetElement($0018, $6026).AsInteger);
  PhysicalDeltaX := Abs(GetElement($0018, $602C).AsDouble);
  PhysicalDeltaY := Abs(GetElement($0018, $602E).AsDouble);
 end;

вместо
 Result.RegionSpatialFormat := TRegionSpatialFormat(SequenceItems[Index].GetElement($0018, $6012).AsInteger);
 Result.RegionDataType := TRegionDataType(SequenceItems[Index].GetElement($0018, $6014).AsInteger);
 Result.RegionFlags := SequenceItems[Index].GetElement($0018, $6016).AsInteger;
 Result.RegionLocationMinX0 := SequenceItems[Index].GetElement($0018, $6018).AsInteger;
 Result.RegionLocationMinY0 := SequenceItems[Index].GetElement($0018, $601A).AsInteger;
 Result.RegionLocationMaxX1 := SequenceItems[Index].GetElement($0018, $601C).AsInteger;
 Result.RegionLocationMaxY1 := SequenceItems[Index].GetElement($0018, $601E).AsInteger;
 Result.PhysicalUnitsXDirection := TPhysicalUnitsDirection(SequenceItems[Index].GetElement($0018, $6024).AsInteger);
 Result.PhysicalUnitsYDirection := TPhysicalUnitsDirection(SequenceItems[Index].GetElement($0018, $6026).AsInteger);
 Result.PhysicalDeltaX := Abs(SequenceItems[Index].GetElement($0018, $602C).AsDouble);
 Result.PhysicalDeltaY := Abs(SequenceItems[Index].GetElement($0018, $602E).AsDouble);
4 июн 19, 00:33    [21901037]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
rgreat
Member

Откуда:
Сообщений: 5211
А по мне красивей так:

Result := Format('%s.%u.%u.%u.%u.%u.%u.%u%u%u%u%u',
                 [LIB_REGISTERED_UIDHEAD,
                  Guid.D1,
                  Guid.D2,
                  Guid.D3,
                  Guid.D4[0],
                  Guid.D4[1],
                  Guid.D4[2],
                  Guid.D4[3],
                  Guid.D4[4],
                  Guid.D4[5],
                  Guid.D4[6],
                  Guid.D4[7]]);

И в отладке удобней ибо с With она не работает.
Ну и надежней, понятное дело.
4 июн 19, 01:15    [21901049]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Gator
Member

Откуда: Москва
Сообщений: 14910
makhaon
я у себя решаю проблемы с with довольно просто: крайне желательно, что бы все переменные в блоке with не имели общеупотребительного названия (Caption, Text, Left, Right), а так же имели максимально уникальные имена. Примеры: OvlCaption, OvlText, ShowRefOvl, и т п.

думаю, что это небольшая плата за красоту кода:
IMHO муторно это
4 июн 19, 01:15    [21901050]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
rgreat
Member

Откуда:
Сообщений: 5211
Ну и :
var Item := SequenceItems[Index];
Result.RegionSpatialFormat := TRegionSpatialFormat(Item.GetElement($0018, $6012).AsInteger);
Result.RegionDataType := TRegionDataType(Item.GetElement($0018, $6014).AsInteger);
Result.RegionFlags := Item.GetElement($0018, $6016).AsInteger;
Result.RegionLocationMinX0 := Item.GetElement($0018, $6018).AsInteger;
Result.RegionLocationMinY0 := Item.GetElement($0018, $601A).AsInteger;
Result.RegionLocationMaxX1 := Item.GetElement($0018, $601C).AsInteger;
Result.RegionLocationMaxY1 := Item.GetElement($0018, $601E).AsInteger;
Result.PhysicalUnitsXDirection := TPhysicalUnitsDirection(Item.GetElement($0018, $6024).AsInteger);
Result.PhysicalUnitsYDirection := TPhysicalUnitsDirection(Item.GetElement($0018, $6026).AsInteger);
Result.PhysicalDeltaX := Abs(Item.GetElement($0018, $602C).AsDouble);
Result.PhysicalDeltaY := Abs(Item.GetElement($0018, $602E).AsDouble);
4 июн 19, 01:16    [21901051]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ain-2
Member

Откуда:
Сообщений: 663
А у меня привычка писать вот так (я про выравнивание):

var Item := SequenceItems[Index];
Result.RegionSpatialFormat     := TRegionSpatialFormat(Item.GetElement($0018, $6012).AsInteger);
Result.RegionDataType          := TRegionDataType(Item.GetElement($0018, $6014).AsInteger);
Result.RegionFlags             := Item.GetElement($0018, $6016).AsInteger;
Result.RegionLocationMinX0     := Item.GetElement($0018, $6018).AsInteger;
Result.RegionLocationMinY0     := Item.GetElement($0018, $601A).AsInteger;
Result.RegionLocationMaxX1     := Item.GetElement($0018, $601C).AsInteger;
Result.RegionLocationMaxY1     := Item.GetElement($0018, $601E).AsInteger;
Result.PhysicalUnitsXDirection := TPhysicalUnitsDirection(Item.GetElement($0018, $6024).AsInteger);
Result.PhysicalUnitsYDirection := TPhysicalUnitsDirection(Item.GetElement($0018, $6026).AsInteger);
Result.PhysicalDeltaX          := Abs(Item.GetElement($0018, $602C).AsDouble);
Result.PhysicalDeltaY          := Abs(Item.GetElement($0018, $602E).AsDouble);
4 июн 19, 05:55    [21901075]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1462
Единственное место где я использую with - это при создании формы без присвоения в переменную:

function DNC(var id: integer; var FullName: string): boolean;
begin
  with TFrmDNC.Create(Application) do begin
    Fid   := id;
    F5;
    CDV.PositionID(Fid);
    {}
    Result := mrOk = ShowModal;
    {}
    if Result then begin
      id       := Fid;
      FullName := Ffull_name;
    end;{if}
    Free;
  end;{with}
end;
4 июн 19, 06:43    [21901085]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58454
Блог
fraks,

честно говоря, уж чем-чем, а этим кодом я бы точно гордиться не стал.
4 июн 19, 08:36    [21901143]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
fraks,

ппц.
4 июн 19, 08:48    [21901155]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
delphinotes
Member

Откуда: Санкт-Петербург
Сообщений: 333
ain-2
А у меня привычка писать вот так (я про выравнивание):


Я тоже когда-то такой хернёй страдал на заре своего пути. А потом когда тебе надо найти по всем исходникам (которых может быть сотни за годы развития проекта) все присвоения (или наоборот, чтение, но не запись) какого-нить поля, замучаешься писать регулярки. Лучше строго: идентификатор-один_пробел-присвоение. Вообще лучше лишних пробелов (не касается первого отступа) ради красоты не ставить. И читается оно потом вполне естественно (не сразу, надо немного привыкнуть).
4 июн 19, 10:25    [21901255]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ёёёёё
Member

Откуда:
Сообщений: 701
delphinotes
... А потом ...


А потом применяешь автоформаттер... :)
4 июн 19, 10:48    [21901281]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 35 36 37 38 39 40 41 [42] 43 44   вперед  Ctrl
Все форумы / Delphi Ответить