Уже есть много хороших ответов. Моя будет больше ориентирована на мышление.
Данные против действий!
- В C все сделано так, чтобы думать, как применить этот эффект к этим данным.
- В C++ это больше похоже на поведение Data.
В то время как поведение данных может быть выполнено в C (и это сделано!), в C++ все необходимое для простой реализации этого уже доступно: инкапсуляция, конструкторы, переопределение перегрузки, шаблоны и т. д..
Я обнаружил, что эта идея "Данные должны вести себя" является очень хорошим руководящим принципом при написании кода на C++.
Синтаксический сахар С++ не является обязательным
Вы найдете множество функций C++, которые можно реализовать на C, и некоторые люди используют это как предлог, чтобы не изучать их. Такое мышление опасно (это часть относиться к C++ как к новому языку, а не как к расширению, которую можно увидеть в некоторых сообщениях).
Побочным эффектом отказа от написания C++ способом C++ является то, что, хотя разработчик C++ должен понимать код C++, он/она не должен понимать вашу маленькую личную структуру, имитирующую сахар C++ с функциями только C. На самом деле его не заинтересует ваш фреймворк. По правде говоря, он/она почувствует к вам только жалость/презрение, потому что вы потеряли драгоценное время на это. В конце концов, он/она возненавидит вас, если ему/ей придется использовать ваш фреймворк вместо сахара C++.
Руководящие принципы, подобные тому, что я могу сделать это в стиле C, просто заставят вас упустить фургон. Лучше вообще не начинать изучать C++, если у вас уже есть такой C-ориентированный образ мышления.
Выбранный вами язык никогда не бывает лучшим. ВЫ должны стать лучшими. Если вы пишете код на С++, то пишите его так же, как на С++.
C-совместимый код C++ является семантической ошибкой
Типизация ваших структур, чтобы сделать их компилируемыми компилятором C, - плохая шутка. Использование указателей вместо ссылок — это пощечина самому себе в будущем. extern "C"
только сделает ваш код слабее, а не сильнее. А использование void *
для универсальности только увеличит число коллег-программистов на C++, которые с радостью заплатят за то, чтобы вам отрубили голову невероятно болезненным способом.
Никогда не пытайтесь писать C-совместимый код, если вам это действительно действительно не нужно.
Вы просто отягощаете себя трудоемким стилем написания кода для функции, которую никогда не будете использовать.
Компилятор — могущественный друг/враг
Работа на низком уровне оказывает странное влияние на некоторых разработчиков. Они очень верят в свой контроль над скомпилированным кодом. Для них сложно делегировать этот контроль конструкциям более высокого уровня.
Хорошим примером этого является отказ от шаблона конструктор/деструктор, потому что иногда конструкторы занимают слишком много времени... Лучше сделать это по-моему....
Компилятор C++ вполне способен оптимизировать явно неоптимизированный код. На самом деле код, созданный компилятором, может сильно отличаться от того, который, по вашему мнению, был создан вами.
Не пытайтесь быть лучше/умнее компилятора, потому что:
- Вы, вероятно, уже проиграли битву, поскольку даже старые компиляторы обычно производят лучший код, чем вы можете мечтать сегодня.
- Даже если сегодня вы выиграли битву, завтра она автоматически обернется поражением, поскольку в будущем компиляторы будут становиться все лучше и лучше, поэтому ваш сегодняшний оптимизированный код станет узким местом программы и предметом рефакторинга в ближайшие годы (не говоря уже о позорные воспоминания для вас).
Так что доверяйте своему компилятору.
Не управляйте созданием своего кода на микроуровне. Делайте свою работу, а компилятор сделает свою.
Обратите внимание, что этот момент не следует использовать для оправдания создания медленного/неэффективного кода. Если преждевременная оптимизация является корнем всех зол, вы все равно должны использовать свои знания языка и компилятора для создания хорошего и эффективного кода (см. следующий пункт).
Знайте преимущества/недостатки/затраты каждой конструкции C++
Например, тот факт, что виртуальные методы добавляют одну косвенность к вызову функции, означает, что для некоторых людей производительность резко снизится. Правда в том, что проблемы с производительностью часто возникают в другом месте.
Невежество не является оправданием.
Знайте код, созданный для каждой конструкции C++ (т. е. встраивание, ссылки, конструктор, деструктор, исключение, перегрузка функции, переопределение функции, шаблон, виртуальная функция и т. д.). Знайте, что будет оптимизировано, а что нет.
Таким образом, вы не только не будете платить за то, что вам не нужно (это руководящий принцип C++), но и получите прибыль от того, что вам ничего не стоит, но приносит много.
Быть скромным
Есть люди, занимающиеся исследованиями в области C++, которые в день своего рождения владели C++ лучше, чем большинство из нас когда-либо сможет. Даже если мы проигнорируем Stroustrup, такие имена, как Мейерс, Абрахамс, Александреску, Sutter и т. д. регулярно появляются вместе с новыми идеями. Несмотря на (или вследствие) свой чужой внешний вид, STL является революционной библиотекой. И такая библиотека, как Boost, несмотря на ее небольшой размер по сравнению с некоторыми полными платформами (такими как API Java или .NET), представляет собой огромный репозиторий превосходного кода, предлагаемого вам для изучения.
Просто потому, что вы находите какую-то новую функцию странной или чуждой, не стоит недооценивать ее. Попытка понять это, ВОЗМОЖНО, даст вам еще один инструмент в вашем распоряжении, и ВСЕГДА улучшит ваше мастерство языка, и ВСЕГДА заставит ваш мозг работать, что хорошо в бизнесе разработки.
Большинство моих знакомых, которым не удалось перейти на C++, просто решили, что та или иная функция бесполезна, потому что не удосужились ее понять.
Если вы не знаете, что это такое, изучите это.
Без RAII ваш код на C++ — это просто код с ошибками, который позволяет избежать ошибки компиляции.
RAII — это самое важное понятие C++.
Все остальное связано.
person
paercebal
schedule
14.09.2009