Как я могу научиться писать идиоматические C ++?

27

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

Мне все хорошо с my char*и *(int*)(someVoidPointer)idioms, но недавно, сделав (незначительный) вклад в проект с открытым исходным кодом, я чувствую, что это не то, что нужно думать при написании кода C ++. Это сильно отличается от C.

Учитывая, что я достаточно хорошо знаю объектно-ориентированное программирование, и у меня все в порядке с крутой кривой обучения, что бы вы посоветовали мне, чтобы я занялся треком C ++, когда я пишу код на C ++?

Яти Сагаде
источник
7
Основываясь на ваших комментариях, вы знаете синтаксис C ++ и все. Вы не кодируете в C ++. Тег C ++ на StackOverflow является хорошим местом для начала, она включает в себя список чтения и FAQ . Единственный реальный способ обучения - это написать код и заставить опытного пользователя комментировать. Вы можете разместить свой код здесь для просмотра. Хороший пример
Мартин Йорк
1
Наряду с советом @LokiAstari (с которым я согласен), я бы сказал, что ваши друзья правы, и, вероятно, хорошей идеей будет пробиться через Accelerated C ++ . Я подозреваю, что вы обнаружите, что требуется намного меньше скимминга, чем вы ожидаете - он предназначен для людей на вашем месте, уже знающих программирование и в первую очередь нуждающихся в изучении идиом современного C ++.
Джерри Гроб
да, на самом деле я закончил первые две главы, но в основном это было то, что я уже знал - я понимаю, что автор не просто выйдет и напишет для меня книгу , хотя :) @LokiAstari спасибо за суперинформативный комментарий :)
Яти Сагаде
3
@yatisagade Не ждите, что книга обучит вас менталитету языка в нескольких главах. Это может быть очень скучно, поскольку вы уже знаете синтаксис, но вы должны посвятить себя чтению пары книг по С ++, чтению всего и выполнению каждого упражнения, так как вы были новичком в языке. Неправильное обучение означает, что вы должны удвоить свои усилия, так как вам нужно забыть ошибки и изучить права (или что-то в этом роде).
Яннис
1
У меня все хорошо с [...] - (int) (someVoidPointer) Когда-нибудь раньше отлаживали 64-битную сборку?
Эд С.

Ответы:

12

Основываясь на ваших комментариях, вы знаете синтаксис C ++.
Вы пишете не на C ++, а на классах, которые часто называют C.

Тег C ++ на stackoverflow - хорошее место для начала, он включает в себя список чтения и FAQ .

Единственный реальный способ обучения - это написать код и заставить опытного пользователя комментировать. Вы можете разместить свой код здесь для просмотра. Хороший пример

Мне все хорошо с моими "char *"

Прекратите их использовать, переключитесь на std :: string.

и (int) (someVoidPointer) идиомы.

Прекратите использовать их (кроме как для взаимодействия с кодом C). Использование концепции функтора дает несколько преимуществ (включая идею инкапсуляции состояния).

Но недавно, после внесения (небольшого) вклада в проект OSS, я чувствую, что вы не так думаете в C ++. Это сильно отличается, хотя C имеет свое место.

Да. C и C ++ разошлись как языки. Хотя вы можете использовать практически тот же синтаксис, что и считается хорошим кодом C, обычно не считается хорошим кодом C ++ (или наоборот).

Некоторые друзья предложили Accelerated C ++, но опять же я знаю, что такое типы, что такое классы и что такое перегрузка.

У вас есть самые основы вниз.

Как может (изуродованный) программист C ++, который, как оказалось, знаком с концепциями ОО, писать идиоматические программы на языке.

С большой работой :-)

Мартин Йорк
источник
Это не единственный способ. Вы можете многому научиться из хороших книг.
Дима
1
@Dima: Абсолютно. Вы можете многому научиться из книг. Но ничто не сравнится с опытом и использует язык в гневе, если не повторить попытку, то снова потерпеть неудачу и найти лучший способ сделать это. Я полагаю, вы можете выучить французский язык из книги, но сомневаюсь, что французы будут считать вас беглым.
Мартин Йорк
6
ИМХО, самый эффективный способ обучения - это начать с книг, научиться правильно делать что-то, попробовать на практике, а затем попросить кого-нибудь критиковать ваш код.
Дима
@Dima: я не спорю с этим.
Мартин Йорк
12

Книга Effective C ++ рассказывает о многих интересных вещах и поможет вам оценить возможности C ++. Существует также Эффективный STL - я не читал его, но я уверен, что было бы здорово прочитать, если вы не знакомы с ЗППП.

Важно учиться тому, что вы должны использовать язык и не изобретать велосипед постоянно . Вы уже научились их делать, поэтому упростите себе (и другим!) И используйте инструменты, чтобы реализовать весь их потенциал.

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

Pubby
источник
Я знаю об эффективных сериях, (не читал их) - Но я думаю, что они для лучших практических вопросов, верно?
Яти Сагаде
3
@yati sagade: нет, эти книги - именно то, что вам нужно, чтобы перейти от "C с классами" к полноценному C ++.
Дима
Я вижу - на самом деле у меня был эффективный c ++ от Meyers, выстроенный в линию после Accelerated C ++.
Яти Сагаде
1
@Dima "Цель этой книги - показать вам, как эффективно использовать C ++. Я предполагаю, что вы уже знаете C ++ как язык, и у вас есть некоторый опыт его использования. Здесь я приведу руководство по использованию языка, чтобы Ваше программное обеспечение является понятным, обслуживаемым, переносимым, расширяемым, эффективным и, вероятно, будет вести себя так, как вы ожидаете. "- Эффективный C ++. Это также покрывает много "ошибок", которые делают это интересным читать.
Пабби
1
@Dima: Осторожно здесь. 2-е издание предназначено для новых программистов на C ++, пришедших из C. (Последнее) 3-е издание больше предназначено для программистов,
работающих на
6

Я могу рекомендовать недавний дубль BUILD, данный Хербом Саттером. Один из них называется « Написание современного кода C ++: как C ++ развивался годами »:

Многие люди думают о C ++ как о том же языке, который они испытали в колледже, или просто как «C с классами», но язык C ++ значительно развился за эти годы. На этом занятии мы рассмотрим, как вы можете использовать C ++ для создания инновационных, выразительных и красивых приложений, которые обеспечивают мощные и производительные приложения. Присоединяйтесь к нам, чтобы увидеть, как недавно законченный стандарт C ++ 0x может сделать написание C ++ столь же продуктивным, как и многие другие языки.

Неплохая презентация, не слишком длинная, имеет несколько хороших указателей на новые функции в новейшем стандарте, которые дадут вам несколько советов по обновлению вашего старого стиля C / C ++.

Кроме того, вам нужно изучить STL - это не сложно, и есть много книг, например, Effective STL, или просто google для STL учебников, чтобы вы могли начать.

gbjbaanb
источник
+1 Спасибо. Это было прекрасно. Я счастлив, что задал этот вопрос. Так много замечательных ссылок :)
Yati Sagade
4

Я прочитал « Ускоренный C ++ » Эндрю Кенига и Барбары Му, чтобы помочь мне преподавать C ++, проработав с C ++ почти десять лет. (На самом деле, в то время я начал возиться с шаблонным метапрограммированием.) Я все еще находил это откровением, хотя я не думаю, что оно научило меня новым фактам о языке. 1

Что меня научило, так это посмотреть на C ++ и использовать его как язык высокого уровня. Не возиться с необработанными указателями и deleteиспользовать стандартную библиотеку везде, где это возможно.

У меня такое ощущение, что это именно то, что вы после.

1 Не то чтобы у меня не было ничего, что могло бы научить меня в то время (даже сейчас, много лет спустя, их было много), но есть только столько знаний, которые вы можете втиснуть в вступительную книгу на 250 страниц.

SBI
источник
1

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

Сказав это, вы бы хорошо проверить:

Сайт codereview.SX

Сеть StackExchange имеет сайт с именем codereview.stackexchange.com. . Если вы написали кусок кода C ++ - класс, часть библиотеки, что-то не слишком большое - вы можете опубликовать его там и попросить сообщество просмотреть его. Обратите внимание, что код должен компилироваться и быть в основном функциональным - этот сайт не предназначен для отладки.

Кроме того, вы можете найти там некоторый код C ++, связанный с тем, над чем вы работаете, и посмотреть, что подчеркивают рецензенты. Вы можете даже попытаться просмотреть опубликованный код самостоятельно, не публикуя ответ, а затем прочитать, что другие думают об этом.

C ++ конференции видео-презентации

Ежегодно проводится несколько конференций разработчиков, посвященных C ++:

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

Иногда вы можете даже получить слайд-колоды динамиков.

einpoklum - восстановить Монику
источник
0

Ну, проекты с открытым исходным кодом - это очень хорошее начало. Не ожидайте, что станете профессиональным программистом на основе ваших университетских классов, они не предназначены для этого (как я написал в своем ответе здесь ).

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

Профессиональные книги также очень хорошая идея, как уже упоминалось, и просмотр вопросов и ответов в StackOverflow многому научит вас (это, безусловно, многому меня научит, и я считаю себя профессионалом C ++).

littleadv
источник
-1

Чтение хорошего кода на C ++, вероятно, поможет. Вы должны увидеть код, чтобы начать чувствовать его. Опять же, большая часть кода на C ++ неверна.

кодировщик
источник
«Большая часть кода на C ++ неверна» - можете уточнить? Я видел, что большинство проектов OSS поддерживают высокие стандарты качества.
Яти Сагаде
1
Проекты, да, но поиск того, что делать, довольно часто приводит к плохим примерам.
Кодер
1
@yati: Мой опыт проектов OSS противоположен.
СБИ
@sbi возможно - я принимал участие в проекте Mozilla и Google Chrome (на самом деле здесь не участвовал, но учился). Нашел свою дисциплину выдающейся!
Яти Сагаде
@yatisagade: По крайней мере, большая часть существующего кода на C ++ была написана, когда язык имел функции, которые сегодня необходимы для написания хорошего кода; и большинство остальных написано с использованием библиотек, которые были написаны для работы с таким старым кодом, поэтому этот новый код должен быть адаптирован к ним, в некоторой степени. И все это независимо от того, вкладывают ли кодеры время и усилия, необходимые для достойного проектирования и реализации ...
einpoklum - восстановить Monica