Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Апр 24 2007 03:16 Заголовок сообщения: Ключевое слово "with" |
|
|
Товарищи! В свое время я уже поднимал эту тему, но в другом контексте. Трабл такой: в Дельфях, в Вижл Бейсике, в еще куча чем, есть такой киверд - with. Но в C/C++ он отсутствует. Может, оно и к лучшему, но тут вот прогу пишу, где надо в рантайме создать кучу контролов и, естественно, придать значения их свойствам. Свойств - море! Логично предположить, что with был бы здесь как никогда кстати (ну, ради сокращения писанины). Неужели ничего не предусмотрено в Сях под подобные нужды? |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Вт Апр 24 2007 07:44 Заголовок сообщения: Если в си чего-то нет, значит, это вам не нужно |
|
|
функциональный #дефайн не подходит?
-------------------------------------------------
Если в си чего-то нет, значит, это вам не нужно |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Апр 24 2007 20:47 Заголовок сообщения: |
|
|
Не думаю, что от дефайна будет какой-нить толк.
Собсна, как это все могло бы выглядеть на Дельфях:
Код: |
var CheckBox: TCheckBox;
CheckBox := TCheckBox.Create(nil);
with CheckBox do begin
Caption := 'blah-blah-blah';
Left := 10;
...
Top := 20;
Width := 150 end;
|
То же на Сях:
Код: |
TCheckBox *CheckBox = new TCheckBox(NULL);
CheckBox->Caption = "blah-blah-blah";
CheckBox->Left = 10;
...
CheckBox->Top = 20;
CheckBox->Width = 150;
|
Теперь представить себе еще штук десять-пятнадцать свойств для чекбокса... Честно признаться, каждый раз писать "CheckBox" немного лень. Да и размер кода - пусть даже и в ширину - но растягивается. Дефайном можно максимум заменить CheckBox на что-нить покороче, но в место этого логичнее было бы сразу создать указатель с более компактным именем.
Конечно, не так уж и страшно каждый раз указывать указатель (пардон за тафталогию), но не очень ясно, почему создатели синтаксиса Си (то бишь Майкрософт, если я не ошибаюсь) настолько умоляют перспективы использования with, что просто "забыли" про него? |
|
Вернуться к началу |
|
|
sniper::p
Зарегистрирован: 04.10.2005 Сообщения: 237 Откуда: rus/73
|
Добавлено: Ср Апр 25 2007 01:36 Заголовок сообщения: |
|
|
Во-первых, создатели С - не Майкрософт . Во-вторых, почему бы не написать вместо "CheckBox" что-нибудь вроде "cb"? В-третьих, в С это дело (т.е. "with") не нужно, поскольку остальной синтаксис так и говорит - в 1й строке - 1 инструкция.
ЗЫ Кстати, есть такой инструмент - буфер обмена, в него можно копировать и вставлять
ЗЗЫ Между прочим, можно всю эту расстановку оформить в отдельную функцию, в которую передавать указатель (там формально уже его назвать "cb" и ковыряться с ним сколько угодно) _________________ Нет предела совершенствованию |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Ср Апр 25 2007 01:52 Заголовок сообщения: |
|
|
sniper::p, я совсем не против отсутсвия with. "cb", конечно, можно писать, но полтора десятка строк, начинающихся с "cb->".......
Остальные тобой приведенные варианты не решают вопрос сокращения кода. Но есть же какое-то разумное объяснение отсутсвия with'а в Сях
Насчет Майкрософта я, действительно, ошибся. Перепутал его с Lucent Technologies (если опять ничего не путаю). |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Ср Апр 25 2007 08:39 Заголовок сообщения: В си, как в инете, есть всё. Вопрос в том, как это найти |
|
|
В заголовочном файле записать: Код: | #define CAPTION STRUCT.Caption
#define LEFT STRUCT.Left
...
#define TOP STRUCT.Top
#define WIDTH STRUCT.Width |
А в программном файле записать: Код: | TCheckBox *CheckBox = new TCheckBox(NULL);
#define STRUCT (*CheckBox)
CAPTION = "blah-blah-blah";
LEFT = 10;
...
TOP = 20;
WIDTH = 150;
#undef STRUCT |
#define будет аналогом предложения with, а #undef -- аналогом end.
Писанины будет больше только при определении структуры (фактически структуру придётся записать дважды), а при непосредственно программировании ровно также, как и в паскале
По поводу Lucent Technologies -- тоже ошибка. Си начинались в AT&T, в её подразделении Bell Laboratories
---------------------------------
В си, как в инете, есть всё. Вопрос в том, как это найти |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Ср Апр 25 2007 09:22 Заголовок сообщения: |
|
|
А я всегда думал, что Си придумали Керниган и Ричи
Насчет with, в си его действительно заменить сложно. Но оператор with заметно снижает читабельность программы. А как известно код пишется один раз, а читается десятки.
В Си++, установка сразу нескольких свойств объекта константами должна быть перенесена в метод класса этого объекта. Другое дело, если класс сторонних разработчиков который нельзя наследовать, тогда ничего не остается как писать все.
Но я не вижу в этом проблемы, печатаю достаточно быстро, чтобы об этом не думать. _________________ Самоловских Виталий aka Kefir |
|
Вернуться к началу |
|
|
|