Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пт Сен 09 2005 10:09 Заголовок сообщения: with #$%&&#$ do |
|
|
Тут наткнулся на вопрос по поводу аналога паскалевского case of для C - switch. И вспомнился мне вопрос, на который, не найдя ответа, я забил, но теперь снова вспомнил. Есть ли в C++ что-нибудь подобное оператору "with" Паскаля (или VB, или еще штук двадцать языков). |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Пт Сен 09 2005 12:05 Заголовок сообщения: |
|
|
нет |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пт Сен 09 2005 12:08 Заголовок сообщения: |
|
|
Печально. |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Пт Сен 09 2005 16:00 Заголовок сообщения: |
|
|
На самом деле все не так печально как кажется. Если вы пишете на Си, то все действительно печально. Если вы пишите на Си++ используя ООП (я говорю именно про ОО парадигму) то необходимость использования аналога with указывает на плохое проектирование иерархии классов. Вообще в ООП обращаться к членам класса на прямую не есть гуд. А про структуры надо забыть сразу.
Все вышесказанное относится лишь к ООП. Лично я не люблю использовать Си++ для создания ООП приложений, больше предпочитаю создавать структурные программы на Си++ с использованием некоторых преимуществ ООП. Си++ на мой взгляд не очень приспособлен, как бы это парадоксально не прозвучало, для создания ООП приложений. |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Сен 12 2005 13:10 Заголовок сообщения: |
|
|
Поспорить не с чем. Но С++ мне нужен для работы, и тут не мне решать, пользоваться мне им или нет. Я бы с радостью на Delphi пописал бы (и не только потому, что там есть with).
Но все же интересно, почему не реализована такая хорошая и удобная, а местами - полезная, вещь with? |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Пн Сен 12 2005 20:56 Заголовок сообщения: |
|
|
Цитата: | Я бы с радостью на Delphi пописал бы |
Да за что ж ты их так?!
Цитата: | почему не реализована такая хорошая и удобная, а местами - полезная, вещь with |
1. Потому что организация классов в дельфях на порядок примитивнее (по версии оппонентов - проще и нагляднее ) того же в сях++ и вполне сравнима с аналогичной в вижуал бейсике. И организация withа в сях привела бы в ряде случаев к неоднозначной трактовке кода.
2. Если десять строк подряд начинаются с "MyObject. ... ", это заставляет задуматься о том, понимает ли вообще автор, на фига нужны классы. Такие вещи следует стремиться организовывать _внутри_ класса, а там никакой with вообще не нужен. |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Сен 13 2005 08:48 Заголовок сообщения: |
|
|
Что ни говори, но всегда найдутся классы с такой кучей пропертей, что присвоить паре из них необходимые значения недостаточно. Это первый случай. Второй - возможность с помощью with избежать "длинных" строк. Сейчас я пишу xml-парсер на C++, используя компонент TXMLDocument. Полнейшее безобразие начинает твориться, когда мне нужно работать со вложенными XML-блоками, например, третьего уровня. Смотрите сами:
XMLDocument->DocumentElement->ChildNodes->Nodes[0]->
ChildNodes->Nodes[0];
Это я только до него добрался. А если мне нужно прочитать, скажем, пять его аргументов, так еще и содержимое его свойства Text. Я не любитель огромных строк, поэтому создаю указатель на строку, приведенную выше. Сами понимаете, что это не оптимально.
А вот пример, как бы это все "звучало" в Паскале:
with XMLDocument.DocumentElement.ChildNodes[0].ChildNodes do
begin
x := Nodes[0]->Attributes['Attr1'];
y := Nodes[0]->Attributes['Attr2'];
z := Nodes[1]->Text;
end;
Не правда ли, кажется более эстетично, нежели три строки полностью? |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Вт Сен 13 2005 10:39 Заголовок сообщения: |
|
|
Перепроектируй прогу... Таких длинных строк быть не должно... |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Сен 13 2005 10:47 Заголовок сообщения: |
|
|
Так и я про тоже! Приходится делать что-то вроде:
_di_IXMLNode MyNode XMLDocument->DocumentElement->ChildNodes->Nodes[0];
MyNode->ChildNodes->Nodes[0] ...........
MyNode->ChildNodes->Nodes[0] ...........
MyNode->ChildNodes->Nodes[0] ........... и т.д.
Короче, могли бы Борландовцы "подкрутить" свой компилятор и воткнуть в него обработку какого-нить аналога with. |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Вт Сен 13 2005 11:23 Заголовок сообщения: |
|
|
Я не о том. У тебя явно ошибки проектирования. Вот например я сейчас пишу систему тестирования. Там агрегации:
Тест->Вопрос->Ответ
Разбираю из XML. Передаю в конструктор теста элемент теста element и пишу
Код: | ...
// создаю вопросы
NodeList list = element.getElementsByTagName("question");
for(int i=0; i<list.getLength(); i++)
add(new Question(list.item(i)));
...
|
Как не трудно догадаться в конструктор вопроса передается элемент вопроса, имеем:
Код: | ...
// Создаю ответы
NodeList list = element.getElementsByTagName("answer");
for(int i=0; i<list.getLength(); i++)
add(new Answer(list.item(i)));
...
|
И т.д.
Как видите, никаких длинных строк... |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вт Сен 13 2005 11:28 Заголовок сообщения: |
|
|
Все, конечно, замечательно, но у меня немного другие требования к XML-документу и моему парсеру. Не буду сейчас во все это углубляться, а то и так от темы отошли - модераторы заругают.
Короче, все понятно: нету в C++ with, ну и хрен с ним! |
|
Вернуться к началу |
|
|
|