powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшение оператора with: голосование и обсуждения
25 сообщений из 100, страница 1 из 4
Улучшение оператора with: голосование и обсуждения
    #39989254
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: "Стартовое" сообщение (сместилось после переноса):
DmSer
Предлагаю вынести обсуждение улучшений оператора with в данную ветку.
Ранее была создана задача, где предлагается ввести алиасы в оператор with.
Вот ссылка на неё: https://quality.embarcadero.com/browse/RSP-27468

Если Вам нравится идея и Вы ещё не принимали участие в голосовании, то обязательно проголосуйте, Ваш голос имеет значение!

Благодаря алиасам можно исправить фундаментальные проблемы оператора with, из-за которых Марко Канту уже который год грозится выпилить его из Delphi.
Одно из предложений было оформлять алиасы с помощью ключевого слова "as". В этом случае код может выглядеть таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
with MyArrayOfRecords[i] as r, GetMyObject() as o do
begin
  r.IntVal := 1;
  r.StrVal := 'Hello';
  o.MyRec := r;
end;



_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TMyThread.SetThreadStateInfo(const Value: string);
begin
StringProtectSection.Enter; // Входим в режим защиты
FThreadStateInfo := Value;
StringProtectSection.Leave; // Выходим из режима защиты
end;
try finally всегда. Даже если внутри одна строчка. Ну и использование одной глобальной критической секции на все - это огромный антипаттерн



try..finally ради одной безобидной строчки выглядит как-то нерационально. Какой в ней смысл? Кто такое правило ввёл?

Одну строчку без try..finally ещё нормально, а вот 2 строчки - уже лажа получается. Нужно предложить эмбаркадере ещё один вариант использования оператора with:

Код: pascal
1.
2.
3.
4.
with section CS do
begin

end;



это тупо синтаксический сахар над try..finally.

либо может более универсальное:

Код: pascal
1.
2.
3.
4.
with syncobject CS do
begin

end;



в таком случае пусть компилятор будет вспоминать, у кого Enter/Leave, Lock/Unlock, wait/release и т.д.

получится на 2 строчки короче, нежели с try..finally:

Код: pascal
1.
2.
3.
4.
5.
6.
CS.Enter;
try

finally
  CS.Leave;
end;



Как считаете, смысл есть?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989409
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

экономия на спичках, имхо
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989414
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
With - зло!

Лучше бы конструкцию

Код: pascal
1.
2.
3.
4.
try
except
finally
end;



замутили.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989416
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Как считаете, смысл есть?

1. Только если будет возможность подключать свои syncobjects. Например, через интерфейс.
2. Лучше не with, а какое-нибудь другое ключевое слово. Тот же using.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989417
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
With - зло!

with - отличная штука, которой не хватает единственной маленькой доработки для того, чтобы быть просто великолепной.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989418
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Какой?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989428
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
with Expr do
  .Name := Value;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989437
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С вложенными точками, надо полагать?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989441
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Код: pascal
1.
2.
with Expr do
  .Name := Value;



Но не решит проблему для нескольких переменных:
Код: pascal
1.
2.
with Expr1, Expr1 do
  .Name := Value;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989450
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За улучшение with можно голосовать: https://quality.embarcadero.com/browse/RSP-27468
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989456
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer> Но не решит проблему для нескольких переменных:

Да, если вложенные ещё можно как-то (уродливо, ИМХО)
разрешить, то с несколькими вроде бы совсем никак.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989461
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Но не решит проблему для нескольких переменных:

Для нескольких переменных решат алиасы:

Код: pascal
1.
2.
with Expr1 e1, Expr1 e2 do
  e1.Name := e2.Value;


Но я не уверен, что это действительно нужно.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989475
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
with - отличная штука

+1

Kazantsev Alexey
За улучшение with можно голосовать: https://quality.embarcadero.com/browse/RSP-27468

done

понимаю, что холивар. Только какой смысл в алиасах? имхо, красота with в краткости и отсутствии необходимости писать еще что-то слева от свойства/метода. Вряд ли в него будешь заключать портянки кода на 2-3 экрана

зы. на скруле всегда так, как только тема исчерпывается, начинается оффтоп. Ура, Рустему
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989476
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
DmSer
Но не решит проблему для нескольких переменных:

Для нескольких переменных решат алиасы:

Код: pascal
1.
2.
with Expr1 e1, Expr1 e2 do
  e1.Name := e2.Value;


Но я не уверен, что это действительно нужно.


Первые пару дней 10 человек проголосовали, затем задача ушла из топа. Думаю, голосов было бы намного больше.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989477
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док> Только какой смысл в алиасах?

В зависимости от ситуации, смыслов у алиаса может быть более одного.
В SQL кроме красоты/краткости это ещё и правильное разрешение имён.

> Вряд ли в него будешь заключать портянки кода на 2-3 экрана

Ты недооцениваешь умельцев.

> начинается оффтоп. Ура, Рустему

Опять я виноват? Почищу позже (если не забуду).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989480
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Для нескольких переменных решат алиасы:

Код: pascal
1.
2.
with Expr1 e1, Expr1 e2 do
  e1.Name := e2.Value;


Но я не уверен, что это действительно нужно.

Это почти то же самое что и
Код: pascal
1.
2.
3.
  var e1:=Expr1; 
  var e2:=Expr2;
  e1.Name := e2.Value;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989489
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Только какой смысл в алиасах?

Одноимённые члены резолвить без псевдонимов не получится.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989493
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Это почти то же самое что и
Код: pascal
1.
2.
3.
  var e1:=Expr1; 
  var e2:=Expr2;
  e1.Name := e2.Value;


А так работает?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989496
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Да. С 10.3 начиная.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989499
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, как появился инлайн var так надобность в with практически отпала.

По крайней мере мне такие случаи почти не попадаются.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989502
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю вынести обсуждение улучшений оператора with в данную ветку.
Ранее была создана задача, где предлагается ввести алиасы в оператор with.
Вот ссылка на неё: https://quality.embarcadero.com/browse/RSP-27468

Если Вам нравится идея и Вы ещё не принимали участие в голосовании, то обязательно проголосуйте, Ваш голос имеет значение!

Благодаря алиасам можно исправить фундаментальные проблемы оператора with, из-за которых Марко Канту уже который год грозится выпилить его из Delphi.
Одно из предложений было оформлять алиасы с помощью ключевого слова "as". В этом случае код может выглядеть таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
with MyArrayOfRecords[i] as r, GetMyObject() as o do
begin
  r.IntVal := 1;
  r.StrVal := 'Hello';
  o.MyRec := r;
end;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989503
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все проблемы с With решаются игнорированием правил старика Вирта и выдачей ошибки (или
хотя бы предупреждения) если идентификатор в коде ресольвится более чем в один объект
вместо примитивного "молча возьмём тот, что ближе" ака "кто последний, тот и папка".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989504
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё я предлагаю рассмотреть идею нового варианта использования оператора with для работы с примитивами синхронизации:

Код: pascal
1.
2.
3.
4.
with syncobject CS do
begin
   SomeCode;
end;



CS - это критическая секция, хотя можно пофантазировать и насчёт других объектов синхронизации (мьютексы, эвенты, спинлоки, TThreadList, объекты, поддерживающие общий интерфейс для синхронизации)

получится на 2 строчки короче, нежели с try..finally:

Код: pascal
1.
2.
3.
4.
5.
6.
CS.Enter;
try
  SomeCode;
finally
  CS.Leave;
end;



Вот коробит меня использовать try..finally для защиты всего лишь одной строки кода. А в случае with было бы нагляднее (по моему мнению).
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989507
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

А обработка ошибок у тебя в таком варианте где?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989510
Не поддерживаю. Язык должен быть понятным. А это уже лапша.
...
Рейтинг: 0 / 0
25 сообщений из 100, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшение оператора with: голосование и обсуждения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]