|
|
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Удивительно малая активность в этом топике, да и то, больше по BCB. А как насчет "честных" С++ программ? Самое неприятное в ситуации с C++, что всю мощь этого языка многие компиляторы стали поддерживать только несколько лет назад. Это зело удивительный факт, если учесть, что подавляющее большинство системных и прикладных программ на столе рядового пользователя написаны именно на нем. Правда, это доля с каждым годом все уменьшается. Правомерный вопрос почему ? Чем та же Java или C# лучше С++, что так активно его вытесняет? Попытаемся перечислить основные причины, и оценить степень их серьезности: В пользу Java и С#: 1. Java и C# имеют систему автоматического сбора мусора. Это освобождает программиста от дополнительных затрат внимания при проектировании/кодировании. 2. Java и C# имеют способность оперировать мета-информацией, т.е. данными об устройстве классов. 3. Java и C# идут в поставке с мощнейшими и абсолютно бесплатными библиотеками пригодными практически на все случаи жизни. 4. Java и C# не могут работать с памятью напрямую (unsafe в C# пока не рассматриваем), что позволяет рассматривать это качество как "защиту от дурака" 5. Программы на Java и С# обычно при прочих равных условиях состоят из меньшего числа строк и требуют меньше времени на отладку (самое большое и стойкое заблуждение). В пользу C++: 6. С++ позволяет использовать множественное наследование не только интерфейсов, но и реализации. 7. С++ позволяет работать с памятью напрямую, что при умелом использовании может дать приличный выигрыш в эффективности. 8. С++ имеет такое средство как шаблоны, уникальнейший и, к сожалению, плохо понимаемый большинством разработчиков механизм. (пунктов в обоих списках могло быть гораздо больше, но и этого достаточно для начала обсуждения) Теперь попробуем достойно ответить по пунктам-минусам. >1. Для С++ можно использовать технологию COM для аналогичных целей. Однако, учитывая что эта технология совершенно не использует возможностей языка (т.к. предназначена для "межязыкового" общения), всерьез ее рассматривать не будем. На данный момент у меня есть отлаженная реализация классов и механизмов, которые решают эту проблему именно используя все возможности языка С++. Т.е. практически любые классы, которые написаны на C# или Java переводяться один-в-один (с точностью до мелких особенностей конструкций) на C++ c применением этой технологии. (правомерный вопрос про reflection - в следующем пункте). >2. Какой процент классов в реальном приложении на Java и C# использует reflection? Если предположу, что 5% - это с запасом (я не беру специфические приложения) Использование для этих случаев в С++ такое понятие как Объект Класса, плюс применение всевозможных шаблонов проектирования (типа абстрактных фабрик) позволяет довольно легко решить проблему динамического создания различных экземпляров классов в зависимости от различных обстоятельств. >3. На мой взгляд именно этот пункт (а не какие другие, учитывая только что сказанное) и является решающим. Эти библиотеки обеспечивают бОльшую начальную степень готовности пустого приложения для выполнения множества повседневных задач. Исторически, библиотеки под C++ стоят немало, и я еще не видел ни одной библиотеки хотя бы чуть-чуть сравнимой с тем, что дали нам Sun и Microsoft (.NET) сейчас. Причем, в пылу "горячей конкуренции", абсолютно даром . (чем весь мир и не преминул воспользоваться). >4. Язык С++ можно рассматривать со многих сторон, и как довольно низкоуровневый и как довольно высокоуровневый. В этом его и сила и слабость. И здесь может помочь только строжайшая дисциплина кода. Могу предложить вариант, которым успешно пользуюсь много лет: когда кодируем участки кода, имеющие прикладной характер, строго придерживаемся стиля Java, C#, VB. Если тянет сделать что-то "нехорошее" ( п.7. ), нужно спросить себя "а возможно ли такое на этих языках". Если ответ "нет" - значит однозначно нет. Все более-менее сложные или близкие по характеру к системным задачи необходимо оформлять в виде самодостаточных абсолютно безопасных и имеющих простой внешний интерфейс классов. Все это, понятное дело, азы . Но имено нестрогое следование этим азам снискало такому мощному инструменту дурную славу. Почему программистам (а программист - это звучит "гордо", и это не пафос, это раздел человеческой деятельности требущий практически идеальных мозгов), так вот, почему программистам обязательно "давать линейкой по пальцам", в виде языков с заведомо и специально ограниченными возможностями, только для того, чтобы повышать надежность программ? Представьте только ход рассуждений разработчиков языка Java, когда они убирали оттуда все более-менее сложные и интересные конструкции языка С++ перед тем отправить Java в программистские "массы" (стадо). (Мне - обидно :)). Язык Java не люблю до сих пор, с С#, конечно, пообщаемся, там нам хоть что-то "вернули") . >5. Самый-пресамый интересный момент. Правда жизни в том, что любые алгоритмы и любые иерархии классов, разработанные на C++, обычно оказываются как минимум вдвое меньше аналогичных на Java или там C#!!! (используя возможности 6 и 8 ). И занимают на разработку и отладку примерно вдвое меньше времени и сил. (Хотелось бы, чтобы проектировщики и системные аналитики обратили свое внимание на этот интересный факт). Наследование реализаций и применение шаблонов - это уникальнейшие и мощнейшие инструменты, которые, почему-то нечасто используются прикладными программистами на С++. (может из-за "воспитания" на BCB?) В то время, когда програмистам на Java и C# приходится имплементить свои интерфейсы в КАЖДОМ классе-наследнике (или применять уродливые парадигмы адаптеров), в С++ мы имеем возможность лишь ОДНОКРАТНО реализовать и отладить интерфейс. Да и применение интерфейсов в чистом виде в среде чистого С++ неоправдано, я предпочитаю базовые библиотечные классы, выполняющие аналогичную роль - это экономит время, уменьшает размер программ и повышает эффективность. Так почему же программы на С++ обычно столь громозки? А вы возьмите любую немаленькую программу на С++ и исследуйте ее на предмет соотношения количества кода общего назначения (который мог бы уже быть, как он есть в библиотеках .NET) и кода, относящегося непосредственно к прикладной области. Результат анализа обычно плачевный . Примерно 40%-80% это код, которого могло не быть . Т.е. каждый программист на С++ пишет свой очередной тысячный велосипед. И проектирование программы на С++ сводится к тривиальным и оскорбительным вещам: выбрать МИНИМУМ используемых средств и известных методологий общего назначения, дабы наша программа не превратилась в ходячую библиотеку. Т.е., на мой взляд, п.3 - это и есть тот камень предкновения. Таким образом, спорить о неких достоинствах языков в отрыве от среды, в которой они работают - бессмысленно. Языки типа Java и C# изначально по своим возможностям являются подмножествами языка С++, следовательно, утверждать, что эти языки мощнее - элементарно неграмотно . То же самое касается и насчет размера программ, написанных на С++. Повторюсь, при прочих РАВНЫХ условиях, программы на С++ гораздо короче и требуют гораздо меньше времени на разработку. Резюме. Что дальше? Дальше попытаемся представить себе примерный порядок работы программиста над прикладным проектом. Пусть проект будет не маленький, т.е. ситуацию написания программы в лоб отбрасываем. Прикладной программист/разработчик, исследуя полученные спецификации, пытается спроецировать сущности предметной области на разрабатываемые конструкции/типы (классы, структуры), а взаимодействия между этими сущностями описывает в виде процедур (в чистом ООП - методы классов). В конечном итоге, если разработчик шел по правильному пути, он получает отлаженный набор классов, в рамках которого решение любых задач из требуемой предметной области оборачивается весьма несложной задачей и обходиться в малое число строк исходного кода. Т.е. на старе мы имеет некий уровень, "стартовый" уровень. Это то, что дано нам языком и библиотеками, имеющимися в распоряжении. И есть уровень некоей готовности под определенную прикладную область, "прикладной" уровень. Так вот, в случае языка С++, мы имеем возможность "подобраться" к прикладному уровню гораздо ближе, чем в случае Java и C#. Нам в этом помогает возможность переопределения практически ЛЮБЫХ операторов языка, что делает синтаксис программы наглядным а суть алгоритмов - очевидной, а так же теже самые шаблоны. Не стоит забывать, что в С++ шаблонными могут быть не только типы, но и отдельные функции, а так же отдельные методы классов внутри обычного не шаблонного класса, что позволяет нам обощать алгоритмы для работы с различными типами или специфировать их (частичная спецификация шаблонов) со сколь угодной степенью детализации. Теперь насчет того самого "стартового" уровня. Ситуация такова, что за последние несколько лет сообщество С++ программистов так или иначе в меру своих сил и свободного времени решали отдельные задачи, т.е. уже имеется в наличии очень много исходного материала. (sourceforge, codeproject, codeguru, и еще миллион ресурсов). При желании, и наличии единомышленников, можно попытаться собрать некий framework, на основе этого самого материала, вместо того, чтобы каждый раз писать новый. У самого есть масса наработок, которые надо бы классифицировать, сделать легкий рефакторинг и (я надеюсь, с удовольствием) использовать. Кто за - поднимите руки! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2003, 22:18 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Толково написано. Особенно насчет >40%. Но пусть в меня кинут камнем, если можно было обойтись без этого :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2003, 11:23 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Я за !!! но вот я пока не могу никак слесть с BC++ а так скоро видимо на VC++ перейду .. но тут да придется попотеть , MFC ,ATL придется изучать ну и в догонку STL :(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2003, 11:29 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Во-во беда всех билдеровцов STL не знают. Да и STL под билдером толком не работает. И вобще не забываем про www.boost.org ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2003, 12:52 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Достойно. ИМХО, одна из причин активного продвижения языков со слабой типизацией - возможность быстро склепать что-то условно работающее не задумываясь о дальнейшем развитии продукта и без учёта некоторых вещей , которые естественным образом учитываются C++-программистами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2003, 14:07 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
"ИМХО, одна из причин активного продвижения языков со слабой типизацией - возможность быстро склепать что-то условно работающее не задумываясь о дальнейшем развитии продукта и без учёта некоторых вещей, которые естественным образом учитываются C++-программистами." Это Java то язык со слабой типизацией? Ну-ну. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2003, 15:22 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2adb Хорошо: с сильной динамической типизацией. Убогости Java как языка это всё равно не отменяет. На мой вкус, разумеется. :) К тому же, манера сводить всё к одному базовому Object... ну да... ну да... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2003, 18:01 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 adb К сведению поклонников Java - это язык с крайне низкой степенью типизации. Java-библиотеки сводят свои программы к оперирования над Object, что не есть очень быстро, т.к. динамические преобразования типов во время исполнения тоже чего-то да стоят (в доказательство своих слов могу отослать к исходникам Java VM: http://www.kaffe.org ) С 1997-го (поправьте, ели ошибаюсь) в С++ утверждена конструкция dynamic_cast (хотя реально использовалась гораздо раньше), которая динамически приводит типы не хуже, чем это делает Java. Конструкция typeid() позволяет узнать имя типа и сравнивать типы, так что, все это у нас есть. Когда говорят, что C++ - это язык с сильной типизацией, то имеют ввиду, что это язык с сильной статической типизацией, позволяющий еще на этапе компиляции отлавливать массу ситуаций, которые Java-программисты отлавливают при отладке. Более того, частое использование динамического приведения типа - это признак дурного тона для С++ программы. Если есть иерархия/семейство классов, требующие взаимного приведения, предпочитаю в этом случае в один из базовых классов включать виртуальные функции, типа: Код: plaintext 1. а в наследниках их переопределять, причем делаю я это лишь однократно, в шаблоне, напр.: Код: plaintext 1. 2. 3. Вызов виртуальной функции обходится на порядок дешевле, чем динамическое приведение типов. 2 WolfHound, 2 JibSkeart Когда я говорил о применении шаблонов в своих программах, я не имел ввиду применение не только лишь STL или Boost , это само собой. :) Я говорю о широком применении шаблонов как способа разработки, т.е. наряду с классами необходимо разрабатывать свои шаблоны под прикладную область в рамках своего проекта. Это дает массу преимуществ. Необходимость писать и отлаживать код шаблона лишь однажды - одно из них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2003, 19:26 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 vdimas Ты же не знаешь насколько я применяю шаблоны так?... А что касается dynamic_cast то Геннадию Васильеву и не только от меня на www.rsdn.ru уже досталось... Надоело повторять что иногда он незаменим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2003, 22:11 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 WolfHound Ну, не путай частое приведение типов и " иногда незаменим". Я, например, всегда обходился без dynamic_cast<>. В плагинных архитектурах, кстати, тоже. В Java же (и не только) и его скриптовых клонах, к сожалению, приведение типов от базового к частному - в порядке вещей (а как иначе добиться общности тех же банальных контейнеров?), что и приводит в конечном итоге ко всем специфическим для данного подхода последствиям - ненадёжности и тормознутости. А что до этого: А что касается dynamic_cast то Геннадию Васильеву и не только от меня на www.rsdn.ru уже досталось... Надоело повторять что иногда он незаменим. то какой смысл доказывать что-то оппонентам, которые в упор не желают видеть очевидных вещей? Вот я и почти прекратил дискуссию. А факт признания своей неправоты в конкретном случае ещё только собираюсь дополнить обобщающими выводами. ;) Кстати, по крайней мере продолжаю настаивать на том, что активное применение dynamic_cast<> на C++ (как и любого другого способа runtime- анализа структуры программы) приводит к снижению надёжности и эффективности работы програмы или, как минимум, к её усложнению, а следовательно, желательно, чтобы таковое было исключено. Да, справедливости ради упомяну, что для Java тоже появились шаблоны. Только вот атомарные типы в качестве аргументов не поддерживаются, что есть весьма досадно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 05:34 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2vdimas: ох, ну и идеалист же ты. На самом деле C#/Java - они та может и не выразительней, и множественного наследования с шаблонами в них нет - но отличаются они не этим - они отличаются наличием/отсутсвием среды выполнения - и только благодаря этому они могут похоронить C++ - если не появится поставщик который добавит ее и в него. Если, например, та же MS - продолжит поддержку managed C++ - то у него есть будущее - иначе.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 08:46 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
к стати - generic programming - оно только у Степанова без проблем! В том виде в котором оно реализовано в C++ - с ни куча проблем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 08:49 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Геннадий Васильев Блин ну и упертый же ты... 1)Тормоза При создании объекта который сам посебе весит насколько килов, происходит связь с базой данных и заполнение полей из базы... Короче рядом с этим затрыты на dynamic_cast не видимы даже под микроскопом. 2)Снижение надежности Да ну ты брось фигня какая. 99% программы построено на статической типизации, а оставшийся пороцент будет громко материться при попытки поставить термометер в место уровнемера или математику для другого уровнемера. 3)Сложность Вот это совсем бред. После введения динамической типизации размер кода уменьшился в разы. Длл может экспортировать кучу классов Код: plaintext 1. 2. 3. 4. 5. Надеюсь понятно что надо сделать чтобы добавить новый класс... Короче не неси чушь типа того что гора кода которой может и не быть повысит надежность и понизит сложность системы. Ибо чем больше кода тем больше ошибок и тем больше сложность. Что касается производитнльности то пара наносекунд при инициализации ни от чего не спасут. Еще MaximE пытался доказавать что RTTI сосет но ему хватило пары постов чтобы понять что он не прав. Чтож ты такой упертый то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 10:03 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 WolfHound Ну ты прежде чем меня в упёртости обвинять, постинг-то прочти внимательно: ГВ> ...продолжаю настаивать на том, что а-к-т-и-в-н-о-е применение... Иными словами, я явно не твой "1%" имею ввиду. :) 1%, возможно, и не повредит сильно при достойном контроле. :)) Ну, опровергать дальнейшее, согласись, уже не имеет смысла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 11:03 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 WolfHound Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Пример на "скорую" руку. __uuidof работает для любых классов и структур. для не VC++ компиляторов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. А вообще можно придумать полно чего. И еще, когда в проект построен так, что в нем много маленьких классов, то выключение RTTI при компиляции уменьшает размер кода раза в два. Давайте не будем спорить - можно обойтись или нельзя без dynamic_cast. Я в свое время 4 года писал вообще на С, и ничего. Так что обойтись можно. Но кто хочет, пусть на здоровье пользуются. Но лично мне, увеличивать в два раза размер программы из 3-5 мест, где нужно динамическое приведение типа, неохота. Лучше я потрачу лишние 15 мин на имплементацию технологии типа QueryType. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 11:39 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 vdimas У меня такой ощущение что меня опять недооценивают :((( Тебя просветить во что выльется этот твой QueryType или поверишь на слово что гемороя будет много? К стати существуют упаковщики ехешников... А RTTI и шаблонные разбухания очень не плохо жмутся. К томуже обычно программы поставляются в виде инстольника который всеравно все пакует, а если учесть что сейчас винты мереють десятками гигабайт.... Вобщем отказ от RTTI не стоит того гемороя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 13:57 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
а вот если бы ссылки на литературку соответсвующюю кинули было бы вообще замечательно ... потому что для меня это почти темный лес , хоть и видел неоднократно . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 15:08 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Run Time Type Information (RTTI) - фича, позволяющая получать информацию о типе объекта во время выполнения программы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 16:08 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2funikovyuri Мне ? я имел ввиду по MFC ,STL литературу книжек у нас в далекой галактике таких не найти :( и еще ATL но енто хочу попозже изучать ... в COM технологи все вьехать толком немогу . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 16:37 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
не заморачивайся - все они мертвы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 16:55 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
всмусле ? кто мертвы зачем мертвы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 17:11 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
MFC скорее мертв чем жив. Теперь форточки модно на WTL писать ATL живее всех живых. STL будет жить пока жив С++, а помирать он и не собирается. Почитать можно статьи на RSDN Также полезно будет почитать описания книг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 18:40 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 JibSekart 2 funikovyuri Да никто не мёртв, все живы. :) А STL вкупе с boost ещё о-о-очень - о-о-очень долго никуда не денутся. 2 WolfHound У меня такой ощущение что меня опять недооценивают :((( Не кипятись. Ради единичных случае использования RTTI вполне можно обойтись подходом, изложенным vdimas, правда, ИМХО, с небольшим усложнением для поддержки распознавания: нужно добавить что-то вроде QueryInterface и аккумулятор указателей на реализованные интерфейсы в виртуальном базовом классе. Можно будет их даже "на ходу" включать/отключать, если очень захочется. 2 vdimas Страуструп не учитывает, однако, массовой деквалификации и "манагёризации" программистского сообщества, что неудивительно. А кроме того, "война платформ", которая одно время велась с открытым использованием C++ (библиотеки) сейчас ведётся со скрытым его использованием - те же Java и .Net как ты думаешь, на чём написаны? Ага, на нём самом. Вернее - Java, по-моему, в HP-шной реализации сделана на C++. Sun/Java вообще вся на plain-C. offtopic Мне вот очень интересно, кто же будет третьим игроком в противостоянии .Net - Java? Должен же появиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2003, 18:47 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
А третьим игроком будут макросредства, типа MS Access, PB, Lotus Notes, развитые до голосового ввода бизнез-рулз. :) Или докажем что то-то могём, или вымрем как динозавры. .NET тоже на C++ написана, микрософт исходники вывалила, можно полюбоваться. Гарбадж-коллектор оттуда - зело серьезная фишка. Интересно, его можно юзать вне .NET? :) Он там стек прочесывает на предмет поиска переменных в стеке, т.е. там нет счетчика ссылок на объект (обычно). Я насчитал 4 способа уборки мусора, когда просматривал. Кстати - он объекты в памяти двигает! Прикол? И все ссылки сохраняют целостность. Думаю эту фишку вне микрософт писали, уж больно академическая... Насчет MFC - я тут того, либу объектную писал, с 0-ля. Типа эксперименты. Быстродействие вышло гораздо выше, чем у ATL/MFC. И код маленький получается. Нинавижу обе технологии - наелся. Тупо и то и другое. И WTL не сильно сглаживает впечатление. Надо что-то типа System.Windows.Forms по стилю и принципам. MC++ не предлагать! :) Кто хочет поучаствовать в разработке GUI-либы для Win32 на C++? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 08:21 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2vdimas: а чем тебе MC++ не нравится?( без шуток - мне действительно интересно ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 08:44 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2vdimas: не пытайся изобрести велосипед. Потеряешь год-два просто так. Лучше изучи что-нибудь стоящее (тот-же WTL). Рукоблудных GUI библиотек - море. На RSDN есть, по крайней мере, две. Так что эта идея не оригинальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 11:11 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
ну, когда говорю про MC++ то имею ввиду __gc и __value классы. К этим классам неприменимо ничего интересного из C++, на них действуют такие же ограничения, как на классы C#. Можно прочитать отличия MC++ от С++ в MSDN. напр. 1. __gc классы можно наследовать только от __gc классов 2. Множественное наследование позволительно только в виде множественного наследования __interface. 3. забыдь про шаблонные классы и функции. 4. вместо статического приведения типов используй динамический dinamic_cast<>(), при той же сигнатуре он работает по-другому для .NET классов, хотя его смысл остается прежним. 5. __gc классы можно создавать только по new, __value классы создавать по new бесполезно. Я бы использовал MC++ как "связку" c .NET или wrapper, т.к. MC++ класс все же позволяет хранить обычные (не .NET) типы. Т.е. твой чистый С++ класс может быть мембером __gc класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 11:16 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2vdimas: Сейчас рулит идея, что ООП себя не оправдало в смысле повторного использования кода и в данный момент модно говорить о компонентном подходе. А в этой области C++ никаких средств не предоставляет - т.е. развивается не адекватно требованиям. С другой стороны MS и SUN - которые предоставляют развитую инфраструктуру/среду выполнения и динамично развивающиеся языки/средства разработки. Никто никогда не говорил о слобой выразительности C++ - говорили о другом. В частности о его сложности и противоречивости. Оказалось что сам язык сейчас значит далеко не все. Т.е ты же сам знаешь что если сказать что пишешь на C++ - обязательно спросят на чем именно - т.е. среда разработки/выполнения, подходы и т.д. Насчет MC++ - все верно! Остается надеятся, что MS не бросит 1.5 млн разработчиков и наконец обеспечит полную поддержку C++ в CLR. И в принципе работы в этом нарпавлении вроде ведутся - например в VS С++ 2003 было много чего добавлено( в частности partial templates и дизайнер Win Forms ). Если бы они добавили еще и поддержку templates и множественного наследования в CLR !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 11:36 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 funikovyuri Если бы они добавили еще и поддержку templates и множественного наследования в CLR !!! МН в .Net скорее всего никогда не будет, очень много придётся ломать, да и Smalltalk-подобной концепции абстрагирования это очень противоречит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:03 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2Геннадий Васильев: насчет множественного наследования - не знаю и врать не буду. Но вот добовить шаблоны они почти официально обещали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:28 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 alexey_1979 Желание "рукоблудить" пришло давно, по мере изучения внутренних принципов работы MFC/ATL/WTL. На большинство приходящих в обычной работе собощений Windows, в этих библиотеках происходит следующее: 1. reflection всех Notifications 2. PretranslateMessage вдоль по всей иерархии окон. 3. Поиск объекта в MAP-ах по хендлеру. 4. линейное "прочесывание" message maps классов в ответ на КАЖДОЕ ПРИХОДЯЩЕЕ СООБЩЕНИЕ. В моей либе среднее время обработки сообщения примерно на порядок меньше. Да, очень много материала из ATL и WTL можно использовать вне проектов одноименных типов. (всякие EditImpl + тонна вспомогательных полезных классов и утилит) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 17:08 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Не нужно еще забывать про такую вещь, как TrollTech QT. Хотя я почти уверен, что большинство из Java и C# обожателей про это даже не слышали. Очень даже неплохая библиотека классов (много лучше MFC), плюс - многоплатформенность, отражение (!!), визуальный редактор форм. Но цена!!!! :((( Правда, есть бесплатная некоммерческая версия - но для Windows не очень свежая :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2003, 11:40 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2Vdimas я бы рад поучавтсвовать в создании гуи либы, но... время маловата, кое-что начал писать для себя, но потом подумал, может взять существующие... амулет тот же или гтк или кутэ... желательно чтоб кросс-платформенность присутствовала... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2003, 10:20 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Возражения : 1. Все "в пользу" имеют ограниченную область применения. Например, сборка мусора в Java иногда полезна, иногда вредна. Кому не приходилось сидеть и ждать, пока runtime не закончит сей процесс. Хуже библиотек чем в Java я вообще не видел. итп. 2. > Для С++ можно использовать технологию COM для аналогичных целей. Для каких ? Для сборки мусора ? Здесь что-то не так. > Какой процент классов в реальном приложении на Java и C# использует reflection Какая разница, какой процент ? Это вопрос проектирования. >Язык Java не люблю до сих пор, может быть в этом дело ? >Самый-пресамый интересный момент. Действительно, интересный. Фактически автор утверждает, что на С++ все пишут неправильно, кроме самого автора. Я не спорю, возможно это даже верно, но это ни в коем случае не является аргументом ЗА. Может быть вопрос поставить так : если все пишут неправильно, может что-то не так с языком ? (а что не так - в Java есть общий предок для всех объектов, а в С++ нет, отсюда описанная проблема) > Языки типа Java и C# изначально по своим возможностям являются подмножествами языка С++ Утверждать это - само по себе неграмотно. В строгом смысле слова "подмножество языка" это когда мы можем скомпилировать программу на подмножестве компилятором для надмножества, возможно с косметическими изменениями. >При желании, и наличии единомышленников, можно попытаться собрать некий framework, на основе этого самого материала, вместо того, чтобы каждый раз писать новый. У самого есть масса наработок, которые надо бы классифицировать, сделать легкий рефакторинг и (я надеюсь, с удовольствием) использовать. >Кто за - поднимите руки! Я - за. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2003, 16:28 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
А кто может что сказать на VC++ оптимальнее код получается ? чем на BC++ ?? проверять самому неохота ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2003, 16:35 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2vdimas: [q] 1. reflection всех Notifications [/q] Оказ от этого заметно усложнит реализацию и использование. [q] 2. PretranslateMessage вдоль по всей иерархии окон. [/q] Не понял? Если тебе не нравиться, что нужно вызывать m_view.PreTranslateMessage и PreTranslateMessage CMainFrema, то как реализовать, чтобы он автоматом вызывался? А если мне не нужен PreTranslateMessage во вью? Макрос. Опять усложнение. [q] 3. Поиск объекта в MAP-ах по хендлеру. [/q] Чаво? MAP разворачивается в большой if then else. Это самое эффективное в данной ситуации. Ты же не будешь создавать массив обработчиков на несколько тысяч элементов для того, чтобы обработать пару сообщений. Альтернатива чуть по медленее была в реализована в MFC. Но это, ИМХО, полная лажа. Тяжело и не продуктивно. [q] 4. линейное "прочесывание" message maps классов в ответ на КАЖДОЕ ПРИХОДЯЩЕЕ СООБЩЕНИЕ. [/q] См. предыдущий ответ. Если у тебя есть конкретные предложения, милости просим в форум ATL/WTL на RSDN. Я сам не проч заняться созданием более продуманного фрейморка для GUI аплитух, но только 1. После выхода wtl7.1 2. После изучения и выявления недостатков всех существующих аналогов. Твой пост, уж прости, на подробный анализ, походит очень отдаленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2003, 18:27 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Yossarian Может быть вопрос поставить так : если все пишут неправильно, может что-то не так с языком ? (а что не так - в Java есть общий предок для всех объектов, а в С++ нет, отсюда описанная проблема) Однако, если те, кто "пишет правильно" добивается хороших результатов, то логично ведь предположить, что те, кто их не добился - пишут неправильно. Ну или, скажем так, не в полной мере используют возможности языка. Так что, увы, на C++ действительно часто и много пишут неправильно. Порой ещё и агрессивно защищая достаточно примитивный стиль и прочее. И ещё. То, что все не могут в чём-то разобраться - это их собственные проблемы, а не того конкретного артефакта, в котором они не могут разобраться. ИМХО, из этой простой посылки и следует исходить. :) Знаешь, порой действительно оказывается, что все ошибаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2003, 03:52 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 alexey_1979 Меня можно смело считать еретиком, потому как: 1. reflection всех Notifications Оказ от этого заметно усложнит реализацию и использование. А я порой не использую встроенные классы окон, типа "Button", "ComboBox", "ListBox", т.к. имею с 0-ля написанные ООП-аналоги. И мне не нужен Reflection, достаточно наследования для переопределения СВОИХ СОБСТВЕННЫХ свойств или поведения. 2. PretranslateMessage вдоль по всей иерархии окон. Не понял? Если тебе не нравиться, что нужно вызывать m_view.PreTranslateMessage и PreTranslateMessage CMainFrema, то как реализовать, чтобы он автоматом вызывался? В том то и дело, что не понял. НЕ ДОЛЖНО БЫТЬ НИКАКОГО PretranslateMessage вдоль по всей иерархии окон. Это как хук по смыcлу, т.е. "черный вход", т.е. слабость самой модели. В своем GUI оно мне ПРИНЦИПИАЛЬНО не нужно! 3. Поиск объекта в MAP-ах по хендлеру. Чаво? MAP разворачивается в большой if then else. Это самое эффективное в данной ситуации. Ты же не будешь создавать массив обработчиков на несколько тысяч элементов для того, чтобы обработать пару сообщений. Вот пример расточительного использования возможностей языка. if-else, понимаешь... Загляни в файлы с описанием WM_XXXX, сколько там реальных сообщений? (я спрашиваю именно про общие сообщения, всякие EM_XXXX не берем, потому как в моей модели их НЕТ). Так вот, там чуть больше 200 реально используемых сообщений. Слушай внимательно: В моей модели я использую всего только 3 класса окон: простой контрол, контрол-контейнер, форма. Все! Большинство сообщений (99.99% из общего приходящего потока) в своей оконной процедуре просто достают адрес объекта из самомого экземляра МОЕГО класса окна (а не из многотысячного ATL/MFC MAP-а) и переходят сразу на функцию из таблицы. Т.е. у меня примерно 200 функций-обработчиков. Очень простых функций. Каждая функция-обработчик просто вызывает виртуальную функцию объекта! Поэтому у меня нет "прочесывания" MAP-ов на предмет поиска сообщений или на предмет if-else. Почему же мне потребовалось 3 класса окна? Все эти классы оперируют одними и теми-же процедурами, просто используют разный их набор в своем массиве указателей на функции-обработчики. Самый младший из них - "контрол" просто игнорирует приличную часть сообщений, для него не предназначенную, чтобы не вызывать лишний раз виртуальную функцию, т.е. определив всего еще 2 таблицы из 200 элементов я получил дополнительное повышение эффективности. Разработчик может наследовать свой GUI-элемент от Control, ControlContainer и Form - классов, используя разные базовые классы для требуемого множества перехваченных сообщений. Повторюсь - у меня все работает примерно на порядок быстрее, чем MFC/WTL. В этих библиотеках на каждое приходящее сообщение происходит тонна всяких бесполезных вызовов, у меня - не происходит ничего (вызов одной виртуальной функции и то не всегда, см. Control, ControlContainer, Form). Если у тебя есть конкретные предложения, милости просим в форум ATL/WTL на RSDN. ok. Только насколько это приятно - обсуждение тонкостей - если немного тошнит от самой концепции. Правда, в своих коммерчесских разработках я пока использую WTL или MFC, потому как мой фреймворк требует разработки аналогов всех контролов (!!!). Однако, посмотрите что твориться с C#! Не успел толком выйти, как под него народ уже написал тысячи и тысячи контролов. Почему? Да потому, что там нужно просто отнаследоваться и переопределить несколько виртуальных функций - это на порядок проще, а главное - на порядок типобезопаснее, чем MESSAGE_MAP-ы. В моей либе - та же самая ситуация. Написать новый контрол так же легко, как на C#. Поэтому и приглашаю единомышленников. Программируя на MFC/WTL я изучил WinAPI практически наизусть. А не пошел бы он... Очень смешно - программируешь на ООП-библиотеке, при этом думаешь понятиями OS API. У меня сообщения Windows "спрятаны" в самых базовых классах и о них можно забыть - это тонкости конкретной платформы. Я сам не проч заняться созданием более продуманного фрейморка для GUI аплитух, но только 1. После выхода wtl7.1 2. После изучения и выявления недостатков всех существующих аналогов. Изучал QT и WxWindows. QT - весьма оторвана от чего бы то ни было, в то время как моя либа обладает общей событийной моделью для всех классов, а не только для GUI. Т.е. у меня событие (не сообщение!) может получить экземпляр какого угодно класса (как в C#) и даже просто CallBack - функция (как только в С++) WxWindows - сильно, весьма... Но хочется сильнее :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2003, 22:52 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Фурников Юрий Сейчас рулит идея, что ООП себя не оправдало в смысле повторного использования кода и в данный момент модно говорить о компонентном подходе. Если под компонентным подходом ты подразумеваешь открытые "чисто"-виртуальные интерфейсы, т.е. всего лишь "побочный" эффект множественного наследования. В .NET и Java, наряду с открытыми "голыми" интерфейсами так же рулит идея открытых базовых классов - это все одного поля ягоды... Никто никогда не говорил о слобой выразительности C++ - говорили о другом. В частности о его сложности и противоречивости. Сложность - да. Но без некоторой сложности не добиться некоторой выразительности. Слабый аргумент, особенно в эпоху насыщения рынка программистами. Кто не тянет - нафиг из области. Оказалось что сам язык сейчас значит далеко не все. Т.е ты же сам знаешь что если сказать что пишешь на C++ - обязательно спросят на чем именно - т.е. среда разработки/выполнения, подходы и т.д. К счастью компиляторы "движуться" на встречу друг-другу, вернее навстречу стандартному С++. Свои программы я обычно компилю на VC.NET и GCC для пущей переносимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2003, 23:03 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Yossarian > Для С++ можно использовать технологию COM для аналогичных целей. Для каких ? Для сборки мусора ? Здесь что-то не так. > Все так, и то и другое - подходы к контролю времени жизни объектов. И там и там используется общий смысл - объект уничтожается тогда, когда на него никто больше не ссылается. >Язык Java не люблю до сих пор, может быть в этом дело ? А может, все же, яйцо раньше курицы... :) >Самый-пресамый интересный момент. Действительно, интересный. Фактически автор утверждает, что на С++ все пишут неправильно, кроме самого автора. Нет. В том же посте ниже я приводил причину большого размера программ - это недостаточность существующих библиотек. При ПРОЧИХ РАВНЫХ условия программа на С++ обычно никак не меньше аналогов на Java или C#. (а что не так - в Java есть общий предок для всех объектов, а в С++ нет, отсюда описанная проблема) Попал в точку! Почти... Для всех объектов мне и не нужен один базовый класс, а вот для всех Exception - крайне необходим! Я бы запретил выброс Exception произвольного типа на уровне языка (фанаты С++ - не бейте), а оставил бы только унаследованные от некоторого одного класса (компилятор -> конкретный класс - не очень красивая связка, однако typeid использует тот же подход) > Языки типа Java и C# изначально по своим возможностям являются подмножествами языка С++ Утверждать это - само по себе неграмотно. В строгом смысле слова "подмножество языка" это когда мы можем скомпилировать программу на подмножестве компилятором для надмножества, возможно с косметическими изменениями. Именно так. Все вполне грамотно. (если, опять же, не иметь ввиду Reflection) Я - за. :)) угу, т.е. С++ все-равно умирать не собирается! (а иначе на чем будут .NET - фреймворки писать?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2003, 23:23 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
в предыдущем посте читать: >Самый-пресамый интересный момент. Действительно, интересный. Фактически автор утверждает, что на С++ все пишут неправильно, кроме самого автора. Нет. В том же посте ниже я приводил причину большого размера программ - это недостаточность существующих библиотек. При ПРОЧИХ РАВНЫХ условия программа на С++ обычно никак не больше аналогов на Java или C#. Да и с мнением Геннадия Васильева согласен - многие пишут так себе. В основном это то поколение, которое выросло на всяких Wizard-ах. (хотя, бывают исключения, у меня есть знакомый парень, 22 года, удивительно правильно мыслит и кодит). www.codeproject.com - полно материала для подобного исследования. Порой там встречаются очень неплохие вещи, но большей частью - всякая ерунда. Материалы на сайте позволяют оценить средний уровень современного программиста. Это может и хорошо, что есть Java и C#. Кому С++ кажется слишком сложным - просим туда. Не представляю грамотного С++-ника, который бы полностью разменялся на Java или C#. Я вот практически в совершенстве VB и VBScript знаю - писал несколько гибридных проектов, "стыковался" с ними при помощи COM. И что с того? VB-рулез? Теперь активно изучаю .NET и C#, но "дно" уже видно. После изучения исходников .NET-а, и двоичного формата .NET-объектов, для меня вообще никаких интересных моментов относительно .NET не осталось. Мне откровенно импонирует язык C#, там где я раньше использовал VB, теперь буду использовать только его (учитывая беспланую VSA-engine). Но это все рассматриваю только как неплохое дополнение, которое очень экономит время в некоторых случаях. Просто полно ситуаций, когда на Java или C# поставленную задачу НЕВОЗМОЖНО РЕШИТЬ. Потому от С++ никуда не деться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2003, 23:52 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Любителям Delphi:\r \r Обратите внимание, народ 2 недели пишет DBImage - компонент (6-й пост и ответ тигра в 11-м)\r \r /topic/45348\r \r Очень показательно.\r На с++ это примерно за пол-дня делается, если не за 2 часа... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2003, 01:11 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Давайте уж мухи отдельно, котлеты отдельно. Проблема с DBImage - проблема VCL, а не Delphi в целом. Можно ту же VCL на C++ перелопатить, но лучше от этого она не станет. Реально проблема лишь в том, что методы записи/чтения изображения в базу не виртуальны, сиречь переопределению не подлежат. Если бы было одно лишнее слово в определении : virtual, то и постов по этому поводу многочисленных повсюду бы не было... А так, в сухом остатке, примерно 60% времени ушло на копание исходников VCL, 25% на кодирование пробных непрошедших тестирование решений, 15% на создание итогового решения. А вообще-то, просто абсолютное большинство пользователей Delphi не заморачивается таким компонентом, а просто делает Copy+Paste кусков внешнего кода, реализующих запись/чтение в базу. Это делается гораздо быстрее, примерно минут за 15 написание первого куска, а потом по 1 мин. на Ctrl-C, Ctrl-V :-) Это уж мы, привыкшие к приличной архитектуре, объектному подходу и т.д. извращаемся... поскольку проект позволяет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2003, 11:43 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
чтобы с++ не умер, нужно на нем программировать :-) народ, посоветуйеи кроссплатворменную библиотек классов для гуи, пожалуйста... хочу писать переносимые приложения :-) хотя бы вин32-Хвин начал писать сам, понял что геморно, хотя вполне реально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2003, 12:13 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 alex_k WxWindows, в и-нете с пол-пинка найдешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2003, 19:17 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
нашел, спасибо :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2003, 19:35 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2Vdimas что-то больно громоздкая вешь эта wxWindows 45 мег исходники, которые нужно сначала скомпилить... в общем я скомпилить не смог :-) по прощще ничего нету? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2003, 21:30 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
На чем компилишь? Лучше потрать пару дней на изучение и компиляцию - это все вознаградится. Там не только GUI-либа. Еще тонна полезного материала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2003, 23:04 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
ну... потрачу, наверное... я скачал dev-cpp прикрутил к нему mingw, импортировал проект вижлстудии и попытался скомпилить.... миллионы варнингов и тысячи ошибок... ну и хер с ним, попробую реадми почитать :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 02:24 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
to: alex_k www.fox-toolkit.org юзаю уже больше года. удобнее и компактнее пока ничего не нашел, хотя перерыл кучу кросс-платформных гуи. При разработке, даже на мастдае, испроьзуются принципы X-ов (виджиты, мультипоточная обработка событий ...) сорцы - всего 3 метра. но есть все необходимое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 05:56 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Спасибо за ссылку... посмотрю, пока думаю мне просто не хватает скиллов, для подобного рода работы. Если уж я скомпилить либу не могу :-) разбираюсь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 06:26 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Если под компонентным подходом ты подразумеваешь открытые "чисто"-виртуальные интерфейсы, Под компонентным подходом я понимаю именно компонентный подход - это не только интерфейсы( точнее это не абстрактные класса ). Вообще, интерфейс получил такое широкое распространение как точка входа! Это важная деталь - так как изначально у абстрактных классов было иное назначение Сложность - да. Но без некоторой сложности не добиться некоторой выразительности. Слабый аргумент, особенно в эпоху насыщения рынка программистами. Кто не тянет - нафиг из области. Ни капельки не слабый - если что-то можно сделать проще - это надо делать проще! Опять же подчеркну - я не противник C++ - как раз наоборот - но он слишком статичен - особенно в эпоху насыщения рынка К счастью компиляторы "движуться" на встречу друг-другу, вернее навстречу стандартному С++. Не замечал особого движения - они даже ANSI C++ по разному поддерживают - не говоря о всяких расширениях языка, присутсвующие в каждом компиляторе. Чтобы охладить оптимизм стоит пойти на www.boost.org или www.stlport.org и посмотреть таблицы совместимости этих библиотек с наиболее распространенными компиляторами - и это при том что их создатели используют только стандартный C++! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 08:52 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 vdimas: Изучал QT и WxWindows. QT - весьма оторвана от чего бы то ни было, в то время как моя либа обладает общей событийной моделью для всех классов, а не только для GUI. Т.е. у меня событие (не сообщение!) может получить экземпляр какого угодно класса (как в C#) и даже просто CallBack - функция (как только в С++) Не совсем понял это высказывание. Поподробнее можно? В Qt, насколько мне известно, модель слот/сигнал тоже не привязана именно к GUI. Вставил в список базовых классов QObject (он не имеет отношения к GUI), пару макросов в определение и можешь определять свои слоты и сигналы (какие угодно). То что слоты и сигналы отделены от обычных методов мне кажется достоинством, зачем лишняя путаница? Хотя собственно никто не запрещает вызывать слоты как обычные методы. На мой взгляд, недостаток Qt не в этом, а вобщей тормознутости. То же связывание сигналов и слотов. Это что-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 09:54 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Геннадий Васильев : Y> Может быть вопрос поставить так : если все пишут неправильно, может Y> что-то не так с языком ? (а что не так - в Java есть общий предок для всех Y> объектов, а в С++ нет, отсюда описанная проблема) ГВ> Однако, если те, кто "пишет правильно" добивается хороших результатов, ГВ> то логично ведь предположить, что те, кто их не добился - пишут неправильно Но те, кто "пишет правильно" на Delphi, Java, OCAML, FORTRANe, тоже добиваются хороших результатов. Следовательно, если соотношение "плохих"/"хороших" программистов не в пользу С++, можно сделать вывод, что этот язык не поощряет хорошие практики программирования. Я бы не настаивал на безусловной справедливости этого вывода, но обратное совершенно точно неверно. 2vdimas >>> Для С++ можно использовать технологию COM для аналогичных целей. >>Для каких ? Для сборки мусора ? Здесь что-то не так. >Все так, и то и другое - подходы к контролю времени жизни объектов. И там и там используется общий смысл - объект уничтожается тогда, когда на него никто больше не ссылается М-да... я даже не знаю, что сказать. Это два совершенно разных алгоритма, даже скажем - два совершенно разных подхода к организации памяти. И говорить что это одно и то же это или передергивание или какое-то чудовищное ламерство. Подход COM мало отличается от общего подхода C++ (насколько я помню, у Страуструпа в книге есть пример класса с подсчетом ссылок). Тогда как сборка мусора - это механизм языка, причем его невозможно реализовать в С++ на уровне кода в общем виде. >>> Языки типа Java и C# изначально по своим возможностям являются подмножествами языка С++ >>Утверждать это - само по себе неграмотно. В строгом смысле слова "подмножество языка" это когда мы можем скомпилировать программу на подмножестве компилятором для надмножества, возможно с косметическими изменениями. >Именно так. Все вполне грамотно. (если, опять же, не иметь ввиду Reflection) Скомпилируйте любую реальную программу на Java любым компилятором С++. Сообщите, пожалуйста о результатах. Я настаиваю на том, чтобы Вы это сделали. Гг. ! Я не против С++, я не за С++. Это один из языков, не лучший и не худший; его надо знать любому серьезному программисту. Также я считаю очень правильной идею создания наборов "правильных" библиотек для С++. Но я категорически против передергивания, подмены понятий и всяческого вранья как "за" так и "против". Поймите, рассуждая на уровне "круто-не круто" или смешивая подсчет ссылок со сборкой мусора вы никогда не освоите программирование. Компьютеру глубоко пофиг ваши переживания и эмоции. Надо объективно подходить к вопросу. Delphi лучше C++ тем-то и тем-то. C++ лучше Delphi тем-то и тем-то. А рассуждения о том, что одни отличия "несущественны", а другие "доказывают превосходство" давайте оставим ламерам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 10:35 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Yossarian Боже, до чего буквальный товарищ... Будем жевать: >>> Для С++ можно использовать технологию COM для аналогичных целей. >>Для каких ? Для сборки мусора ? Здесь что-то не так. >Все так, и то и другое - подходы к контролю времени жизни объектов. И там и там используется общий смысл - объект уничтожается тогда, когда на него никто больше не ссылается М-да... я даже не знаю, что сказать. Это два совершенно разных алгоритма, даже скажем - два совершенно разных подхода к организации памяти. И говорить что это одно и то же это или передергивание или какое-то чудовищное ламерство. Подход COM мало отличается от общего подхода C++ (насколько я помню, у Страуструпа в книге есть пример класса с подсчетом ссылок). Тогда как сборка мусора - это механизм языка, причем его невозможно реализовать в С++ на уровне кода в общем виде. Во-первых, я именно и сказал, что используются разные подходы. Но не о подходах речь, а о самой возможности автоматизировать процесс контроля за временем жизни объектов. Повторить? Какой там нафиг один пример у Страуструпа? Существует масса способов контроля за временем жизни. В том числе и точно такой, какой использован в Java (гарбэдж-коллектор). Слово smart-pointer тебе что-нибудь говорит? А способ ссылаться на объектны по хендлерам тебе известен? Если да, то как понимать твое скоропостижное заявление, что его невозможно реализовать в С++ на уровне кода в общем виде. Не только можно, но и НУЖНО, если хочешь добиться лаконичности своих программ и не желаешь иметь утечки памяти. Скомпилируйте любую реальную программу на Java любым компилятором С++. Сообщите, пожалуйста о результатах. Я настаиваю на том, чтобы Вы это сделали. Мы сегодня плохо спали? Или плохо читали? Можно на С++ писать программу один-в-один (так, кажется, было сказано). Т.е. задаем некое правило ОДНОЗНАЧНОГО отображения типов и конструкций языков, и переводим! Очень даже легко (про рефлекшн я уже оговаривался). Объектные переменные в Java - суть ссылки. Все интерфейсы и классы по умолчанию унаследованы от Object. Вот и делаем в С++ так же: (из моей реальной программы) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. DEF_OBJECT - это макрос, который определяет типы - объектные ссылки. Заметь, new стоит, а delete отсутствует. Это один из языков, не лучший и не худший; его надо знать любому серьезному программисту. Ну писал я одно время на Delphi, потому как пока не вышел VC 5.0 работать толком было не на чем. Этот дельфи по возможностям языка сейчас серьезно отстает даже от VB.NET. Так что, о чем речь? Поймите, рассуждая на уровне "круто-не круто" или смешивая подсчет ссылок со сборкой мусора вы никогда не освоите программирование. Да уж, глубокомысленно... А не приходило в голову узнать, как этот гарбэдж-коллектор работает, чтобы потом чепуху с умным видом не нести? И сколько там подходов используется? Кстати, в одной из реализаций Java VM используется именно грубый подсчет ссылок!!! В более-менее серьезных - обычно используется несколько способов. Гарбадж-коллектор от .NET - вообще чудо современной техники. Никто ничего не путает. С помощью специальных ссылочных типов (смарт-поинтеров), я смогу реализовать ЛЮБОЙ способ контроля за временем жизни. (например, использовать .NET-овский). Выбирай на вкус. И не пугай население. В С++ действительно можно практически все. А вот эти строки: ГВ> Однако, если те, кто "пишет правильно" добивается хороших результатов, то логично ведь предположить, что те, кто их не добился - пишут неправильно пожалуй, повторю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 11:37 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 funikovyuri Под компонентным подходом я понимаю именно компонентный подход - это не только интерфейсы( точнее это не абстрактные класса ). Вообще, интерфейс получил такое широкое распространение как точка входа! Это важная деталь - так как изначально у абстрактных классов было иное назначение Так. С этого места, поподробнее, если можно... Какое иное назначение? Идея компонентов - COM объектов - выросла из чистого C++-ного абстрактного базового класса. Для того, чтобы это действительно стало компонентами, существует OLE/OLE2, набор типов данных интерфейсов, протоколов и поддерживающего фреймворка. Компоненты Java Been - вообще историческое недоразумение. Для того, чтобы свойство объекта стало "компонентным", оно должно "правильно" называться. Умора. Опять же подчеркну - я не противник C++ - как раз наоборот - но он слишком статичен - особенно в эпоху насыщения рынка Java вышел где-то в 1992 (или даже раньше). С тех пор спецификация языка практически не претерпела изменений. С++ с тех пор изменился до неузнаваемости (правда, в лучшую сторону). И продолжает развиваться. Это один из наиболее динамично развивающихся языков. К счастью компиляторы "движуться" на встречу друг-другу, вернее навстречу стандартному С++. Не замечал особого движения - они даже ANSI C++ по разному поддерживают - не говоря о всяких расширениях языка, присутсвующие в каждом компиляторе. Я же не сказал встретились , но ситуация с выходом VS.NET стала весьма обнадеживающей. Я компилю свои проги под VS.NET и под GCC без изменений!!! Категорически протестую против применения расширений языка! :) правда от некоторых, платформенно зависимых (типа __declspec(dllexport) ) не уйти, но эти ситуации легко изолировать макроподстановками. Чтобы охладить оптимизм стоит пойти на www.boost.org или www.stlport.org и посмотреть таблицы совместимости этих библиотек с наиболее распространенными компиляторами - и это при том что их создатели используют только стандартный C++! на этой странице полезно взглянуть в самый конец . Выводы делаем сами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 12:05 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
MetaCommunications Engineering. //boost.sourceforge.net/regression-logs/cs-win32_metacomm.html и что видим - единственный компилятор, прошедший все тесты - VC 7.1!!! //К стати днем раньне у Beman Dawes http://boost.sourceforge.net/regression-logs/cs-win32.html получились немного другие результаты А насчет абстрактных классов... здесь нельзя спорить - но на мой взгляд вначале это был просто класс, а не уровень абстагирования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 14:38 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Yossarian ГВ> Однако, если те, кто "пишет правильно" добивается хороших результатов, ГВ> то логично ведь предположить, что те, кто их не добился - пишут неправильно Но те, кто "пишет правильно" на Delphi, Java, OCAML, FORTRANe, тоже добиваются хороших результатов. Следовательно, если соотношение "плохих"/"хороших" программистов не в пользу С++, можно сделать вывод, что этот язык не поощряет хорошие практики программирования. Я бы не настаивал на безусловной справедливости этого вывода, но обратное совершенно точно неверно. :) Ага, те, кто добивается хороших результатов на Java, Delphi (...) - пишут правильно на этих языках (наверное ;) ). Но ведь это никак не влияет на их (и не только их!) умение писать на C++. Весьма спорным представляется также ссылка на "...хорошие практики программирования". Что это такое? И почему факт достижния хорошего результата с использованием Delphi связывается с использованием хороших практик программирования? Рискну предположить, что этим термином обозначается некоторое структурирование кода, архитектура и т.п. Но как раз таки порог, при котором становится критичным применение "хороших практик" (и следовательно, соответвующая мозговая активность ;) ) при использовании здоровущих интегрированных сред типа Delphi отодвигается , т.е., условно говоря, можно написать хорошую программу совсем не применяя этих самых практик. А что? Затолкали в OnClickSuperButton() гору кода, чем нарушили целую гору принципов структурирования и привет: всё работает! Вместо LSP-compliant решения влепили анализ типа входного объекта (Java) и опять всё работает! Где же здесь поощрение хорошей практики? :)) Так что, ИМХО, твоё утверждение не только спорно, но ещё и безосновательно. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2003, 21:58 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Геннадий Васильев > Ага, те, кто добивается хороших результатов на Java, Delphi (...) - пишут правильно на этих языках (наверное ;) ). Но ведь это никак не влияет на их (и не только их!) умение писать на C++. Весьма спорным представляется также ссылка на "...хорошие практики программирования". Что это такое? >Так что, ИМХО, твоё утверждение не только спорно, но ещё и безосновательно. :( Давайте говорить о сопостовимых вещах: если сравнивать, то не Delphi с C++, а паскаль с C++. Паскаль искуственно навязывает хороший стиль программирования, он для этого и был придуман - обучать людей программировать, и последнее есть медицинский факт. За это приходится платить удобством: на C/C++ почти все можно сделать более компактно. Но если человек учился программировать на паскале (да при этом еще книжки и читал), то у него скорее всего (но не обязательно) будет то, что называется правильный стиль, в том числе и на C/C++, фортране и басике. А C/C++ хороший стиль не навязывает, но и не запрещает, он создавался из расчета на опытных людей как язык решения прикладных задач. Зато кода получается меньше чем в паскале. Отсюда не следует, что все начинавшие программировать с языка C программируют в неправильном стиле, наверное можно привести контрпримеры в обоих случаях. Но я лично не встречал ни одного хорошего прогограммиста, начинавшего только с C (а плохие встречались), в то же время знаю многих хороших специалистов, начинавших с паскаля. Хотя встречались и плохие. Т.е. умение программировать на паскале влияет на умение программировать на C/C++. Так что утверждение Yossarian -а ИМХО абсолютно обосновано. >"...хорошие практики программирования". Что это такое? В качестве базового пособия по освоению хорошей практики можно предложить: Н.Вирт, Алгоритмы + Структуры Данных = Программы, Москва "МИР", 1985, 404с. Почитай, пригодится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2003, 02:29 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
c127 Давайте говорить о сопостовимых вещах: если сравнивать, то не Delphi с C++, а паскаль с C++. Паскаль искуственно навязывает хороший стиль программирования, он для этого и был придуман - обучать людей программировать, и последнее есть медицинский факт. OK, согласен, логичнее сопоставить C++ и Object Pascal. Но вот с тем, что Паскаль навязывает хороший стиль программирования я не совсем согласен. Да, по сравнению, например с С, он требует более жёсткой типизации, да, на его примере обучают структурированию реализации идей и в сущности, неплохо обучают. Однако остаётся вопрос о средствах структурирования и об их применимости на практике. И здесь, ИМХО, ответ отнюдь не в пользу Pascal/Object Pascal. Как минимум, таких мощных средств как множественное наследование реализаций и шаблоны этот язык лишён (поравьте меня, если я ошибаюсь). Также, как лишена его и Java. Отсюда раньше или позже в реальных условиях возникает проблема эффективности процесса разработки. Я не буду утверждать, что эта проблема всегда принимает критический характер, но всё таки. Дальше, как логичное следствие, возникают нарушения хороших практик, которые сами по себе входят в "нормальную" практику. То же самое приведение типа "сверху вниз" и т.п. С другой стороны, конечно, можно и на Object Pascal не допустить подобных нарушений, например, повсеместно используя интерфейсы (или методы с модификатором abstract, сам когда-то занимался этим ещё на Turbo Pascal 5.5-7.0), но плата за это - потеря эффективности исполнения и увеличение длительности разработки. Т.е., O.Pascal/Java на самом деле при практическом использовании нередко провоцируют нарушения принципов "правильного" проектирования, поскольку опять таки нередко ставят программиста в условия, где сочетание: а) сильной согласованности исходных текстов при их глубокой структурированности; б) эффективности исполнения; в) скорости разработки становится практически недостижимым, тогда как C++ эти задачи блестяще (оговорюсь: на фоне остальных) решает. Но! Решает только при адекватном подходе к разработке, который, ИМХО, является логичным продолжением подхода, каковому обучают на примере Pascal. Т.е. умение программировать на паскале влияет на умение программировать на C/C++. Естественно, согласен, но только когда умение сие развивается до того, что начинает логично применять концепции C++. Развитие же в "обратном направлении", т.е., сознательный переход с C++ на O.Pascal, ИМХО, является свидетельством определённого рода деградации. PS. За ссылку, конечно, спасибо, только я её уж лет десять как прочёл. PPS. Вот, тоже рекомендую: Б. Лисков, Дж. Гатэг, Использование абстракций и спецификаций при разработке программ, М. Мир - 1989, 424 c. ISBN 5-03-000489-0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2003, 06:37 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Всех, у кого есть нормальный "спортивный" интерес, отсылаю к библиотеке Loki. Поверьте, те кто пишут на С++ в большинстве своем имеют приличную практику на pascal-e (Turbo-Pascal и Delphi наверное никого стороной не обошли :) ), т.е. мы вполне адектватно можем сравнивать эти языки. А сравнивать там практически нечего. На С++ можно писать в pascal-стиле, если ничего "интересного" не использовать. И получим тогда функциональный эквивалент . А вот когда начинаешь использовать именно идиомы языка, то pascal просто остается стоять, где стоял, тогда как С++ уноситься в "заоблачные" дали. (поэт, однако...) :) Просто всем тем, кто любит Delphi, но при этом немного разбирается в С++ советую внимательно рассмотреть библиотеку - она небольшая. Надеюсь, многим будет интересно (а многие так и просто опупеют). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2003, 08:27 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Геннадий Васильев >OK, согласен, логичнее сопоставить C++ и Object Pascal. Но вот с тем, что Паскаль навязывает хороший стиль программирования я не совсем согласен. Я не очень хорошо знаю Object Pascal, по-моему паскаль сильно испортили, пытаясь подогнать под современную тогда ОО концепцию. Но чтоб на классическом (не ОО) паскале писать неправильно, нужно очень стараться. Гораздо проще и компактней писать правильно: с соблюдением структуры, объявлением правильных типов и т.д. >Да, по сравнению, например с С, он требует более жёсткой типизации, да, на его примере обучают структурированию реализации идей и в сущности, неплохо обучают. Некоторое взаимопонимание имеет место: знание паскаля положительно сказывается на общий уровень программиста. Такое знание является побочным эффектом обучения, просто паскаль очень подходящий для обучения общим принципам язык. Абсолютно согласен что писать реальные программы на паскале - небольшое удовольствие, сам не люблю и не пишу. Да он и не предназначен для этого: паскаль по определению проверяет типы и потому медленный (проверки можно выключить, но это уже будет не паскаль), эти begin end задолбешься везде ставить. Потому в качестве языка для прикладной системы (дельфи) он выбран ИМХО неудачно, я бы лично предпочел C++. Но если вдуматься эти различия - только константа, ничего существенного. Также согласен, что недостача чего-то паскале может привести к тому, что программисты начнут халтурить и нарушать принципы правильного программирования. Вопрос только в том, насколько часто это встречается. Так вот я этого не встречал ни разу, хотя вполне допускаю такую возможность. Множественное наследование. Я никогда не сталкивался с необходимостью использования и не очень представляю, какие существенные преимущества оно дает. Существенные это те, которые перевешивают проблемы, порожденные введением в язык множественного наследования. Объясните если есть возможность. Наболевший вопрос. У кого-нибудь есть каие-нибудь данные по сравнению C++ и C на аналогичных проектах в смысле размеров исходников, затраченного труда? То, что я знаю почему-то явно не в пользу C++. Но я специальных исследований не проводил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2003, 07:04 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 c127 Множественное наследование. Я никогда не сталкивался с необходимостью использования и не очень представляю, какие существенные преимущества оно дает. Существенные это те, которые перевешивают проблемы, порожденные введением в язык множественного наследования. Объясните если есть возможность. Никогда не может быть необходимости использовать какие-то определенные идиомы (т.к. любая задача решается множеством способов). Мы их можем только удачно выбирать. Правильно выбранная идиома может сэкономить трудозатраты в разы. Все проблемы с множественным наследованием давно решены, нет таких проблем. Можно пользоваться. :)) Наболевший вопрос. У кого-нибудь есть каие-нибудь данные по сравнению C++ и C на аналогичных проектах в смысле размеров исходников, затраченного труда? То, что я знаю почему-то явно не в пользу C++. Но я специальных исследований не проводил. Рискну предположить, что АНАЛОГИЧНЫЕ проекты на С и C++ не решают. Можно на С++ писать чисто сишный код! Почему нет. Если отключить при компиляции механизм исключений и run-time type information, то полученный двоичный код будет аналогичен написанному на С. Если интересует вопрос, что лучше, С или С++, то его надо задавать так: Что лучше, структурный подход или ООП. В некоторых случаях (автоматные модели) структурный подход лучше! Чем мы занимаемся? Надо знать, чтобы ответить адекватно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2003, 07:40 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 c127 Да он и не предназначен для этого: паскаль по определению проверяет типы и потому медленный (проверки можно выключить, но это уже будет не паскаль), Ээээ..., по-моему, ты ошибаешься. Паскаль проверяет типы только во время компиляции, хотя в нём и есть приведение чего хошь к чему хошь. ИМХО, через промежуточное преобразование к pointer. эти begin end задолбешься везде ставить. :) ну, я думаю, по этому поводу спорить не будем. :) Потому в качестве языка для прикладной системы (дельфи) он выбран ИМХО неудачно, я бы лично предпочел C++. Но если вдуматься эти различия - только константа, ничего существенного. Delphi стала логичным развитием вполне себе успешного Turbo Pascal, а С++ тогда ещё не развился до нынешнего состояния. Но собственно, речь не об этом. Множественное наследование. Я никогда не сталкивался с необходимостью использования и не очень представляю, какие существенные преимущества оно дает. Существенные это те, которые перевешивают проблемы, порожденные введением в язык множественного наследования. Объясните если есть возможность. Хммм... если обобщённо, то МН здорово экономит силы на реализации подмешиваемых интерфейсов. Иначе приходится писать гору дополнительного кода для связи методов, унаследованных от подмешанных интерфейсов с какими-то объектами, реализующими методы интерфейсов. Посмотри ATL - она в немалой степени построена на МН. Иными словами, существенное преимущество МН перед одиночным наследованием в экономии сил, затрачиваемых на реализацию. Соответственно, проще отладка, тестирование и т.п. Кстати, здесь присоединюсь к vdimas, поскольку необходимости использования МН на самом деле нет. Его всегда можно эмулировать одиночным наследованием реализации и множественным наследованием интерфейсов. Просто его использование позволяет обойтись без этой эмуляции. :) Из недостатков можно отметить то, что использование МН требует более вдумчивого проектирования. Наболевший вопрос. У кого-нибудь есть каие-нибудь данные по сравнению C++ и C на аналогичных проектах в смысле размеров исходников, затраченного труда? То, что я знаю почему-то явно не в пользу C++. Но я специальных исследований не проводил. Поищи в сети, где-то есть. На RSDN (www.rsdn.ru) в форуме, кажется "философия программироваия" проскакивало что-то из этой серии. От себя рискну предположить, что скорее всего ты и будешь обнаруживать сравнения совсем не в пользу C++ по целому ряду причин. Смотри, если кто-то пишет на C++, то аналогичную программу он скорее всего не будет писать на чистом C, т.е., ему объективную оценку просто не из чего получать. Обратный случай: некий C-шный продукт переписывается "по-объектному". Следовательно, скорее всего, в нём блокируются какие-то трюки C (вроде использования void*), добавляются новые уровни абстракции и т.п., т.е., это уже не тот же самый продукт . Ну и кроме того, когда осваивают C++, на первых порах разработчики клепают горы ошибок в проектировании. Результат получается не ахти... Вот тебе и отрицательное сравнение. Третий вариант - когда в последнем случае среди C-шников попадается хороший C++-ник. Вот здесь есть основания для получения сравнения "в пользу" C++. Ну вот. И как ты думаешь, каких случаев (и следовательно - фактов оценок ) больше? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2003, 02:57 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Геннадий Васильев >Ээээ..., по-моему, ты ошибаешься. Паскаль проверяет типы только во время компиляции, хотя в нём и есть приведение чего хошь к чему хошь. ИМХО, через промежуточное преобразование к pointer. Нет, например в случае объявления: type t=1..333; var y: t; тип должен проверяться в случае каждого присваивания вида y:=что_то;. Есть и более сложные случаи т.е. тормозит сильно. У классического паскаля очень строго с типами, целая наука. >Delphi стала логичным развитием вполне себе успешного Turbo Pascal, а С++ тогда ещё не развился до нынешнего состояния В то время (начало девяностых) C++ был уже на уровне, по крайней мере на уровне тогдашнего объектного паскаля. Не было в C++ темплейтов, какого-нибудь множественного наследование, так их objectpascal и сейчас нет и никому они в дельфях не нужны. А потом, как долго все ждали сишного варианта, а когда через несколько лет вышел CBuilder все вдруг стали его сильно ругать, так до сих пор и ругают. Хотя казалось бы, с точки зрения производителя нет никакой разницы, какой язык использовать, и тот и другой компилятор у борланда был. Это еще один аргумент против C++. >Кстати, здесь присоединюсь к vdimas, поскольку необходимости использования МН на самом деле нет. Его всегда можно эмулировать одиночным наследованием реализации и множественным наследованием интерфейсов. Просто его использование позволяет обойтись без этой эмуляции. :) Так и я о том же: сэмулировать множественное наследование в большинстве случаев ничего не стоит. Так нужно ли усложнять язык и вносить в него проблемы ради небольшого выигрыша. Я попробую посмотреть на RDSN, спасибо. Мне в самом деле интересно разобраться. >Следовательно, скорее всего, в нём блокируются какие-то трюки C (вроде использования void*), добавляются новые уровни абстракции и т.п., т.е., это уже не тот же самый продукт Но ведь задача решается та же. В конечном счете ведь нас интересует решение задачи. C++ гораздо богаче чем C, вроде бы должен приводить к значительному упрощению кода и ускорению процесса разработки. А в действительности в тех двух-трех случаях когда велась параллельная разработка и которые мне удалось понаблюдать, выигрыша не наблюдалось. И потом, если C++ такой супер-пупер и имеет такие неоспоримые преимущества, то уже должен был бы уже вытеснить C, по крайней мере на больших проектах. На C бы писались драйвера и все. А ведь этого не происходит, до сих пор многие крупные проекты пишутся на сях. Только консерватизмом такую ситуацию объяснить по-моему нельзя. Например паскаль в промышленности практически умер и кое-как держится только из-за дельфи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2003, 06:44 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 c127 Мне очень импонирует желание с127 спокойно разобраться, без скатывания на религиозные войны. К сожалению, здесь в форуме, нет возможности выложить реальные интересные материалы по тому же множественному наследованию. Если с127 кинет мне письмо, я в ответ вышлю вполне законченную иерархию классов (из реального проекта) с документацией и диаграммами наследования. Очень небольшой объем исходного кода при немалой функциональности, думаю, сможет послужить аргументом. Да, и строгая типизация далеко не последнюю роль играет, но тут надо смотреть и обсуждать конкретные моменты (что это? почему именно так? и что это нам дает?). Согласен, что переписанная "в лоб" на С++ С-шная задача в общем случае не даст выигрыша (напр. некий несложный алгоритм). На С++ задачи решаются ПРИНЦИПИАЛЬНО ПО-ДРУГОМУ. Реальный выигрыш от ООП можно получить там, где моделируется большая система взаимодействующих сущностей. До определенной сложности подобные системы можно разрабатывать с применением процедурного подхода, но потом начинаются трудности. На С++, при правильном подходе, трудности не начинаются НИКОГДА! Сколь большой бы не была система, если ее удается представить в иерархическом виде, то на каждом уровне происходит оперирование вполне счетным числом понятий. Пиши. После освоения множественного наследования перейдем к шаблонам и стратегиям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2003, 09:30 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 c127 Нет, например в случае объявления: type t=1..333; var y: t; тип должен проверяться в случае каждого присваивания вида y:=что_то;. Есть и более сложные случаи т.е. тормозит сильно. У классического паскаля очень строго с типами, целая наука. Да, верно, я и забыл о паскалевской строгости с enumeration. Так и я о том же: сэмулировать множественное наследование в большинстве случаев ничего не стоит. Так нужно ли усложнять язык и вносить в него проблемы ради небольшого выигрыша. ИМХО, стОит, поскольку множественное наследование реализаций позволяет в ряде случаев сэкономить ручной труд и вобщем-то, является логичным развитием концепции наследования. Но ведь задача решается та же. В конечном счете ведь нас интересует решение задачи. Да, именно так. Но после решения задачи всегда остаётся период сопровождения, который нельзя игнорировать при начальной разработке программы. Кстати, вспомнилось, если не читал, то советую посмотреть книжку Алана Голуба "Правила програмирования на C & C++". Хоть сама по себе она содержит довольно много устаревших и просто спорных вещей, но там есть интересное в контексте нашей беседы высказывание по поводу "гибридных" проектов - когда в рамках одного проекта сочетаются подходы C и C++. Дословно не помню, но суть сводилась к следующему: хоть менеджеры и утверждают, что "раз такие проекты эксплуатируются, то этот подход работает", но его сопровождение превращается в один непрерывный кошмар. Я, в принципе, двумя руками поддерживаю подобную оценку. Беда в том, что немалая часть проектов на C++ выполнена как раз по "гибридной" схеме. Можно даже правило определённое вывести: если активно используется MFC, то это - гибридный проект. Почему? Потому что MFC в целом представляет собой всё что угодно, только не объектную C++-библиотеку. Ну не объектная она и всё тут. Для того, чтобы ей пользоваться "объектно" и получить пряники, обещаемые ОО-подходом нужно сделать ещё гору врапперов, надстроек и т.п. Готов принять поток критики, но я до сих пор уверен, что факт наличия работающего продукта ещё не означает, что этот продукт работает хорошо, уж тем более, это не является критерием того, что подходы, использованные в реализации проекта можно смело переносить на другие продукты. Никода не доводилось ужасаться по поводу своего кода, помещённого в выпущенный продукт? Мне - приходилось. :) Так что, факт "сданности" продукта сам по себе ничего не означает. Он может служить подтверждением работоспособности тех или иных методик, но для того, чтобы сравнивать методики сами по себе, нужно как очень детальное сравнение двух или более готовых продуктов, и, что не менее важно - сравнение характеристик цикла разработки и сопровождения. А их и считать-то толком не всегда умеют... А ведь этого [С++ не вытесняет C] не происходит, до сих пор многие крупные проекты пишутся на сях. Только консерватизмом такую ситуацию объяснить по-моему нельзя. Например паскаль в промышленности практически умер и кое-как держится только из-за дельфи. Ты не учитываешь фактора определённой стереотипичности мышления, присущей программстам. Кроме сугубо рациональных аспектов использования тех или иных языклв есть ещё и... Бытовала такая шутка: "Для чего предназначены языки программирования? Pascal - для студентов, APL - для марсиан, Lisp - для учёных, Smalltalk - для домохозяек, C - для программистов ". Там было перечислено много языков, остальных не помню, но суть, надеюсь, ясна. Потом опять же - "настоящие программисты пишут на Fortran"... :) Потом, фактор того, что масса ПО уже написана на C (те же операционные системы). Есть ещё и фактор, который можно сформулировать так: "я всегда писал на C и у меня всё получалось". Воздействие такого соображения очень трудно преодолеть. Приходится "тыкать носом" в очевидные проколы, которых удалось бы избежать, не будь там преобразования к void* и т.п. Наконец, есть ещё фактор наличия инструментальных средств. Например, компиляторы C++ только сейчас начали подтягиваться к реализации стандарта ANSI. Соответственно, перенос разработок с платформы на платформу был затруднителен. С другой стороны, реализации C отличались по большому счёту только набором библиотек. Да и станарт C был принят, если не ошибаюсь, аж в 90 году. И наконец, ИМХО, один из самых серъёзных, если не самый серьёзный фактор. "Правильная", т.е., "объектная" разработка на C++ требует бОльших вложений на начальной фазе развития проекта, чем разработка на C, особенно это заметно при переходе с C на C++ (проверял на себе). Различия проявляются позже - когда начинается эволюция/сопровождение. Это, кстати, неоднократно отмечалось апологетами ОО-подхода, цитат сейчас привести, к сожалению, не могу, но по-моему, такие высказывания есть у Буча, Шлеера, Голуба... В середине 90-х на эту тему только и жужжали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2003, 20:09 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2vdimas\r /topic/27708&pg=1\r здесь как-то я просил привести пример из реального проекта с использованием шаблонов и мн. \r (ну не дорос видимо я до использования шаблонов в своих проектах. очевидно потому что \r задачи стоят проще. нет, например, необходимости лепить свои GUI.)\r был бы багодарен за разьяснения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2003, 09:33 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 Геннадий Васильев Спасибо, разбираюсь. Попробую почитать Голуба. Может быть действительно проблема в гибридности проектов. Звучит правдоподобно. Все-таки консерватизмом относительная непопулярность C++ в сравнении с C по-моему не объясняется. По-видимому есть другие серьезные причины. >"Для чего предназначены языки программирования? Pascal - для студентов, APL - для марсиан, Lisp - для учёных, Smalltalk - для домохозяек, C - для программистов" Это не те ли домохозяйки, у которых кухоннй UNIX-компьютер управляет работой моющей машины? Smalltalk для этого подходит. Скорее там речь шла о васике для домохозяек, а для ученых - о фортране. Шутка. 2 vdimas Отправляй чингизу, он разрешил, к тому же его этот вопрос тоже интересует: tchingiz@ukrpost.net Попробуем разобраться. Согласен с тем, что в C++ задача должна решаться по другому, чем в C, уж на этапе кодирования - наверняка. Но не понимаю, почему же мало кто в реальности ее решает по-другому. Я пока вижу 3 варианта. При этом я пока принимаю за аксиому полезность ООП. 1) ООП в при кодировании в C++ счень сложен, по крайней мере для среднего разработчика, человек быстро скатывается к более простому сишному стилю. 2) Сишный стиль настолько прост и удобен, что от него нельзя отказаться. 3) Имеются серьезные скрытые проблемы, отличные от п.1, в практическом использовании C++ в кодировании ОО приложений, которые вынуждают программистов использовать более простой C-стиль, выдерживают только самые стойкие. В полезности шаблонов я не сомневаюсь. Идея мне очень нравится, но вот похоже Степанов недоволен ее реализацией в C++. Я не очень понимаю почему, но ему виднее. Насколько я понимаю, к OOP-у шаблоны не имют отношения. Хотя я не большой знаток основ ООП и готов выслушать другие мнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2003, 00:15 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Непопулярность C++ еще можно объяснить "техническими" причинами. У меня было очень много знакомых, которые еще в студенчестве, в 1993-5 гг подавали неплохие надежды как С++-ники. Однако, вдруг вышел Delphi, а под С++ ничего такого не вышло :((. Большая часть народу просто "прыгнула" на него и на прочие визуальные редакторы. До сих пор не понимаю, почему они так задержали с ВСВ. BC++ 5.0 - это был просто кошмар (не путать с BCB), очевидно этот проект они забросили. (а OWL гораздо лучше была, чем MFC - практически "чисто" объектно-ориентирована). Да, в среде *никсов C++ - сверхпопулярен. А виндовая платформа эмэфцой изгажена. Когда-то Майкрософт запретила поставщикам других С++-компиляторов поставлять в одной коробке собственные наработки (тот же OWL) и MFC. Так что, мы просто не имеем альтернативы мелкомягким поделкам (MFC/ATL/WTL). А альтернативы просятся давно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2003, 10:19 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 c127 ...При этом я пока принимаю за аксиому полезность ООП. :) Ты путаешь наблюдение следствий и идентификацию причин. Т.е., в принципе, мне перечисленные пункты понравились, но, ИМХО, в качестве определения причины они "бьют мимо цели". Вот почему: 1) ООП в при кодировании в C++ счень сложен, по крайней мере для среднего разработчика, человек быстро скатывается к более простому сишному стилю. Проблема не в этом. Проблема в том, что разработчики часто поставлены в условия, когда им необходимо писать так, чтобы это было понятно даже... ммм... скажем так, не очень опытному коллеге. При этом упор делается не на то, что этому самому неопытному коллеге было бы очень полезно поковыряться в сложной программе, сделанной хорошим C++-ником, а на исключение фактора непредсказуемости времени, которое новичок потратит на саморазвите в этом случае. Т.е., не "низы поднимаем", а "опускаем" тех, кто более развит. И квалификация при этом всё чаще связывается не с умением мыслить, а с запоминанием API, технологий и прочим бредом. А само по себе кодирование ООП-ной программы на C++ ничуть не сложнее, чем, например, на том же Java. 2) Сишный стиль настолько прост и удобен, что от него нельзя отказаться. Неверная оценка. Сишный (процедурный) стиль прост и удобен для определённой категории разработчиков, безотносительно их "хорошести" или "плохости". Кроме того, сишный стиль всегда будет присутствовать на компьютерах с фон-неймановской архитектурой. 3) Имеются серьезные скрытые проблемы, отличные от п.1, в практическом использовании C++ в кодировании ОО приложений, которые вынуждают программистов использовать более простой C-стиль, выдерживают только самые стойкие. Ну всё, обливаю себя бальзамом. Я стойкий. :) По моим наблюдениям, ни в коем случае не претендующим на полноту, самым большим откровением для "сишников" становится гораздо более мелкая объектная структуризация программы, чем это кажется им на первый взгляд. Ну, например, мне неоднократно задавали вопросы типа: "для чего эти смарт-пойнтеры-то нужны? Программу лучше тестировать надо!". Понимаешь, достаточно трудно используя, например, стандартные UML-диаграммы показать реализацию, например, массива указателей. Для сишника со стажем это просто массив указателей, для C++-ника же - инстанцирование шаблона vector<>. Так что, вынуждают переходить на "стиль C" нередко конкретные люди, а не "скрытые проблемы" языка. Основное, что я хочу сказать, наверное, можно выразить кратко: причины эффективного применения C++ ищи в конкретных людях , причины провалов - в командах и менеджменте. Почему? Потому что эффективное использование C++ одним разработчиком в ряде случаев (я не хочу сказать - всегда) сводит на нет необходимость команды, менеджеров, промежуточной документации и прочих ритуальных плясок, тогда как неэффективность обусловлена коммуникационными барьерами между людьми. Вот уж действительно - пляски так пляски. Другая сторона медали, ИМХО, в том, что процедурный стиль ближе "паковщикам" по терминологии А.Картера, кои составляют бОльшую часть людей. Отсюда и бОльшая популярность языков вроде C, а вернее - процедурного подхода. Отвлечённое наблюдение, возможно не совсем точное. C++ как и куча языков-сверстников развивался с прицелом, в частности, на повышение эффективности индивидуала , и перекладывание работы по верификации программы на компилятор. Сильная типизация - как раз игрища из этой области, поскольку понятие "тип" определяется как набор допустимых операций. А современные нам языки, такие как Java и C# направлены на поддержку команд, менеджмента... На что угодно, только не на то, чтобы дать программисту в руки инструмент воплощения видения картины мира. Чувствуешь "изменение" вектора? Вместо развития, как повышения уровня абстракции и систематизации получается деградация. В полезности шаблонов я не сомневаюсь. Идея мне очень нравится, но вот похоже Степанов недоволен ее реализацией в C++. Я не очень понимаю почему, но ему виднее. Насколько я понимаю, к OOP-у шаблоны не имют отношения. Хотя я не большой знаток основ ООП и готов выслушать другие мнения. Как минимум, он недоволен отсутсвием consraints в шаблонах, насколько я помню. Ещё у него в интервью (где-то в сети есть) были замечательные слова (не дословно): "мне говорят, что надо идти туда, где большие деньги, но по-моему это дурно пахнет". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2003, 07:27 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Геннадий Васильев >Проблема в том, что разработчики часто поставлены в условия, когда им необходимо писать так, чтобы это было понятно даже... ммм... скажем так, не очень опытному коллеге. Я такого не встречал, хотя наверное где-то есть и такое. То что я видел - каждый программирует как хочет. В лучшем случае оговаривается система именования переменных, функций, файлов, классов и пр. >Так что, вынуждают переходить на "стиль C" нередко конкретные люди, а не "скрытые проблемы" языка. Очень хорошо, но причины-то в чем? Почему конкретные люди, для облегчения жизни которых придуман и C++, не используют его преимущества в полной мере. Ситуация ведь интересная: люди придумали вроде бы удобный и правильный язык, защищают его от нападок несознательных элементов, а сами же в большинстве не используют его удобство. Всякая C++ программа, по крайней мере на этапе разработки, это постоянные проблемы с памятью, путанье типов и прочие прелести, свойственные C, от них же и пытались избавиться. Да и если посмотреть функции (методы), то там скорее всего будет последовательность new в начале и delete в конце. По большому счету оно ничем не лучше, чем malloc-free? Взял книжку "C++ programming with CORBA" ISBN 0-471-28306-1. Книга по практическому применению C++. Открыл наугад на 239 странице. Вижу: char **print_command; char **queue_command; CORBA::String_var printer_name; .... //constructor PrinterImp::printerImpl(const char *p_command, const char *q_command, const char *name, CORBA::typeCode_ptr dp_eval_ret_type) { print_command = new char *[ 4 ]; print_command=new char[256]; ...... } Это основной конструктор, других конструкторов нет. стр. 240: void PrinterImp::print_file(const char *fn) { strcpy(print_command," "); strcat(print_command,fn); .... } Чистый C, от C++ одно название. Книгу я специально не выбирал, это первая попавшаяся под руку. >Отвлечённое наблюдение, возможно не совсем точное. C++ как и куча языков-сверстников развивался с прицелом, в частности, на повышение эффективности индивидуала, и перекладывание работы по верификации программы на компилятор..... >А современные нам языки, такие как Java и C# направлены на поддержку команд, менеджмента... Нет, при создании C++ говорились те же самые слова насчет командной работы. Причем упор делался именно на большие проекты и большие команды разработчиков. Это одна из причин введения инкапсуляции - закрыть доступ внутрь класса, чтоб пользователи библиотек не лазили куда не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2003, 05:39 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
а вот пример свежий хочу привести. в час носи ко мне пришли и говорят(на работе я был, случайно типа) надо сделать секвенцию кадров с цифровыми часами от 0 до 20 минут на синем фоне в правом нижнем углу. незнаю зачем, и почему нет таких плагинов в том же премьере. В общем, надо. Я взял gcc из mingw и dev-c++ и сделал за два часа. на основе нескольких простых классов которые раньше делал сам для себя(пригодились таки). на делфи я бы это сделал за пол часа. ну так я же только начинаю. Но интуиция мне уже говорит, с++ это крутая тема. нужен только опыт. Опыт работы в делфи у меня 5 лет. до этого паскаль. до этого ассемблер(ну, сами понимаете, какие времена были). так вот. с++ это действительно мощная штука для меня. в общем, для меня с++ живее всех живых. за ним и *никс платформами я вижу будущее. по крайней мере свое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2003, 06:28 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2 c127 ГВ>Проблема в том, что разработчики часто поставлены в условия, когда им необходимо писать так, чтобы это было понятно даже... ммм... скажем так, не очень опытному коллеге. c127>Я такого не встречал, хотя наверное где-то есть и такое. Ну, мне доводилось видеть. И даже самому попадать под подобную критику. ГВ>Так что, вынуждают переходить на "стиль C" нередко конкретные люди, а не "скрытые проблемы" языка. c127>Очень хорошо, но причины-то в чем? Почему конкретные люди, для облегчения жизни которых придуман и C++, не используют его преимущества в полной мере. Ситуация ведь интересная: люди придумали вроде бы удобный и правильный язык, защищают его от нападок несознательных элементов, а сами же в большинстве (выделение моё - ГВ.) не используют его удобство. Именно что в большинстве . Но C++ придумало отнюдь не большинство программистов и тем более, людей себя ими называющих. Большинство не придумало даже паскаль. Отходя немного в сторону от дискуссии замечу, что большинство - суть стадо, а апелляция к большинству - суть некорректная аргументация. ;) Большинство вообще неспособно ничего придумать. Придумывают единицы. Большинство - поддерживает их или не поддерживает. И кстати, далеко не факт, что большинство всегда оказывается правым. Впрочем, ладно... Я вижу причины неприятия стиля C++ и неиспользования его возможностей всего лишь в его относительной необычности по сравнению с императивными языками. Ну, трудно переключиться сразу на стиль объектов с шаблонами. Тем более это трудно сделать, если сначала учиться C. Наверное, всё-таки, это правильно, что учиться нужно начинать с Pascal. c127>Всякая C++ программа, по крайней мере на этапе разработки, это постоянные проблемы с памятью, путанье типов и прочие прелести, свойственные C, от них же и пытались избавиться. Такие ошибки появляются, если выводить учёт ресурсов "за грань сознания", а это неверно. И, кстати, полный учёт совсем не мешает концентрации на прикладной функциональности. Заставляет делать её стройнее и предсказуемее - да, это есть... c127>Да и если посмотреть функции (методы), то там скорее всего будет последовательность new в начале и delete в конце. По большому счету оно ничем не лучше, чем malloc-free? Совершенно верно и это, кстати, и есть плохой стиль программирования на C++. "Хороший стиль", ИМХО, можно кратко сформулировать примерно так: всё есть объекты. Элементы жизненного цикла сущностей - в том числе. c127>Взял книжку "C++ programming with CORBA" ISBN 0-471-28306-1. Книга по практическому применению C++. Открыл наугад на 239 странице. Вижу: Ну дык! Книжка-то наверное больше о CORBA, чем о C++, т.е., в ней иллюстрируется в первую очередь использование CORBA и т.п. Её почти наверняка можно использовтаь для того, чтобы обучаться CORBA, но не стилю C++! c127>Чистый C, от C++ одно название. Книгу я специально не выбирал, это первая попавшаяся под руку. Ну, попробуй почитать что-нибудь именно по C++ без "разбавлений", вроде CORBA, Windows, Unix. Александреску, например. Просто хороший стиль C++ он не привязан к платформе, а проиллюстрировать одновременно стиль и аспекты конкретной библиотеки - сложная и, на мой взгляд, достаточно бессмысленная задача, чтобы её не решали. c127>Нет, при создании C++ говорились те же самые слова насчет командной работы. Причем упор делался именно на большие проекты и большие команды разработчиков. Это одна из причин введения инкапсуляции - закрыть доступ внутрь класса, чтоб пользователи библиотек не лазили куда не надо. Не только на большие команды. Делался упор ещё и на то, что один человек может контролировать больший объём исходного текста. Хотя в принципе, ты прав, я несколько загнул с оценками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2003, 05:19 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
pop-up. модераторам - не бить! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 16:35 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
vdimas На большинство приходящих в обычной работе собощений Windows, в этих библиотеках происходит следующее: 1. reflection всех Notifications 2. PretranslateMessage вдоль по всей иерархии окон. 3. Поиск объекта в MAP-ах по хендлеру. 4. линейное "прочесывание" message maps классов в ответ на КАЖДОЕ ПРИХОДЯЩЕЕ СООБЩЕНИЕ Ура! Есть человек в мире осознающий наскоко MFC тяжёлая штука! alexey_1979 Ты же не будешь создавать массив обработчиков на несколько тысяч элементов для того, чтобы обработать пару сообщений. Ну MFC вообще-то так и делает.... vdimasБольшинство сообщений (99.99% из общего приходящего потока) в своей оконной процедуре просто достают адрес объекта из самомого экземляра МОЕГО класса окна (а не из многотысячного ATL/MFC MAP-а) ещё респект! тоже копался в механизме получения экзепляра в MFC - офигел от наворотов. идея таскания указателя на объект в самом классе - гораздо приятнее. Сам так делаю. Как мне рассказали люди, MFC сделало сбор всех хэндлов окон в массив из соображений безопасности. Кто объяснит, что они обезопасили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2004, 16:40 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Siebentearbeitpop-up. модераторам - не бить! :) да не будут бить . блин башка раскалывается :( (не пил вчера) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 09:15 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Ну бывает. Я сёдня спать лёг в 3.45, а утром бежал за электричкой зимой 5км. в гору. Никакой сижу, спать охота. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 10:19 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Sieзимой 5км. в гору. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 12:08 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
да, это из рассказа про смену поколений :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 13:55 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Sieда, это из рассказа про смену поколений :) угу помню :)) эхх прощай С++ ухожу работать на Delphi + MSSQL 2k ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 14:50 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Я не понял, что за наезды такие на MFC ваще а ? Причем абсолютно необоснованные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 15:02 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Геннадий Васильев Идея мне очень нравится, но вот похоже Степанов недоволен ее реализацией в C++. Я не очень понимаю почему, но ему виднее. Насколько я понимаю, к OOP-у шаблоны не имют отношения. Хотя я не большой знаток основ ООП и готов выслушать другие мнения. Как минимум, он недоволен отсутсвием consraints в шаблонах, насколько я помню. Ещё у него в интервью (где-то в сети есть) были замечательные слова (не дословно): "мне говорят, что надо идти туда, где большие деньги, но по-моему это дурно пахнет". вот это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2004, 22:04 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
На C++ можно написать любую программу, которую можно вообще написать. Но не за те же деньги )) В пользу этого утверждения есть следующие доводы 1 крутые сишники (срршники) за даром работать не будут 2 у некрутых сишников прога работать не будет В такой ситуации выбор не велик. А большую прикладу писать можно за дешево на более высоком уровне абстракции на урезанных языках. Тем более что этот уровень в них уже подготовлен (реализован и оттестирован). Имеются в виду либы, поддержка технологий и т.д. Поэтому многие менеджера скатываются в пользу java и т.д. И по деньгам они правы. Киньте в меня камень, если я неправ. Кроме того, если нужно во всех подобных языках можно подключать практически любые модули. Для узкого круга задач низкого уровня можно написать модуль на с++ и пользовать его. Я сам обожаю с++. И другие языки для меня они как тесная детская колыбелька. Мне в ней тесно. Только на c++ можно лаконично и без извратов писать на любом уровне абстракции при условии, что это уровень еще нужно реализовать и отладить. Если бы для с++ была нормально структурированная и отлаженная библиотека с исподниками хотя бы как в java и при надобности можно было бы возлагать контроль за ресурсами на язык. (Да… тогда получиться c# или java). Самое обидное, что c++ это позволяет, а этого до сих пор нет. А если нет то по кусочкам. Если вдруг эти кусочки попытаешься объеденить, то получишь как минимум длинный catch. Короче нужна крутая отлаженная и простая в использовании библиотека. Если она будет, то мы всем нос утрем как по красоте и лаконичности, так и по скорости и стоимости разработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2004, 07:44 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
"Короче нужна крутая отлаженная и простая в использовании библиотека. Если она будет, то мы всем нос утрем как по красоте и лаконичности, так и по скорости и стоимости разработки." Не знаю как насчет "крутая", но помоему VCL от борланда, это как раз то о чем ты говоришь. Прибавь к этому STL и изобретать велосипед по второму разу не надо будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2004, 13:19 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
vcl от борланда не столь хороша, в частности портируемость ее оставляет желать лучшего. причем портируемость не только между операционныим системами, но и компиляторами. Много ли компиляторов могут использовать vcl? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2004, 14:12 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
VCL писана на паскале. Вот если перевести на С++ и сделать портируемой - цены ей не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2004, 21:52 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Как сказал один мой знакомый нехилый (когда я тока начинал работать, его зазвали работать в MS) "С++ можно изучать всю жизнь" Это правда и явное отражение мощи языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2004, 08:58 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
CEMb С++ можно изучать всю жизнь Главное найти тех парней что будут эту учебу финансировать :( Lepsik VCL написана на паскале. Вот если перевести на С++ и сделать портируемой - цены ей не будет. Перенести, перепроектировав, или просто переписав? imho VCL очень тяжелая и "сама в себе" - как будто другого ничего нет... STL - вот что должно было стать фундаментом - в VCL же все свое - и достаточно среднее. Для написания клиентов к БД на Delphi подходит - но и только ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2004, 12:56 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
funikovyuriГлавное найти тех парней что будут эту учебу финансировать :( Можно всё делать параллельно, работать на с++ и учится с++ работая на с++ :) funikovyuriSTL - вот что должно было стать фундаментом Ну, кстати, тут пробегал человек, недовольный STL по следующей причине: во, вроде, всех компиляторах нет заточки на архитектуру процессора. И я, кстати, на этом месте задумался... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2004, 16:30 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
а как связана конкретная шаблонная библиотека с заточками компилятора? компилятор должен вообще затачиваться, не заморачиваясь на конкретные библиотеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2004, 17:32 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2funikovyuri большая часть VCL никаким боком с STL непересекается. да и в области строковый функций stl::string слабоват - мне больше boost нравится - вот где сила. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2004, 19:13 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
funikovyuriа как связана конкретная шаблонная библиотека с заточками компилятора? Вроде как можно оптимизировать существенно под пень/амд 2 Lepsik char* - вот где сила :) (и вообще указатели - сила) Java и C# лишины этого счастья :) Хотя в Javе есть ссылки. Тока чё-та я стал забывать без практики... можно ли там делать вещи типа (сhar*)++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2004, 07:28 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Нильзя. JAva ваапще атстой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2004, 12:08 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
И сла те восподи, шо низзя. Указатели ацтой. Жаба рулез. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2004, 13:17 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Ни Java ни указатели не отстой - всё в природе нужно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2004, 14:15 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
Lepsik большая часть VCL никаким боком с STL непересекается. Да тот же AnsiString используемый всюду в VCL. А StringList? да и в области строковый функций stl::string слабоват - мне больше boost нравится - вот где сила. в смысле слабоват? В boost'e нет никаких string'ов - boost это расширение стандартной stl - такие базовые классы как string там не переписываются Sie Вроде как можно оптимизировать существенно под пень/амд Я этого не писал L) можно ли там делать вещи типа (сhar*)++ Вот из-за таких вещей С++ и помер... Из-за того что любой Вася П может такого понаписать что хоть стой хоть падай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2004, 15:06 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
2funikovyuri --большая часть VCL никаким боком с STL непересекается. Да тот же AnsiString используемый всюду в VCL. А StringList? я же сказал большая (ударение на O). оконные библиотека например и масса других --да и в области строковый функций stl::string слабоват - мне больше boost нравится - вот где сила. --в смысле слабоват? В boost'e нет никаких string'ов - boost это расширение стандартной stl - такие базовые классы как string там не переписываются ты чем читаешь ? "строковых функций", а не класс типа string Если конечно ты курсе что в бусте они есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2004, 19:13 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
ты чем читаешь ? Слушай, может я в русском слабоват или ты его забывать стал, но вот это да и в области строковый функций stl::string слабоват - мне больше boost нравится - вот где сила. означает противопоставление boost и stl - а это не верно - о чем я и сказал. Так или иначе - я тебя обидеть не хотел - чего не скажешь о твоем посте. Я понимаю - у всех может тяжелый день приключиться - так что проехали... PS> насчет boost'a и функций - представляешь - кое чего знаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2004, 20:59 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
C++ не помер... указатели - нужная и сильная штука. А если Вася П не умеет ими пользоваться, то сам виноват. Если Вася П залезет в эксковатор и поломает 2 дома - виноват не экскаватор, а Вася П ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 07:48 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
виноват также владелец транспортного средства :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 08:39 |
|
||
|
Не дадим C++ в обиду
|
|||
|---|---|---|---|
|
#18+
авторвиноват также владелец транспортного средства :-) Ну тока в том, что оставил без присмотра... Если хотите, то можно сказать так, что MS оставила без присмотра компилятор С++ которым Вася П всё поломал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2004, 10:21 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2034114]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
154ms |
get tp. blocked users: |
2ms |
| others: | 204ms |
| total: | 471ms |

| 0 / 0 |
