Arlleex 83 May 12, 2021 Posted May 12, 2021 · Report post Приветствую! Все-таки со временем понимаю, что чего-то не хватает при программировании на Си. Много типового кода, который мозолит глаза лишь своим объемным синтаксисом. Много лишних сущностей, которые хотелось бы скрыть внутри какой-то одной. Отсутствие пространств имен усложняет процесс именования модулей или программных объектов. Давно заметил, что компилятор C++ порождает очень даже оптимальный код. Много интересных механизмов заложено в самом принципе ООП, которые хотелось бы изучить и применять в разработке ПО. В университете был курс по C++, да вот многое я уже тупо забыл. И вот хочу наверстать. Только есть одно но: как осуществить плавный переход? Вот пишу я в Keil uVision 5, все проекты были на Си + asm, весь универсальный код тоже на Си. Что теперь? Создавать проект для C++ и с помощью extern "C" и дальше временно пользоваться всеми наработками, постепенно подмешивая логику уже на C++? Или как? Какую литературу можете порекомендовать для уверенного пользования C++? Хотелось бы, конечно, еще разбираться и в механизмах всех ООП-штучек на бинарном уровне, дабы не удивляться ничему под отладчиком (хотя... когда-то на Си эмулировал виртуальные функции и частично исключения) - я ж дотошный. Многие пришли в МК сразу со знанием C++, т.к. учились программировать именно на нем. Моя цель - сохранить качество/производительность результирующего бинарного кода при синтаксическом упрощении исходников. Сейчас, как раз, стоит задача (факультативная) написать верхний уровень для сети CAN. Всю логику продумал, все нравится. Но представил, как это будет выглядеть для пользователя (того, что будет юзать тот API - это и я в том числе), как захотелось утащить все в класс и скрыть реализацию, вытащив наружу только некие init(), get()/set() и т.д. Почему я не перешел на C++ до этого? Да все банально: та литература, которую доводилось читать, не была полна информацией. Например, о неких "делегатах" и "синглтонах" я узнаю, почему-то, на форуме, а не из учебника "В. Пупкин. C++ от А до Я". Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 77 May 12, 2021 Posted May 12, 2021 · Report post 15 минут назад, Arlleex сказал: Создавать проект для C++ и с помощью extern "C" и дальше временно пользоваться всеми наработками, постепенно подмешивая логику уже на C++? Да. 15 минут назад, Arlleex сказал: Например, о неких ... "синглтонах" Забудьте о них, если ваши программы должны быть быстрыми. Да, выглядит удобно, но в реализации чудовищно (грубо - в начале каждого обращения идет чтение и проверка статической переменной. Т.е. реально это нужно один раз в момент старта, а тормозит программу всю ее оставшуюся жизнь, до выключения). Книг не посоветую - сам учил по Страуструпу "язык программирования С++", но она написана скорее для тех, кто уже очень хорошо знает плюсы - основ там нет. Перечитывал раза четыре (пропуская непонятное) и даже в четвертый раз все еще пропускал очень многое. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 83 May 12, 2021 Posted May 12, 2021 · Report post Сергей, спасибо. На просторах сети видел, как некоторые программисты утверждали, что изучали C++ по самому Стандарту, а принципы ООП-организации программ и методологии проектирования изучали вовсе ортогонально по другим источникам. Интересно, насколько такой ход событий вероятен в плане результативности. Для себя сейчас рассматриваю либо уроки на youtube (хотя там тоже надо уметь отсеивать мусорные каналы), либо книги Герберта Шилдта. На полке же у меня валяется куча книг, которые я бросил, не прочитав и 100 страниц (скучны и монотонно-одинаковы), среди которых такие авторы, как Павловская, Подбельский и т.д. Хотя для них, скорее, определяющим фактором, наверное, является моральное устаревание и несоответствие каких-то моментов современным реалиям. Quote Share this post Link to post Share on other sites More sharing options...
Forger 16 May 12, 2021 Posted May 12, 2021 · Report post 41 minutes ago, Arlleex said: Например, о неких "делегатах" и "синглтонах" я узнаю, почему-то, на форуме, а не из учебника "В. Пупкин. C++ от А до Я". Есть нормальные книги от спецов с богатым опытом именно в плюсах. Не учебники, а скорее свод правил и личного опыта. Они мне лично оказались более познавательны, чем нудятина из учебников ))) Рекомендую вот эти: Р. Мартин - "Чистый код" Ален И. Голуб - "Веревка достаточной длины, чтобы выстрелить себе в ногу" также книги Скотта Мейерса Все равно придется самостоятельно пройти этот путь и найти свой подход, брать чужой за основу можно, но у всех авторов выше он разный. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 122 May 12, 2021 Posted May 12, 2021 · Report post 1 час назад, Arlleex сказал: Создавать проект для C++ и с помощью extern "C" и дальше временно пользоваться всеми наработками extern "C" иногда нужен только для взаимодейтия с кодом на других языках (ассемблер например, или может если код представляет из себя смесь си/си++ кода (не знаю, не делаю так)). Да и то не обязательно: можно прочитать про манглинг имён в с++ и обойтись без extern "C" (я чаще всего так и делаю): PUBLIC _Z10UDivH32L32mm THUMB ;u32 UDivH32L32(u32 x, u32 y); _Z10UDivH32L32mm: CLZ R2, R0 LSLS R0, R2 CLZ R3, R1 LSLS R1, R3 ... 1 час назад, Arlleex сказал: Сергей, спасибо. На просторах сети видел, как некоторые программисты утверждали, что изучали C++ по самому Стандарту Я изучал (более 20 лет назад) по некой синей книжице в мягком переплёте. Название "От Си к Си++", авторов не помню. Поискал сейчас и нашёл её в инете: https://www.goodreads.com/book/show/20319117 В отличие от других вариантов там: 1) нет воды (пустопорожних рассуждений и отступов от темы) многократно раздувающей текст; 2) материал даётся из расчёта, что читатель уже хорошо знаком с си (опять-же - меньше ненужной, уже известной информации); 3) описание каждой сущности идёт вплоть до деталей (например расписан синтаксис явного вызова конструктора для указателя, что не во всякой книге есть; и многое другое); 4) нет новомодных финтифлюшек (типа синглтонов и пр. малополезных сущностей), так как книга довольно старая. Классы, наследования, перегрузки, полиморфизм и пр. расписаны в деталях, но без воды. Quote Share this post Link to post Share on other sites More sharing options...
ViKo 2 May 12, 2021 Posted May 12, 2021 · Report post Для меня самая полезная книга - Стивен Прата, Язык программирования C++.https://www.ozon.ru/context/detail/id/7979735/ Я остановился на экспериментальных проектах, пока нет полностью рабочего (уже не знаю, будет ли). Классы, шаблоны использую. И все эти новые штуки C++11. Очень интересно и удобно. Приложение И у него очень полезно. Прямо, руководство по переходу на C++. Quote Share this post Link to post Share on other sites More sharing options...
one_eight_seven 0 May 12, 2021 Posted May 12, 2021 (edited) · Report post 1 hour ago, Arlleex said: Для себя сейчас рассматриваю... Есть неплохая книга David West - Object thinking. Она именно об объектно-ориентированном подходе к решению задач. Правда, голова автора забита идеалистической чушью, и поначалу мне это мешало воспринимать эту книгу, но потом я привык просто отбрасывать всю эту шелуху, и стало нормально. Что касается именно самого объектно-ориентированного подхода - с этим у автора всë более, чем хорошо. Edited May 12, 2021 by one_eight_seven Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 83 May 12, 2021 Posted May 12, 2021 · Report post Всем спасибо, все комментарии для меня весьма полезны, даже если я кого-то не цитирую лично. Полагаю, самым трудным будет только переосмысление подхода к проектированию: нужно уйти от структурного программирования к ООП. Очень часто слышал о том, что новичкам в C++ это даром не дается. Я помню это и по своему переходу с asm на Си, когда я писал под AVR. Поначалу была куча goto, потом пришло некое просветление, что ли. Самое неприятное, ИМХО, это увидеть через год свои потуги и послушать своего внутреннего перфекциониста все это переписать. А через год - итеративно еще раз, а потом еще и так до бесконечности - нет предела совершенству Quote Share this post Link to post Share on other sites More sharing options...
Forger 16 May 12, 2021 Posted May 12, 2021 · Report post 5 minutes ago, Arlleex said: Я помню это и по своему переходу с asm на Си, asm -> C переход за неделю, а вот на плюсы действительно переходить можно всю жисть )) Quote Share this post Link to post Share on other sites More sharing options...
heavyC1oud 0 May 12, 2021 Posted May 12, 2021 · Report post 2 часа назад, Arlleex сказал: Много интересных механизмов заложено в самом принципе ООП, которые хотелось бы изучить и применять в разработке ПО "Приёмы объектно-ориентированного проектирования. Паттерны проектирования" уже 20 лет переиздают, хорошая книга Quote Share this post Link to post Share on other sites More sharing options...
dimka76 30 May 12, 2021 Posted May 12, 2021 · Report post 2 hours ago, Arlleex said: Создавать проект для C++ и с помощью extern "C" и дальше временно пользоваться всеми наработками, постепенно подмешивая логику уже на C++? Или как? У меня конечно большого опыта в С++, как у вышевысказывшихся, но я переводил файла с Си на С++ тек. В программном модуле на Си перед каждой функцией добавлял имя класса. Например, было так void servo_move(int32_t time) { .... } Стало так void cservo::servo_move(int32_t time) { .... } Ну, и соответствующие правки в заголовочном файле программного модуля. Таким образом, программный модуль на Си превращался в класс на С++. Из книг читал Страуструпа - очень тяжелое чтиво. А начинал с прочтения Стефан Р. Дэвис. "С++ для чайников" - читается легко, местами с юморком. Всякими наворотами не пользуюсь. Классы, наследование, иногда перегрузка функций, шаблоны только чужие ))) Quote Share this post Link to post Share on other sites More sharing options...
Leka 0 May 12, 2021 Posted May 12, 2021 · Report post 24 minutes ago, Arlleex said: нужно уйти от структурного программирования к ООП Кому нужно? Писанины меньше не станет. Quote Share this post Link to post Share on other sites More sharing options...
Forger 16 May 12, 2021 Posted May 12, 2021 · Report post 41 minutes ago, Leka said: Кому нужно? Писанины меньше не станет. Ну, все, началось. Тему можно закрывать Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 83 May 12, 2021 Posted May 12, 2021 · Report post 56 минут назад, Leka сказал: Кому нужно? Очевидно получается, что мне. Цитата Писанины меньше не станет. Еще как станет. Шаблоны, наследование, инкапсуляция - все это хорошие механизмы сокращения объемов исходников. Пространства имен - отличный способ не тянуть к вызову метода расширение области видимости (::) и название класса - для организации модульности и лаконичности это очень хорошо подходит. Я в Си, допустим, к функциям, объявленным глобально, приписываю префикс, например, can_SendMsg(), dbg_Print(). Однако при увеличении сложности проекта становится больше модулей и, во-первых, называть их хочется кратко, чтобы префикс не позорил всего имени, а во-вторых, появляются модули с чуть ли не одинаковым названием, похожим API и функционалом, но реализующие совсем разные уровни обработки данных. В C++ же я могу объявить пространство имен нужных мне классов и сократить количество мозолей в глазах от лишних cCAN::SendMsg(), cDBG::Print(), записывая просто SendMsg(), Print() в подходящих местах. Т.е. именование становится контекстно-зависимым, а не как в Си - прямым по имени и только лишь. Quote Share this post Link to post Share on other sites More sharing options...
Leka 0 May 12, 2021 Posted May 12, 2021 · Report post 27 minutes ago, Forger said: Ну, все, началось. Тему можно закрывать Про ООП не буду, хочу только затронуть тему рефакторинга. Когда объем исходников раздувается, переписываю все (не меняя функциональности), с целью в разы сократить объем кода. При таком подходе теряется особый смысл в повторном использовании кода, а ценным становится возможность лаконичного написания с _нуля_. 27 minutes ago, Arlleex said: все это хорошие механизмы сокращения объемов исходников Только в смысле повторного использования кода. Quote Share this post Link to post Share on other sites More sharing options...