Re[28]: Чем становится C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.12.04 17:38
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Кхм. Вообще-то, они не только под дотнетом работают. Это как раз и говорит о мощности и высокоуровневости этих языков.


Ты на два сообщения вверх голову подними. Это был ответ на бессмысленное заявление:

если мерой LISP .Net померять, так .Net вообще отдыхает и нервно курит

Я как бы просто намекнул, что сравнение языка с платформой — это логическая ошибка. Только и всего.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[46]: Чем становится C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.12.04 17:38
Оценка: -1
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Я так понимаю, ссылок на авторитетные источники, где бы design patterns причислялись бы к принципам ООП, ты привести не сможешь.


GOF тебя устроит?

>> Довольно глупо поощрять бардак и отсуствие дизайна как такового прикрываясь разговорами о стилях.


ПК>Безусловно. Однако в данном случае речь шла о сознательно принимаемых проектных решениях. Странно, что ты этого не заметил.


Это не я не заметил. Это ты пыташся выдать халтуру за проектные решения.

ПК>Для контраста, вот пример
Автор: VladD2
Дата: 20.11.04
описания "бардака и отсутствия дизайна" в моем понимании:

ПК>

Я часто пишу код по схеме — продавливаем проблему как выходит, а затем причесываем код рефакторингом. Очень эффективно выходит.


Что я могу скзать? Отсталое у тебя понимание. Или ты редко работал с исследователькими проектами. Подобный стиль и является частью процесса проектирования. Ты создашь протатип, анализируешь резуальтат и рефакторишь прототип в законченное и более грамотное решение. Не получив прототип ты просто не всилах сказать како проектное решение более грамотное.

Просто ты настолько привык, что процесс программирования это сложный, отвественнй и кропотливый процесс, что просто не можешь себе представить, что код можно писать со скоростью выражения своих мыслей на естественном языке.

Я точно так же пишу и стати. Сначало пишу общий план. Потом начинаю писать отдельные фрагменты. Потом читаю что получилось... переписываю... так сказать, кристализую мысль. В итоге через несколько итераций получается статья. Потом, как ты знашь, выношу ее на суд других и устраняю проблемы которые я не заметил. По-моему, очень продутивный подход. И при программировании он тоже прекрасно применим.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[49]: Чем становится C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.12.04 17:38
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Функция, входящая в namespace, но не являющаяся членом какого-нибудь класса, является свободной. Именно таких функций нет в C#/Java.


А в чем реальная разница? Что не дает сделать функция входящая в класс? И чем класс отличается от пространства имен для статической функции?
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[48]: Чем становится C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.12.04 17:38
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Тем, что она может не быть глобальной. Например, входить в какой-нибудь namespace. "Глобальная" говорит об области видимости. "Свободная" говорит, что функция не является членом класса. Суть ортогональные вещи.


Так, если отбросить ненужные частности, то какая разница между "свободными" функциями и статическими методами? В чем заключаются "физические" ограничения?
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Чем становится C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.12.04 17:38
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Да, я полагаю, Влад именно что-то такое имел в виду. И да, снова с тобой согласен, нужно уж очень неряшливо писать, чтобы пропустить такое. По-моему, языком это уже не лечится...


Что значит не лечитс, если подобной проблемы даже невозможно создать в Яве или Шарпе?
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Блин!
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.12.04 17:38
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>А потому, что GPF приведёт к более сильному недовольству пользователей и, следовательно — более острой реакции производителя софта. Ну а stack-dump window так сильно пользователей не раздражает.


Конкретный пример. Ворд вылетает на ревиженах вот уже более 10 лет. Реакция производителя нулевая.
... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Блин!
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.12.04 17:38
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Да-да! А еще ножи бывают настоящие, "опасные", а бывают пластиковые, "безопасные"


Граждане! Будтье бдительны!!!
В магазинах города появились поддельные елочные игрушки. С виду они как настоящие, но радости от них никакой.

Общество защиты прав потребителей.

... << RSDN@Home 1.1.4 beta 3 rev. 267>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Чем становится C++?
От: Павел Кузнецов  
Дата: 30.12.04 18:07
Оценка: 15 (3) +2
VladD2,

>>> Это дизайн. Никто не знает когда появится виртуальная функция.


> ПК> Влад, извини, но сейчас ты сказал совершеннейшую глупость. Полиморфным класс может стать "вдруг" только при абсолютно неграмотном проектировании.


> Извини и ты меня, но глупость говришь ты. Полиморфным класс будет и без виртуальной функции.


В терминах C++ полиморфным называется класс с виртуальными функциями. Это я и имел в виду. Перефразируя: виртуальные функции "вдруг" появиться могут в классе, ранее их не имевшем, только при абсолютно неграмотном проектировании. Т.е., случай "никто не знает, когда появится виртуальная функция" в моем понимании — абсолютно неграмотное проектирование. Как ты уже ранее говорил: "бардак и отсутствие дизайна".

> А безграмотным дизайн становится из-за желания сэкономить на витруальных функциях.


Дело далеко не только и не столько в экономии. Далеко не всегда функции должны быть виртуальными по своей природе. Виртуальная функция — зависимость базового класса от наследника. В тех случаях, где это не нужно/не предусматривается, делать функции виртуальными "на всякий случай" — и есть безграмотный дизайн.

Например, можно взять паттерн "шаблон":
class Base
{
public:
   void act()
   {
     // prefix
     do_action();
     // postfix
   }

private:
   virtual void do_action() = 0;
};

в данном случае сделать act() виртуальной — грубая ошибка дизайна.

> К тому же, любой мало-мальски долго живующий проект постоянно изменяется. И внесение изменений в дизайн — это совершенно нармальный процесс (рефакториг). И если твой дизайн плохо поддается изменению, то плох такой дизайн.


Это никак не коррелирует с тем, что часть классов может не иметь виртуальных функций по проекту.

> ПК> Зависит от контекста. Пример iterator traits уже приводили.


> Все равно странно. Это именно экономия в рассчете, на то что изменений не будет. В общем, очередное закладывание на частности ради скорости.


Виртуальные функции в iterator traits абсолютно бессмысленны. Равно как, скажем, и в std::unary_function. Это не оптимизация, это более четкое отражение назначения класса.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[47]: Чем становится C++?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.12.04 20:14
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Что я могу скзать? Отсталое у тебя понимание. Или ты редко работал с исследователькими проектами. Подобный стиль и является частью процесса проектирования.


Это верно не только для исследовательских проектов. Собственно это одна из составляющих ХР. И в нашем проекте мы тоже в итоге к подобному пришли, поскольку, как оказалось, самые качественные решения были получены именно таким путем.
... << RSDN@Home 1.1.4 beta 3 rev. 268>>
AVK Blog
Re[30]: Чем становится C++?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.12.04 20:14
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Что значит не лечитс, если подобной проблемы даже невозможно создать в Яве или Шарпе?


Ну это типа только криворукие программисты такое делают.
... << RSDN@Home 1.1.4 beta 3 rev. 268>>
AVK Blog
Re[31]: Чем становится C++?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.12.04 20:14
Оценка: +1 :)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Дело далеко не только и не столько в экономии. Далеко не всегда функции должны быть виртуальными по своей природе. Виртуальная функция — зависимость базового класса от наследника. В тех случаях, где это не нужно/не предусматривается, делать функции виртуальными "на всякий случай" — и есть безграмотный дизайн.


Что то я тебя понять не могу. Предположим были некоторые требования А, для них была создана иерархия классов без полиморфизма, good enough для поставленных требований (наследование применялось для реиспользования кода, поскольку это один из самых дешевых способов). Потом появились требования В и они привели к появлению виртуальных функций. В чем здесь криминал? Только не надо рассказывать про кривой дизайн и кривых менеджеров. Идеальный дизайн на начальных этапах создания продукта практически всегда недостижим.

ПК>Например, можно взять паттерн "шаблон":

ПК>
ПК>class Base
ПК>{
ПК>public:
ПК>   void act()
ПК>   {
ПК>     // prefix
ПК>     do_action();
ПК>     // postfix
ПК>   }

ПК>private:
ПК>   virtual void do_action() = 0;
ПК>};
ПК>

ПК>в данном случае сделать act() виртуальной — грубая ошибка дизайна.

Что то я не понял в чем смысл примера. Зачем делать виртуальную приватную функцию? Это не ошибка дизайна, это кретинизм.

>> Все равно странно. Это именно экономия в рассчете, на то что изменений не будет. В общем, очередное закладывание на частности ради скорости.


ПК>Виртуальные функции в iterator traits абсолютно бессмысленны. Равно как, скажем, и в std::unary_function. Это не оптимизация, это более четкое отражение назначения класса.


Паша, ты уж извини, но тут ты смотришь слишком узко. Ничего страшного в виртуальности нет в большинстве случаев. Вон в Java вобще функции по умолчанию виртуальны, и ничего, особых проблем это не вызывает. Да и виртуальность бывает ну очень разная. Даже в близком к классике дотнете и то есть помимо обычных виртуальных функций и двойная виртуальность поверх невиртуальных функций при реализации интерфейса (виртуально наличие реализации интерфейса в классе и виртуальна ссылка тна функцию в interface map), т.е. одна и та же функция может быть вызвана как виртуально, так и нет. А если вспомнить чего похитрее, например Smalltalk?
... << RSDN@Home 1.1.4 beta 3 rev. 268>>
AVK Blog
Re[48]: Чем становится C++?
От: Павел Кузнецов  
Дата: 30.12.04 21:39
Оценка:
AndrewVK,

> VD> Что я могу скзать? Отсталое у тебя понимание. Или ты редко работал с исследователькими проектами. Подобный стиль и является частью процесса проектирования.


> Это верно не только для исследовательских проектов. Собственно это одна из составляющих ХР.


Нет, XP включает обязательный этап проектирования на каждой итерации. В классике, если не ошибаюсь — несколько дней на двухнедельных итерациях. Отличие от водопада в итерационном характере процесса, а не в отсутствии проектирования.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[32]: Чем становится C++?
От: Павел Кузнецов  
Дата: 30.12.04 22:33
Оценка: 7 (2)
AndrewVK,

> ПК> Дело далеко не только и не столько в экономии. Далеко не всегда функции должны быть виртуальными по своей природе. Виртуальная функция — зависимость базового класса от наследника. В тех случаях, где это не нужно/не предусматривается, делать функции виртуальными "на всякий случай" — и есть безграмотный дизайн.


> Что то я тебя понять не могу. Предположим были некоторые требования А, для них была создана иерархия классов без полиморфизма, good enough для поставленных требований (наследование применялось для реиспользования кода, поскольку это один из самых дешевых способов). Потом появились требования В и они привели к появлению виртуальных функций. В чем здесь криминал?


Можно конкретный пример? Я как-то слабо такую ситуацию представляю. Зачем там понадобятся виртуальные функции, если с объектами унаследованных классов через указатели/ссылки на базовые не работают? Или я чего-то не вижу, что подразумевается?

Я легко могу представить себе появление виртуальных функций в классе, в котором их ранее не было, чуть в других случаях, чем ты описал. Но это произойдет не "вдруг", не случайно, не на уровне кодирования. Если так произошло, то класс должен будет перепроектироваться, т.к. его использование станет совсем другим, чем раньше.

> Идеальный дизайн на начальных этапах создания продукта практически всегда недостижим.


+1. Но это не означает, что на этом основании можно пропускать проектирование.

> ПК>Например, можно взять паттерн "шаблон":

> ПК>
> ПК>class Base
> ПК>{
> ПК>public:
> ПК>   void act()
> ПК>   {
> ПК>     // prefix
> ПК>     do_action();
> ПК>     // postfix
> ПК>   }
>
> ПК>private:
> ПК>   virtual void do_action() = 0;
> ПК>};
> ПК>

> ПК>в данном случае сделать act() виртуальной — грубая ошибка дизайна.
>
> Что то я не понял в чем смысл примера. Зачем делать виртуальную приватную функцию? Это не ошибка дизайна, это кретинизм.

Это сознательное ограничение: саму виртуальную функцию do_action() вызывать имеет "право" только класс Base. Наследникам ее вызывать ни к чему. Впрочем, это здесь далеко не самое важное. Можешь ее сделать protected, если тебе так больше нравится (хотя вот это уже и будет ошибкой, т.к. тогда у наследников появится возможность ее вызывать, чего они делать не должны). Главное, что функция act() должна быть невиртуальной.

> ПК> Виртуальные функции в iterator traits абсолютно бессмысленны. Равно как, скажем, и в std::unary_function. Это не оптимизация, это более четкое отражение назначения класса.


> Паша, ты уж извини, но тут ты смотришь слишком узко.


По-моему, допущение большего количества вариантов (например, возможность существования наследования без виртуальных функций) — скорее, более широкий взгляд на вещи, чем более узкий

> Ничего страшного в виртуальности нет в большинстве случаев.


По этому поводу есть разные мнения. Я согласен с таким:

Bill Venners: In Java, instance methods are virtual by default—they can be overridden in subclasses unless they are explicitly declared final. In C#, by contrast, instance methods are non-virtual by default. To make a method virtual, the programmer must explicitly declare it virtual. Why is non-virtual the default in C#?

Anders Hejlsberg: There are several reasons. One is performance. We can observe that as people write code in Java, they forget to mark their methods final. Therefore, those methods are virtual. Because they're virtual, they don't perform as well. There's just performance overhead associated with being a virtual method. That's one issue.

A more important issue is versioning. There are two schools of thought about virtual methods. The academic school of thought says, "Everything should be virtual, because I might want to override it someday." The pragmatic school of thought, which comes from building real applications that run in the real world, says, "We've got to be real careful about what we make virtual."

When we make something virtual in a platform, we're making an awful lot of promises about how it evolves in the future. For a non-virtual method, we promise that when you call this method, x and y will happen. When we publish a virtual method in an API, we not only promise that when you call this method, x and y will happen. We also promise that when you override this method, we will call it in this particular sequence with regard to these other ones and the state will be in this and that invariant.

Every time you say virtual in an API, you are creating a call back hook. As an OS or API framework designer, you've got to be real careful about that. You don't want users overriding and hooking at any arbitrary point in an API, because you cannot necessarily make those promises. And people may not fully understand the promises they are making when they make something virtual.


> Вон в Java вобще функции по умолчанию виртуальны, и ничего, особых проблем это не вызывает.


Виртуальность по умолчанию в Java делает невозможной полноценную реализацию design by contract, т.к., например, нельзя гарантировать вызов проверок пред-/постусловий.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[47]: Чем становится C++?
От: Павел Кузнецов  
Дата: 30.12.04 22:54
Оценка: +1 -1
VladD2,

> ПК> Я так понимаю, ссылок на авторитетные источники, где бы design patterns причислялись бы к принципам ООП, ты привести не сможешь.


> GOF тебя устроит?


Более чем. Итак, хоть одну ссылку оттуда, где бы паттерн назывался принципом ООП.

>>> Довольно глупо поощрять бардак и отсуствие дизайна как такового прикрываясь разговорами о стилях.


> ПК> Безусловно. Однако в данном случае речь шла о сознательно принимаемых проектных решениях. Странно, что ты этого не заметил.


> Это не я не заметил. Это ты пыташся выдать халтуру за проектные решения.


Чудной ты человек... Тебе ж даже ход рассуждений продемонстрировали. Ты чем бросаться эпитетами, показал бы изъяны в последнем...

> ПК>Для контраста, вот пример
Автор: VladD2
Дата: 20.11.04
описания "бардака и отсутствия дизайна" в моем понимании:

> ПК>

Я часто пишу код по схеме — продавливаем проблему как выходит, а затем причесываем код рефакторингом. Очень эффективно выходит.


> Подобный стиль и является частью процесса проектирования. Ты создашь протатип,


+1: нормальный подход в качестве создания прототипа.

> анализируешь резуальтат и рефакторишь прототип в законченное и более грамотное решение.


-1: прототип не годится для создания конечного дизайна.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[50]: Чем становится C++?
От: Павел Кузнецов  
Дата: 30.12.04 22:55
Оценка:
VladD2,

> А в чем реальная разница? Что не дает сделать функция входящая в класс? И чем класс отличается от пространства имен для статической функции?


http://rsdn.ru/Forum/Message.aspx?mid=972007&amp;only=1
Автор: Павел Кузнецов
Дата: 30.12.04
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[30]: Чем становится C++?
От: Павел Кузнецов  
Дата: 30.12.04 22:56
Оценка: +2
VladD2,

> ПК> нужно уж очень неряшливо писать, чтобы пропустить такое. По-моему, языком это уже не лечится...


> Что значит не лечитс, если подобной проблемы даже невозможно создать в Яве или Шарпе?


Не лечится такая неряшливость. Будут не эти проблемы, так другие.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[49]: Чем становится C++?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.12.04 23:15
Оценка: 21 (1)
Здравствуйте, Павел Кузнецов, Вы писали:

>> VD> Что я могу скзать? Отсталое у тебя понимание. Или ты редко работал с исследователькими проектами. Подобный стиль и является частью процесса проектирования.


>> Это верно не только для исследовательских проектов. Собственно это одна из составляющих ХР.


ПК>Нет, XP включает обязательный этап проектирования на каждой итерации.


Безусловно. И Влад ведь тоже не говорит что проектировать вовсе не нужно. Но ключевое отличие — проектирование делается по месту, только на основании уже доступных данных, без особых предположений что там будет дальше. И тут есть еще один момент — исходной информацией для проектирования являются не только требования заказчика, но еще и текущее состояние системы (сложность программных структур, бутылочные горлышки, потребление ресурсов алгоритмом и т.п.). В точке 0 второй состовляющей у тебя практически нет. Поэтому собственно Влад и предлагает — спроектировать вчерне и получить более полную информацию о будущей системе, а потому же проектировать более тщательно и приближать существующую систему к идеалу путем рефакторинга.
... << RSDN@Home 1.1.4 beta 3 rev. 268>>
AVK Blog
Re[33]: Чем становится C++?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.12.04 23:15
Оценка: +1
Здравствуйте, Павел Кузнецов, Вы писали:


ПК>Можно конкретный пример? Я как-то слабо такую ситуацию представляю. Зачем там понадобятся виртуальные функции, если с объектами унаследованных классов через указатели/ссылки на базовые не работают?


Вчера не работали, сегодня работают. Опять же контейнеры — в них может использоваться базовый тип отнюдь не только из-за полиморфизма, а просто чтобы получить типизированный контейнер для относительно разнородных данных. Или когда объекты изначально предполагаются полиморфными ради масштабируемости кода, но на начальных этапах ни одной виртуальной функции не наличествует за ненадобностью.

ПК>Я легко могу представить себе появление виртуальных функций в классе, в котором их ранее не было, чуть в других случаях, чем ты описал. Но это произойдет не "вдруг", не случайно, не на уровне кодирования. Если так произошло, то класс должен будет перепроектироваться, т.к. его использование станет совсем другим, чем раньше.


А это уже пофигу. Проблемы останутся теми же самыми. Что бы там не напроектировали проектировщики, в итоге все равно придется править код.

>> Идеальный дизайн на начальных этапах создания продукта практически всегда недостижим.


ПК>+1. Но это не означает, что на этом основании можно пропускать проектирование.


Речь не о пропускании, речь о том что не стоит сильно много тратить усилий на проектирование сразу — практически 100% шанс что детализация первых вариантов дизайна пойдет в итоге в мусорную корзину. У нас в текущем проекте некоторые системы оказались перепроектированы по 4 раза до выхода первой беты. Но они же в итоге оказались наиболее качественно спроектированны.

>> Что то я не понял в чем смысл примера. Зачем делать виртуальную приватную функцию? Это не ошибка дизайна, это кретинизм.


ПК>Это сознательное ограничение: саму виртуальную функцию do_action() вызывать имеет "право" только класс Base. Наследникам ее вызывать ни к чему.


Зачем ее тогда делать виртуальной? Для красоты?

ПК> Впрочем, это здесь далеко не самое важное. Можешь ее сделать protected, если тебе так больше нравится (хотя вот это уже и будет ошибкой, т.к. тогда у наследников появится возможность ее вызывать, чего они делать не должны). Главное, что функция act() должна быть невиртуальной.


Слишком куцый пример. Я так и не смог понять мысль, которую ты хотел донести.

>> Паша, ты уж извини, но тут ты смотришь слишком узко.


ПК>По-моему, допущение большего количества вариантов (например, возможность существования наследования без виртуальных функций) — скорее, более широкий взгляд на вещи, чем более узкий


Я не про это. А про то что виртуальность отнюдь не ограничивается классическим вариантом с VMT.

>> Ничего страшного в виртуальности нет в большинстве случаев.


ПК>По этому поводу есть разные мнения. Я согласен с таким:


Это не мнение, это вобщем то реклама. Опять же — в случае интерфейсов вобще нет возможности влиять на виртуальность реализаций. А еще иногда JIT виртуальные вызовы может убирать. Вобщем все не так тривиально.

>> Вон в Java вобще функции по умолчанию виртуальны, и ничего, особых проблем это не вызывает.


ПК>Виртуальность по умолчанию в Java делает невозможной полноценную реализацию design by contract, т.к., например, нельзя гарантировать вызов проверок пред-/постусловий.


Тем не менее за год, что я писал на джаве, я сам ни разу с такими проблемами не сталкивался и не слышал чтобы кто то из-за этого поимел что то серьезное. Зато слышал кучу матюков за воткнутые не к месту final. У виртуальности есть две стороны медали — с одной стороны она действительно снижает защищенность, но с другой стороны увеличивает гибкость и позволяет расширять библиотеки не только теми способами о которых догадались подумать их создатели.
... << RSDN@Home 1.1.4 beta 3 rev. 268>>
AVK Blog
Re[34]: Чем становится C++?
От: Павел Кузнецов  
Дата: 31.12.04 00:00
Оценка:
AndrewVK,

> Опять же контейнеры — в них может использоваться базовый тип отнюдь не только из-за полиморфизма, а просто чтобы получить типизированный контейнер для относительно разнородных данных. Или когда объекты изначально предполагаются полиморфными ради масштабируемости кода, но на начальных этапах ни одной виртуальной функции не наличествует за ненадобностью.


Что-то я не понял, как это относится к обсуждавшемуся примеру... Плюс, в обоих этих случаях деструктор должен будет делаться виртуальным с рождения, т.к., насколько я понимаю, удалять их будут через указатель на базу...

> ПК> Я легко могу представить себе появление виртуальных функций в классе, в котором их ранее не было, чуть в других случаях, чем ты описал. Но это произойдет не "вдруг", не случайно, не на уровне кодирования. Если так произошло, то класс должен будет перепроектироваться, т.к. его использование станет совсем другим, чем раньше.


> А это уже пофигу. Проблемы останутся теми же самыми.


Нет, в случаях, которые я себе представляю, проблем с виртуальностью деструкторов не будет, т.к. через базу эти объекты не удаляются. В общем, пока не последовало конкретных относительно реальных примеров, вряд ли что-то станет яснее...

>>> Что то я не понял в чем смысл примера. Зачем делать виртуальную приватную функцию? Это не ошибка дизайна, это кретинизм.


> ПК>Это сознательное ограничение: саму виртуальную функцию do_action() вызывать имеет "право" только класс Base. Наследникам ее вызывать ни к чему.


> Зачем ее тогда делать виртуальной? Для красоты?


Нет, потому что она вызывается из act(), и нужно, чтобы была вызвана функция, определенная в наследнике.

> ПК> Впрочем, это здесь далеко не самое важное. Можешь ее сделать protected, если тебе так больше нравится (хотя вот это уже и будет ошибкой, т.к. тогда у наследников появится возможность ее вызывать, чего они делать не должны). Главное, что функция act() должна быть невиртуальной.


> Слишком куцый пример. Я так и не смог понять мысль, которую ты хотел донести.


Дык, я ж название паттерна привел. В любом хорошем описании паттерна "шаблон метода" будет подробно изложено все в деталях...

> Я не про это. А про то что виртуальность отнюдь не ограничивается классическим вариантом с VMT.


А где это подразумевалось? С точки зрения проблем, вызываемых ненужной виртуальностью, достаточно семантики. С точки зрения накладных расходов — их неизбежности при виртуальности функций.

> ПК> Виртуальность по умолчанию в Java делает невозможной полноценную реализацию design by contract, т.к., например, нельзя гарантировать вызов проверок пред-/постусловий.


> Тем не менее за год, что я писал на джаве, я сам ни разу с такими проблемами не сталкивался <...>


Я слышал жалобы на Java именно в контексте использования design by contract, template method pattern и т.п.

> У виртуальности есть две стороны медали — с одной стороны она действительно снижает защищенность, но с другой стороны увеличивает гибкость и позволяет расширять библиотеки не только теми способами о которых догадались подумать их создатели.


Ну, по умолчанию я за защищенность и сохранение заявленных инвариантов.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[51]: Чем становится C++?
От: Волк-Призрак Россия http://ghostwolf.newmail.ru
Дата: 31.12.04 10:00
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Например, как без свободных функций вызвать в шаблоне/generic функции скалярное умножение двух векторов, если вектор может быть как встроенным массивом, так и структурой, определенной пользователем? Со свободными функиями легко:

ПК>
ПК>template< class T>
ПК>void my_function( const T& t1, const T& t2 )
ПК>{
ПК>   . . .

ПК>   . . . = scalar_multiplication( t1, t2 );

ПК>   . . .
ПК>}
ПК>

ПК>Задача пользователя данной функции — определить scalar_multiplication для типов, которые передаются в данную функцию. Это можно сделать для любых типов, даже если тип определен в какой-то библиотеке, модифицировать которую мы не можем.

Всё это проблематично только потому, что в шаблоны некоторых языков нельзя примитивные типы вставлять. А вы не обратили внимание, что происходит в данном примере?? Оборачивание свободной функции объектом! Так что проблема свободных функций не становится мене надуманной имхо после данного примера.

ПК>Еще один, классический пример — функция swap(). Та же история: ее можно использовать из любых шаблонов для любых типов именно потому, что она является свободной функцией: пользователь может использовать готовую, либо, при желании, определить свою, более оптимальную, для своих или библиотечных типов.

Не думаю, что т. н. несвободные функции являются ущербными по своей функциональности только потому что они не свободны. Либо язык позволяет использовать примитивные типы в шаблонах, либо нет. Это более серьёзная проблема оо-языков чем "свобода" или "рабство" функций. Именно отсутствие возможности создать что либо в стиле

public class Matrix<class PrimitiveType> { 
  public Matrix<PrimitiveType> Invert() {
  //делаем обратную матрицу
    }
    public Matrix<PrimitiveType> Multiple(Matrix<PrimitiveType> to) {
    //перемножаем матрицы
    }
    //итд итп
}

Matrix<double> identity=new Matrix<double>;
identity=identity*


более сильно ограничивает меня чем отсутсвие свободных фунций. Необъходимо также заметить, что подобный манёвр требует спецмализации шаблона по всем примитивнымтипам и по классу Number (или его логическим аналогам). О Number-классах хочу сказать особо то, что я не понимаю, почему (хотя бы) для них не сделали перегрузку операторов "по мнемоническим именам". Чтонибудь вроде строгого соответствия THISCLASS OPERATOR_MULTIPLY(THISCLASS arg); оператору *

ПК>В результате, без нормальной поддержки свободных функций, многие возможности языка недоступны пользователю, не желающему писать в ОО-стиле.

Язык стал бы слишком сложен с точки зрения написания рантайма. Но за простоту относительную реализации пришлось заплатить слишком дорого.
... << RSDN@Home 1.1.4 beta 3 rev. 185>> @@J[getWorld.ApplyCheats(unfair.Cheats.IDDQD_AND_IDKFA]
while(Life.getClass().getClassLoader()==Religion.GOD){Life.be();};
Скажи .net корпорации Microsoft! (c) ghostwolf 2004
7 раз поищи в стандартной библиотеке, 1 раз накодь своё.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.