На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (32) [1] 2 3 ...  31 32  ( Перейти к последнему сообщению )  
> Развейте мои сомнения: упростится ли программирование при переходе от C к C++?
    Когда-то я уже начинал изучать C++, даже писал не большие программки на C++. Потом забросил и не кодил на C++ лет 8. Почти все забыл. Но тут возникла одна идея, которую нужно реализовать в виде программы и я решил тут «вспомнить молодость» и начать, что называется, «с нуля». Взял в руки книжку В.В. Подбельского «язык C++» 2005 года выпуска (знаю, что есть Страуструп, Липман и др. книжки посвежее и по «забористей» - но говорю же: «с самого нуля» решил начать, а в предисловии к книжке как раз написано было, что она для тех, кто изучает C++ “с нуля”) и стал читать. Попутно заглядывая в гугл.
    И начитался про иерархии классов и наследование (в т.ч. перекрестное), про спецификаторы доступа (private, protected и public), про конструкторы (по умолчанию, копирования, преобразования), про перегрузку (как обычных функций, так и операторов и конструкторов), про дружественные функции и классы, про шаблоны функций и классов, про виртуальные функции и чисто абстрактные классы, про механизм «продвижения типов». И ошалел. А ведь есть ещё конструкции с ключевыми словами explicit,try catch,typeid, typename, reinterpret_cast, const_cast, static_cast, dynamic_cast, virtual, mutable, с которыми я пока не разбирался.
    Учитывая все сказанное я хочу спросить:
    1) Если вам нужно разобраться в логике работы чужой, незнакомой вам, программы достаточно большого объема и выловить баги в ней, а в программе используются достаточно сложные иерархии классов (вплоть до 4-го левела и больше) с перекрестным наследованием, и в классах иерархии используются многократные перегрузки (причем как просто функций, так и функций операторов и конструкторов всех видов), дружественные функции, виртуальные функции, шаблоны, то ведь, пожалуй запутаться можно (« что и когда вызывается») и голову можно сломать пока разберешься? В чужой программе на чистом СИ разбираться и искать багги легче?
    У меня, например, даже простейшие программки, приведенные в книге, вызывали головную боль, пока разберешься «что это такое, куда и зачем». Получалось понять работу программ только раза с 10-го. С пониманием же программ на СИ такого не было. СИ я освоил буквально за 1 день. Вот я и подумал: а все эти навароты в С++ и что программа так трудно понимается, чем оправданы?
    2) А если сам пишешь программу, то поставленную задачу можно решить на C++ реально проще и быстрей, чем на СИ? Если да, то в каких задачах проявляется преимущество C++? И за счет чего облегчается и ускоряется написание программы?
    3) В каких-нибудь задачах (и в каких конкретно) вам приходилось в классе использовать сразу почти все ОО-средства С++ «по полной программе»? Т.е. перекрестное многоуровневое наследование с многократными перегрузками всего и вся с виртуальными функциями и абстрактными классами, с дружественными функциями и классами,с шаблонами, исключения, RTTI и т.п.. Или у вас такой необходимости никогда не возникало? Или вы не использовали «сразу все» просто, чтобы самому же не запутаться в своем коде?
    Сообщение отредактировано: JoeUser -
      Вот что коллеги пишут на форуме.
      user posted image
        Цитата Исмаил Прокопенко @
        Учитывая все сказанное я хочу спросить:
        1) Если вам нужно разобраться в логике работы чужой, незнакомой вам, программы достаточно большого объема и выловить баги в ней, а в программе используются достаточно сложные иерархии классов (вплоть до 4-го левела и больше) с перекрестным наследованием, и в классах иерархии используются многократные перегрузки (причем как просто функций, так и функций операторов и конструкторов всех видов), дружественные функции, виртуальные функции, шаблоны, то ведь, пожалуй запутаться можно (« что и когда вызывается») и голову можно сломать пока разберешься? В чужой программе на чистом СИ разбираться и искать багги легче?

        Программа - программе рознь. Если у С++ конструкции сложнне, то у Си - кодо-километры. ИМХО, тут от программиста зависит, а хочет ли он быть понятым потомками.

        Цитата Исмаил Прокопенко @
        У меня, например, даже простейшие программки, приведенные в книге, вызывали головную боль, пока разберешься «что это такое, куда и зачем». Получалось понять работу программ только раза с 10-го. С пониманием же программ на СИ такого не было. СИ я освоил буквально за 1 день. Вот я и подумал: а все эти навароты в С++ и что программа так трудно понимается, чем оправданы?

        Незнакомое - всегда вызывает трудности на первых порах. Но проходит время, непонятное становится обычным, повседневным и понятным. У С++ арсенал гораздо богаче Си, что позволяет писать более лаконичный и красивый код. Но нет "предела человеческому совершенству", нет границ, можно и огород нагородить.

        Цитата Исмаил Прокопенко @
        2) А если сам пишешь программу, то поставленную задачу можно решить на C++ реально проще и быстрей, чем на СИ?

        Да. Т.к. С++ включает все, что имеет Си. Плюс-плюс кучу вкусняшек :)

        Цитата Исмаил Прокопенко @
        Если да, то в каких задачах проявляется преимущество C++? И за счет чего облегчается и ускоряется написание программы?

        Если задача сложная, но легко поддается декомпозиции на функциональные сущности - это хорошо ложится на парадигму ООП. Если сложность есть, а декомпозиция представляется проблематичной - строим конечный автомат без ООП, но используя "вкусности" STL, что так же сократит усилия на программирование. У чистого Си осталась основная ниша - создание ПО для систем с сильно ограниченными ресурсами.

        Цитата Исмаил Прокопенко @
        3) В каких-нибудь задачах (и в каких конкретно) вам приходилось в классе использовать сразу почти все ОО-средства С++ «по полной программе»? Т.е. перекрестное многоуровневое наследование с многократными перегрузками всего и вся с виртуальными функциями и абстрактными классами, с дружественными функциями и классами,с шаблонами, исключения, RTTI и т.п.. Или у вас такой необходимости никогда не возникало? Или вы не использовали «сразу все» просто, чтобы самому же не запутаться в своем коде?

        Используя внешние фрэймворки, типа Qt, хочешь-не-хочешь, а все это получаешь "в комплекте" (хотя исключениями Qt брезгует). Но в фрэймворках/библиотеках это все внутри, интерфейс обычно простой и незатейливый. Если нужно заглянуть "внутрь", жди всего этого. Для использования "всего сразу" нужны не просто знания, нужна продолжительная практика. Тогда "визуально усложняя код" - по сути делаешь его более системным, логичным, а следовательно, более понятным.

        Ну и вопрос ... а к чему все эти вопросы? Почему бы просто не начать постепенно от простого к сложному?

        Добавлено
        Цитата Исмаил Прокопенко @
        Вот что коллеги пишут на форуме.

        Это частное мнение одного человека. И ему не везет в жизни.
          Цитата JoeUser @
          у С++ конструкции сложнне, то у Си - кодо-километры

          Вот вот. И что проще, с чем легче разбираться - ещё вопрос. Километры простого кода, или компактный код, но зато с многоуровневыми трудно прослеживаемыми связями.
          Утрируя, на СИ программе что ты видишь в данном месте, то и делается.
          А на С++ в сложных случаях нужно просматривать всю иерархию все варианты перегрузки и шаблоны, чтобы разобраться: а что же здесь на самом деле делается? Какой конкретно код выполняется? Какую структуру имеет объект?.
          Цитата JoeUser @
          Незнакомое - всегда вызывает трудности на первых порах

          Но согласитесь, что "порог вхождения" в программирование на С++ гораздо выше, чем "порог вхождения" в программирования на "чистом" СИ.
          Я и задумался: изучать С++ сложней, кодить на нем, как я понимаю, тоже сложнее, а выигрыш то тогда в чем? :blink:

          Цитата JoeUser @
          Тогда "визуально усложняя код" - по сути делаешь его более системным, логичным, а следовательно, более понятным.

          Знаем, знаем.
          "Сложные действия упрощаются за счет усложнения простых"

          Цитата JoeUser @
          а к чему все эти вопросы? Почему бы просто не начать постепенно от простого к сложному?

          Просто при изучении С++ возникли такие мысли (которые я описал в корневом сообщении) и стало интересно мнение профи.


          Просто прежде чем в лоб начинать решение сложной задачи я всегда думаю: а может есть какие-то обходные пути?
          Говорят, что c## реализует ещё больше функционала, а при этом все гораздо проще и прозрачней. Т.е. "порог вхождения" в C## ниже чем "порог вхождения" в "C++".
          А если "качество не лучше, то зачем больше платить?"
          Вот я и думаю: а на чем же все таки писать код?

          Добавлено
          Хотелось бы конкретных примеров.
          Типа таких "вот человек решал эту задачу (описание задачи) на СИ полгода. Я сделал её на С++ на неделю"
          Сообщение отредактировано: Исмаил Прокопенко -
            Нет, Исмаил Прокопенко, ты подходишь к C++ с позиции C. Это неверно, потому и кажется сложным. На C у тебя нет вариантов, кроме как разобраться "как это работает", на C++ этого не требуется, достаточно знать "как этим управлять". Конечно, можно программировать на C++ в стиле C, и в этом случае выигрыш будет исчезающе мал, если вообще будет. Если ты столкнулся с подобным чужим проектом, и тебе надо его дальше вести, что ж поделать, если только всё не переписать.

            Добавлено
            Высокий порог вхождения в Плюсы – это миф. Требуется много времени, чтобы освоить его фичи, с этим никто не спорит, однако чтобы начать использовать язык, знать требуется даже меньше, чем в С или Дельфи.
              Исмаил Прокопенко, мне лично в с++ нравится наличие ООП.
              Благодаря такому подходу можно описывать реальные объекты окружающего мира (конкретных вещей) используя классы и их наследие.
              Взаимодействие между объектами непосредственно, без единого центра обработки.
              (при желании можно и с ним нагородить).
              Когда имеется в пределах сотни объектов, код на Си выглядит как перебор массива или цепочки (мб даже кольца). Код на с++ с использованием классов выглядит гораздо проще. И даже дело не в том, как он выглядит, а в том как работает - полнейшая динамика. Достаточно описать принцип работы объекта, и его экземпляры будут дергать сами за нужные ниточки.
              Очень большое достоинство с++, на мой взгляд, в особенности низкоуровневого представления данных. Их не прячут в контейнерах, скрывая в памяти, всегда, что бы не писалось, можно свободно добраться к самим байтам данных и сделать все что нужно.
              Сам лично шаблоны (STL, ATL) не ковырял, мне вот как-то не понадобились они, у меня редко крайне попадается одинаковый по смыслу код, но разный по данным. Обычно хватает простого интерфейса между классами, и объекты состыковываются с себе подобными в рамках интерфейса.
              Насчет C# - хорошая вещь, позволяет сосредоточиться на программировании задачи и не сильно париться с представлением данных, вызывая лишь нужные конструкции. На практике у меня с ним не срослось по двум причинам: 1 - работает оно на виртуалтной машине .net framework, т.е. программа компилируется в байт-код и не исполняется, а интерпретируется. 2 - есть гора и малая тележка стандартных функций, но постоянно нет того, что нужно, и руки связаны, в результате все уходит в говнокод преобразований представлений данных.

              С++ - язык для инженера, который представляет и понимает "данные". Он позволяет свободно манипулировать ими, с настоящей производительностью.

              А вообще, смотря что за задача.
              Иногда ооп просто не нужен, он лишний, иногда без него написать софтину просто не получается.

              Если говорить о процедурных языках, почему бы не писать сразу на - асме? - милое дело, он уж очень прост. Но написать на нем нечто длинное и динамичное - не легкая задача.
                Цитата Qraizer @
                Требуется много времени, чтобы освоить его фичи

                А разве это не есть "высокий порог вхождения"?
                Я бы ещё сказал не "его фичи", а "конкретно его фичи"
                Ибо осваивание обще алгоритмических вещей, которые есть во всех языках (конструкции типа "IF..THEN..ELSE" и т.п.) естественно никаких сложностей не вызывает. Их можно освоить за полчаса.
                А вот более высокоуровневые вещи освоить гораздо трудней.
                  Цитата Исмаил Прокопенко @
                  Километры простого кода, или компактный код, но зато с многоуровневыми трудно прослеживаемыми связями.
                  Благодаря простоте связи в C довольно быстро образуются, быстро набирают сложность, и вот тогда их в нём действительно сложно отследить.
                  В C++ (и других языках поддерживающих ОПП), если действовать аккуратно, можно вообще обойтись только простыми связями. Иногда правда при этом можно потерять в эффективности.
                  В принципе, немного поднапрягшись, можно и в C упростить связи до такой степени, но при этом всё равно придётся держать в голове (или на бумаге) всю структуру программы (а это связи опять сложные). И придётся вводить очень строгую дисциплину.
                    Цитата Qraizer @
                    Требуется много времени, чтобы освоить его фичи, с этим никто не спорит, однако чтобы начать использовать язык, знать требуется даже меньше, чем в С

                    Чтобы написать "Hello World" возможно.
                    И "порог вхождения" в C++ ещё и потому высок, потому что писать хоть сколько то сложные программы невозможно без специализированных тулзов, типа IDE, браузеров иерархии классов и т.п.

                    А на СИ можно писать хоть в нотепаде.
                    А чтобы писать эффективно на С++ нужно освоить весьма сложные и навароченные инструменты. Как минимум Visual Studio со всеми примочками.

                    Мало того, что синтаксис С++ на порядок сложней синтаксиса "чистого" C.
                    Так ещё нужно разбираться в работе специализированных тулзов для рефакторинга и т.п..

                    Т.е. при написании кода на С++ нужно "держать в голове" не только все особенности синтаксиса и твоей модели иерархии классов. Но нужно ещё "держать в голове" все особенности тулзов, с которыми работаешь.
                    Получается что процесс коддинга на С++ сильно усложняется.

                    Поэтому вопрос: а что это дает? Чем компенсируются все эти сложности?
                    Сообщение отредактировано: Исмаил Прокопенко -
                      Цитата Исмаил Прокопенко @
                      писать хоть сколько то сложные программы невозможно без специализированных тулзов, типа IDE, браузеров иерархии классов и т.п.
                      В основном пользуюсь обычным редактором. Не в нотепаде конечно, там даже короткие пакетные файлы неудобно редактировать. Тудзами для рефакторинга не пользуюсь, стараюсь сразу писать нормально.
                        Цитата amk @
                        В C++ (и других языках поддерживающих ОПП), если действовать аккуратно, можно вообще обойтись только простыми связями.

                        Гм. "Простыми"?
                        К примеру есть код:
                        ExpandedWrap disabled
                          A=f(b,c);

                        Просто и естественно.
                        Как девственница на панели.

                        Просто?
                        Если не надо разбираться: а что такое эти A, b и c? Какой они тип имеют в этой точке программы?
                        А какая именно функция здесь подразумевается под f?
                        А какая функция выполняется под знаком "="?
                        А если иерархия имеет 5 уровней с перекрестным наследованием и виртуальными и многократно перегруженными функциями (в том числе и конструкторами)? Просто?
                        И тут придется перелопачивать столько кода и проанализировать столько зависимостей (зачастую неявных, как говорят "по умолчанию"), что мама не горюй.
                        Если чтобы понять когда f вызовется нужно просмотреть всю иерархию и все варианты перегрузки. А учитывая RTTI и "неявное продвижение типа", то понять что же за функция тут вызывается, что она делает и над какими объектами - то ещё "удовольствие"..

                        Цитата Qraizer @
                        На C у тебя нет вариантов, кроме как разобраться "как это работает", на C++ этого не требуется, достаточно знать "как этим управлять".

                        Про абстракцию я в курсе ещё когда всерьез и основательно учил С++ лет 15 назад, так же как про разговоры, что не понимание того, как работает трансмиссия не мешает же водить автомобиль.
                        Но все хорошо, пока все хорошо.
                        Проблемы начинаются когда автомобиль почему-то вдруг не едет, а блондинка не знает почему, потому что не понимает как он устроен.

                        Цитата amk @
                        стараюсь сразу писать нормально.

                        Все дело в том, что фраза "писать код" не совсем верно отражает то, чем занимается программист.
                        Потому что 90% времени программист не код пишет, а ЧИТАЕТ его (независимо от того, свой это код или чужой) и ищет причины багов.
                        И тут приходится "лезть в кишки" всех этих "черных ящиков".
                        Вот тут и всплывают в ПОЛНЫЙ РОСТ все эти многоуровневые и трудно прослеживаемые завязки/зависимости.
                        Когда смотришь на строчку "С=A+B" и не понимаешь: что это?
                        Нужно перелопатить всю иерархию все варианты перегрузки и шаблоны, чтобы понять.
                        Сообщение отредактировано: Исмаил Прокопенко -
                          Цитата Исмаил Прокопенко @
                          И тут приходится "лезть в кишки" всех этих "черных ящиков".
                          Это противоречит парадигме ООП. При написании одного "чёрного ящика", ты не должен как-то учитывать реализацию остальных. Можешь её даже и не знать. А значит и при отладке тебе незачем лезть во внутренности остальных "ящиков".
                          А вот при функциональном подходе, тебе приходится хотя бы проверить, какой из остальных "ящиков"-функций вызвался, и к какой конкретно переменной произошло обращение.
                            Цитата Исмаил Прокопенко @
                            Хотелось бы конкретных примеров.
                            Типа таких "вот человек решал эту задачу (описание задачи) на СИ полгода. Я сделал её на С++ на неделю"

                            Очень много страшилок! :lol:

                            Давай крохотный эксперимент. Напишем программку, которая разберет процитированное тобой по словам, просчитает частоты, и выведет список слов по убыванию частот. При условии, если частоты одинаковые - сортируем в алфавитном порядке (с учетом регистра). Вот тебе мой код нс С++:

                            ExpandedWrap disabled
                              #include <iostream>
                              #include <regex>
                              #include <map>
                               
                              typedef std::pair<std::string,int> PairType;
                               
                              int main() {
                                try {
                                  std::string Text =
                                  
                                    "Хотелось бы конкретных примеров.\n" \
                                    "Типа таких \"вот человек решал эту задачу (описание задачи) на СИ полгода." \
                                    "Я сделал её на С++ на неделю\"";
                                    
                                  std::regex Regex("([\\s,\\.=\\(\\)\\\"+-]+)");
                                  std::sregex_token_iterator Begin(Text.begin(),Text.end(), Regex, -1);
                                  std::sregex_token_iterator End;
                                  std::map<std::string,int> Map;
                                  std::vector<PairType> P;
                                  while (Begin != End) Map[*(Begin++)]++;
                                  for(const auto &i:Map) P.push_back(std::make_pair(i.first,i.second));
                                  std::sort(P.begin(),P.end(),[](const PairType &i, const PairType &j) {
                                    if (i.second == j.second) return i.first < j.first;
                                    return i.second > j.second;
                                    }
                                  );
                                  for(const auto &i:P) std::cout << i.first << " : " << i.second << std::endl;
                                } catch(...) {
                                  std::cout << "Нарвались на засаду!" << std::endl;
                                }
                                return 0;
                              }

                            Скрытый текст
                            ExpandedWrap disabled
                              на : 3
                              С : 1
                              СИ : 1
                              Типа : 1
                              Хотелось : 1
                              Я : 1
                              бы : 1
                              вот : 1
                              её : 1
                              задачи : 1
                              задачу : 1
                              конкретных : 1
                              неделю : 1
                              описание : 1
                              полгода : 1
                              примеров : 1
                              решал : 1
                              сделал : 1
                              таких : 1
                              человек : 1
                              эту : 1


                            Напиши, пожалуйста, это на чистом Си. Ну а потом мы сравним, что получается сложнее. Договорились?

                            Добавлено
                            Цитата Исмаил Прокопенко @
                            А на СИ можно писать хоть в нотепаде.

                            И да ... написал это считай в нотпаде - прям на сайте онлайн компилятора.
                              Цитата Исмаил Прокопенко @
                              Гм. "Простыми"?
                              К примеру есть код:

                              A=f(b,c);

                              Просто и естественно.
                              Как девственница на панели.

                              Просто?
                              Если не надо разбираться: а что такое эти A, b и c? Какой они тип имеют в этой точке программы?

                              Ужасный код, он ничего не говорит о себе.
                              В современном программировании принято называть вещи своими именами.
                              Вспомните о "Венгерской нотации", например.

                              Например:
                              ExpandedWrap disabled
                                User = CreateNewStandartUser(lpszName, iAge);
                              Функция создает экземпляр стандартного пользователя, с указателем на строку, финализированную нулем. И возраст - integer.
                              Это видно сразу из строки кода и понятно.
                              Код нужно писать понятно, для себя же.
                              Сообщение отредактировано: simsergey -
                                Цитата amk @
                                Это противоречит парадигме ООП. При написании одного "чёрного ящика", ты не должен как-то учитывать реализацию остальных. Можешь её даже и не знать. А значит и при отладке тебе незачем лезть во внутренности остальных "ящиков".

                                Я в курсе.
                                Но это все в теории, в идеале.
                                А в реале есть плохо написанный, плохо задокументированный, содержащий баги код.
                                И чтобы понять, что означает строчка A=B+C и почему она криво работает приходится "лезть в кишки" и прослеживать все связи и зависимости.

                                Добавлено
                                Цитата JoeUser @
                                Вот тебе мой код нс С++

                                Кстати да.
                                Я уже перечислял что увеличивает "порог вхождения" в программирование С++ (сложный синтаксис, необходимость знания спец. инструментов, сложность самой объектной модели), а Вы своим кодом напомнили, что я забыл упомянуть.
                                Опустил всякие надстройки из стандартной библиотеки (типа контейнеров, словарей, "for each" и т.п.)
                                Их тоже нужно знать для успешного написания кода.
                                А есть ещё Qt и др. фреймворки. Их тоже нужно знать.
                                А ещё разные бактрекеры, системы автодокумментирования, системы контроля версий

                                Сколько всего нужно знать и держать в голове когда кодишь на С++.

                                И это называется "упрощение программирования"?
                                В чем оно? Это "упрощение".
                                Я вижу что кодить становится все сложней и сложней
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (32) [1] 2 3 ...  31 32


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0571 ]   [ 16 queries used ]   [ Generated: 28.03.24, 19:56 GMT ]