Як я можу навчитися писати ідіоматичні C ++?


27

Я студент інформатики, і, як результат, мене навчали С ++ як кращу версію С із класами. У кінцевому підсумку я намагаюся заново винайти колесо, коли потрібно вирішити складну проблему, лише щоб знайти якийсь час після цього, якась мовна функція чи стандартна бібліотечна програма може зробити це для мене.

Мені все подобається з моїми char*і *(int*)(someVoidPointer)ідіомами, але останнім часом, зробивши (незначний) внесок у проект з відкритим кодом, я відчуваю, що не так слід думати, коли пишеш код C ++. Це набагато інакше, ніж є.

Враховуючи те, що я досить добре знаю об'єктно-орієнтоване програмування, і я добре з крутою кривою навчання, що б ти запропонував мені, щоб я міг переконатися на доріжці C ++, коли я кодую C ++?


7
На основі ваших коментарів ви знаєте синтаксис C ++ і це все. Ви не кодуєте в C ++. Тег C ++ на StackOverflow є хорошим місцем для початку, вона включає в себе список читання і FAQ . Єдиний реальний спосіб навчитися - це написати код та отримати досвідченого користувача для коментарів. Ви можете поставити свій код тут для ознайомлення. Хороший приклад
Мартін Йорк

1
Поряд із порадою @ LokiAstari (з якою я згоден), я б сказав, що ваші друзі мають рацію, і пропрацювати ваш шлях через прискорений C ++ , можливо, буде хорошою ідеєю. Я підозрюю, що ви побачите, що потрібно набагато менше скімінгу, який ви очікуєте - він призначений для людей, які займають ваше становище, вже знаючи програмування, і в першу чергу потрібно вивчити ідіоми сучасних C ++.
Jerry Coffin

так, насправді я завершив перші два глави, але там було здебільшого те, що я вже знав - я розумію, що автор не просто вийде і напише для мене книгу :) Хоча @LokiAstari дякую за суперінформативний коментар :)
yati sagade

3
@yatisagade Не сподівайтеся, що книжка навчить вас ментальності мови у двох розділах. Це може бути вкрай нудно, оскільки ви вже знаєте синтаксис, але ви повинні взяти на себе зобов’язання переглядати кілька книг С ++, читати все і робити кожну вправу, як ви були початковою мовою. Навчившись неправильно, це означає, що ви повинні подвоїти зусилля, оскільки вам потрібно забути про несправедливості та вивчити права (або щось подібне).
янніс

1
Мені все подобається [...] - (int) (someVoidPointer) Коли-небудь налагоджували 64-бітну збірку раніше?
Ред С.

Відповіді:


12

На основі ваших коментарів ви знаєте синтаксис C ++.
Ви не кодуєте C ++, але те, що часто називають C за допомогою класів.

Тег C ++ на stackoverflow - це гарне місце для початку, він включає список читання та поширені запитання .

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

Мені все комфортно зі своїми "чар *"

Перестаньте їх використовувати, перейдіть на std :: string.

та (int) (someVoidPointer) ідіоми.

Перестаньте використовувати їх (крім інтерфейсу з кодом С). Використання концепції функтора надає ряд переваг (включена ідея інкапсуляції стану).

Але останнім часом, зробивши (незначний) внесок у проект OSS, я відчуваю, що це не так, як ви думаєте в C ++. Це набагато інакше, хоча C має своє місце.

Так. C і C ++ розходяться як мови. Хоча ви можете використовувати практично той самий синтаксис, те, що вважається хорошим кодом С, як правило, не вважається хорошим кодом C ++ (або віце-стихом).

Деякі друзі запропонували прискорений C ++, але я знову знаю, що це типи, що таке класи та що таке перевантаження.

У вас є основи.

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

З великою кількістю роботи :-)


Це не єдиний спосіб. З хороших книг можна багато чого навчитися.
Діма

1
@Dima: Абсолютно. З книг можна багато чого навчитися. Але нічого не переможе досвід і використання мови в гніві, не вдасться повторити спробу знову, і винайдете найкращий спосіб зробити це. Я думаю, ви можете вивчити французьку з книги, але я сумніваюся, що французи вважають вас вільно.
Мартін Йорк

6
ІМХО, найефективніший спосіб навчитися - це починати з книг, вивчати правильний спосіб робити речі, спробувати це на практиці, а потім хтось критикувати ваш код.
Діма

@Dima: Я не маю аргументів з цим.
Мартін Йорк

12

Книга « Ефективний C ++» викладає низку цікавих речей і допоможе вам оцінити особливості C ++. Існує також Ефективний STL - я не читав, але я впевнений, що це було б чудово, якщо ви не знайомі зі ЗПС.

Важливо знати, що ви повинні використовувати мову і не винаходити колесо постійно . Ви вже навчилися їх робити, тому полегшуйте себе (та інших!) Та використовуйте інструменти для всього свого потенціалу.

Як бічна примітка, ви зіткнетеся з великою кількістю людей, які вимагають використання ЗПСШ. Це так само погано налаштовано, як і лише використання char*- іноді це не правильний інструмент, і там є багато інших. У тому ж сенсі, не відмовляйтеся від створення власних класів контейнерів - якщо ви будете використовувати char*найкраще місце для цього, це безпечно загорнутий всередину класу.


Я знаю про ефективні серії (не читав їх) - Але я думаю, що вони стосуються питань найкращої практики, правда?
yati sagade

3
@yati sagade: ні, саме ці книги - це саме те, що вам потрібно пройти від "C з класами" до повноцінного C ++.
Діма

Я бачу - насправді у мене був ефективний c ++ Меєрсом, вишикувався після прискореного C ++.
yati sagade

1
@Dima "Мета цієї книги - показати вам, як ефективно використовувати C ++. Я припускаю, що ви вже знаєте C ++ як мову і що у вас є певний досвід її використання. Я надаю тут посібник із використання мови, щоб ваше програмне забезпечення зрозуміле, ремонтопридатне, портативне, розширюване, ефективне та може вести себе так, як ви очікували. "- Ефективний C ++. Він також охоплює ряд "готчей", які роблять цікавим читати.
Pubby

1
@Dima: Тут обережно. 2-е видання було націлене на нових програмістів на C ++, які приїжджають із C. Найновіше 3-е видання більш орієнтоване на програмістів, що надходять з таких мов, як Java, C # тощо
sbi

6

Я можу порекомендувати нещодавно прийняту BUILD Herb Sutter. Той, що називається " Написання сучасного коду C ++: як розвивався C ++ за ці роки ":

Багато людей думають про C ++ як ту саму мову, яку вони пережили в коледжі, або просто як "C з класами", але мова C ++ сильно розвивалася протягом багатьох років. У цьому сеансі ми розповімо про те, як ви можете використовувати C ++ для написання інноваційних, виразних та красивих додатків, які забезпечують потужність та продуктивність. Приєднуйтесь до нас, щоб побачити, як нещодавно закінчений стандарт C ++ 0x може зробити написання C ++ таким же продуктивним, як і багато інших мов.

Це не погана презентація, не надто довга, має деякі приємні вказівки на нові функції в останньому стандарті, які дадуть вам кілька підказок щодо оновлення вашого старого стилю C / C ++.

Крім цього, вам потрібно вивчити STL - його не складно, і є багато книг, наприклад, Ефективна STL або просто google для навчальних посібників STL, щоб ви ходили.


+1 Дякую Це було чудово. Я щасливий, що задав це питання. Стільки чудових посилань :)
yati sagade

4

Я читав прискорений C ++ від Ендрю Кеніга та Барбари Му, щоб допомогти мені викладати C ++, після того як я працював з C ++ майже десятиліття. (Насправді я в цей час починав займатися метапрограмуванням шаблонів.) Я все-таки вважав, що це одкровення, хоча я не думаю, що це навчило мене ніякого нового факту щодо мови. 1

Однак мене це навчило дивитись та використовувати C ++ як мову високого рівня. Щоб не зациклюватися на сирих вказівниках і deleteвикористовувати стандартну бібліотеку, де це можливо.

У мене таке відчуття, що це саме те, що ти шукаєш.

1 Не те, що тоді мені не було нічого, що ще навчило мене (є ще багато, через десятиліття пізніше), але є лише стільки знань, які можна втиснути у вступну книгу на 250 сторінок.


1

Перш ніж відповісти - примітка: Ідіоматичний C ++ - це рухома ціль. Як мова змінюється, так і її ідіоми. Насправді деякі мовні функції покликані нам усунути ідіоматичний код, який може бути спрощений або вдосконалений за допомогою деякої підтримки з боку самої мови, або принаймні стандартної бібліотеки. Тож майте на увазі, що будь-яке джерело може повідомити вас лише про те, що було ідіоматичним на момент написання .

Сказавши це, ви б добре перевірити:

Сайт codereview.SX

У мережі StackExchange є сайт з назвою codereview.stackexchange.com . Якщо ви написали фрагмент коду C ++ - клас, частина бібліотеки, щось не надто величезне - ви можете опублікувати його там і попросити громаду переглянути його. Зауважте, що код повинен компілюватись і бути в основному функціональним - цей сайт не призначений для налагодження.

Також ви можете шукати там якийсь код C ++, пов’язаний із тим, над чим працюєте, і бачити, на чому наголошують рецензенти. Ви навіть можете спробувати переглянути опублікований код самостійно, не публікуючи відповіді, а потім прочитати, що про нього думають інші.

Відео-презентації конференції C ++

Є кілька конференцій розробників, орієнтованих на C ++, що проводяться щороку:

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

Іноді навіть можна отримати розсувні колоди гучномовців.


0

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

Ви, здається, знаєте синтаксис, це добре. Тепер заходьте і читайте код інших людей та робіть свій власний аналіз. Ви багато чого навчитеся читати код і намагатися його зрозуміти, налагодити його і виправити, і звичайно - додавши до нього дотримання умов кодування, які вже є.

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


-1

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


"більшість кодів C ++ неправильні" - ви можете уточнити? Я бачив, що більшість проектів ОСБ насправді підтримують високі стандарти якості.
yati sagade

1
Так, проекти, але гуглінг щодо того, як робити речі, часто призводить до поганих прикладів.
Кодер

1
@yati: Мій досвід щодо проектів OSS - навпаки.
sbi

@sbi можливо - я брав участь у проекті Mozilla та Google Chrome (тут насправді не задіяний, але навчився). Виявили свою дисципліну видатною!
yati sagade

@yatisagade: Принаймні, більшість існуючих кодів C ++ було написано тоді, коли мова мала особливості, які сьогодні важливі для написання хорошого коду; а більшість решти було написано з необхідністю використання бібліотек, які були написані для роботи з таким старшим кодом, тому цей новий код повинен бути певною мірою адаптований до них. І все це незалежно від того, чи вкладають кодери час і зусилля, необхідні для гідного проектування та впровадження ...
einpoklum - відновити Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.