c++ - msu.ruО стилях кодирования в С++ • google c++ style guide • gnu coding...

41
C++ Code Style Guide

Upload: others

Post on 09-Aug-2020

23 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

C++ Code Style Guide

Page 2: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Что такое Style Guide?!"# $%&'( )*'$+",( -.#/ )*0.'1 # "#2:

• &0& #3#*21+"4 &#/

• &0& '2%$#.0"4 )%*%2%$$,%, &10--,, 30(1,...

• &0& &#22%$"'*#.0"4 &#/

• ' 2$#5#% /*65#%

Page 3: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Зачем он нужен?

• 71+ 6-&#*%$'+ *08*09#"&'

• 71+ 6.%1':%$'+ &0:%-".0 )*#5*022$#5# )*#/6&"0

• 71+ 9#1%% )*'+"$#( *09#", - &#/#2

Page 4: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Обо всем по порядку “!"#$% &'()* +$,-. /)012).3 0($4()++', *$.$('" 0$%+-. *$+0156.$(.

7$($81- 0($4()++12.9 018'. 0($4()++9, *$.$(9- 2+$4'. 0$/6.3 &('41- 0($4()++12.9.”

M. Fowler

Page 5: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Обо всем по порядку ;#14<'$-".# &#2)0$'( ' &#20$/ *08*09#":'&#. $% *0-)#1050%" .#82#=$#-"4> )'-0"4 /#&62%$"0?'> /1+ -.#%5# )*#/6&"0

Page 6: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Обо всем по порядку @# *+/6 )*':'$:

• #:%$4 201# A#*#<'A "%A$':%-&'A )'-0"%1%(

• $%" .*%2%$' '1' =%10$'+ )'-0"4 /#&62%$"0?'>

• /#&62%$"0?'+ $% 6-)%.0%" 80 )*#%&"#2

Page 7: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Обо всем по порядку B:%$4 9,-"*# )*#5*022'-", )*'<1' & .,.#/6, :"# -02 &#/ ' %-"4 /#&62%$"0?'+

@*':%2 .-%5/0 )#1$0+ ' 0&"6014$0+

Page 8: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

На что тратится время?;#14<0+ :0-"4 .*%2%$' )*#5*022'-"0 "*0"'"-+ $% $0 $0)'-0$'% &#/0

45 %

6 %

49 %

Чтение кодаНаписание кодаОтладка и поиск багов

Page 9: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

На что тратится время?C#*08/# .,5#/$%% $0$+"4 )*#5*022'-"0, &#"#*,( )%:0"0%" #/$'2 )014?%2 A#*#<'( &#/, :%2 )*#5*022'-"0, &#"#*,( )%:0"0%" )1#A#( &#/ .-%2' /%-+"4>

45 %

6 %

49 %

Чтение кодаНаписание кодаОтладка и поиск багов

Page 10: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

К чему это все?@#$'20$'% "#5#, &0& *09#"0%" )*#5*0220 '1' %% :0-"4, /#1=$# )*'A#/'"4 &0& 2#=$# 9,-"*%%

DE&#$#2'. $0 &*0-#"% &#/0 ., )#"%*+%"% "%*+%"% &6/0 9#14<% .*%2%$' #"10='.0+ %5#

Page 11: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

О стилях кодирования в языке С++

Page 12: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

О стилях кодирования в С++

F -##9G%-".% “)1>-%*#.” $%" #9G%5# -.#/0 -"'1%.,A )*0.'1

Page 13: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

О стилях кодирования в С++

• Google C++ Style Guide

• GNU Coding Standards

• Linux Kernel Coding Style

• Mozilla Coding Style Guide

• Road Intranet's C++ Guidelines

• Qt Style Guide

Page 14: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

О стилях кодирования в С++

H E"# "#14&# -02,% )#)61+*$,%

Page 15: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Какой же выбрать?• D%*%9*+$#( )61' 8/%-4 $%"

• F-% -"0$/0*", )#--.#%26 A#*#<' ' )#--.#%26 )1#A'

• F $0<'A )*#%&"0A )*'$+"# '-)#148#.0"4 -"'14 Google - $%&#"#*,2' #5#.#*&02'

Page 16: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Google C++ Style Guide

Page 17: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

И сразу оговорка F -"0$/0*"% #" Google . &0:%-".% #"-"6)0 9%*%"-+ 2 )*#9%10

F $0<'A )*#%&"0A . &0:%-".% #"-"6)#. '-)#1486>"-+ 4 !"#$%&'

I# &0& ' . -"0$/0*"% #" Google 2, $% '-)#1486%2 . &#/% -'2.#1, "0961+?''

Page 18: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Длина строки 71'$0 -"*#&' $% /#1=$0 )*%.,<0"4 80 ()*+#&#+

J0& 6&10/,.0"4-+ . 80 -'2.#1#. 96/%" )#&080$# /01%%

Page 19: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Далее внимательно следите за тем, где стоят пробелы, а где не стоят

Это важно!

Page 20: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

The #define guards #ifndef NAME_OF_HEADER_FILE_H_#define NAME_OF_HEADER_FILE_H_

/* code of header file */

#endif // NAME_OF_HEADER_FILE_H_

F-% 805#1#.#:$,% 30(1, /#1=$, 9,"4 #9%*$6", . E"6 &#$-"*6&?'>, :"#9, '89%=0"4 2$#=%-".%$$#5# )#/&1>:%$'+

Page 21: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Порядок подключения заголовков

#include <sys/types.h> // C libs#include <unistd.h>

#include <hash_map> // C++ libs#include <vector>

#include "base/basictypes.h"#include "base/commandlineflags.h"#include "foo/public/bar.h"

Page 22: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Именование файловJ#2)1%&" 30(1#. &10--0 UrlTable:

url_table.h

url_table.cc

H$#5/0 "*%96%"-+ 30(1 url_table-inl.h, &#"#*,( -#/%*='" #9K%2$,% inline-36$&?'' (#" 1J;)

Page 23: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Структуры и классы D"*6&"6*, '-)#1486>"-+ "#14&# /1+ *%01'80?'' #9K%&"#., A*0$+G'A ,#&-.# /0$$,%

F-% #-"014$,% #9K%&", *%01'86>"-+ &10--02'

Page 24: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Порядок определений в *.h файлах

• Typedef’, ' Enum’,

• J#$-"0$",

• J#$-"*6&"#*,

• 7%-"*6&"#*

• L%"#/, ' -"0"':%-&'% 2%"#/,

• @%*%2%$$,% ' -"0"':%-&'% )%*%2%$$,%

Page 25: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Именование переменныхH2%$0 )%*%2%$$,A /#1=$, 9,"4 #-2,-1%$$,2'

int num_errors; // Хорошоint num_completed_connections; // Хорошо

int n; // Плохоint nerr; // Плохоint n_comp_conns; // Плохо

Page 26: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Именование переменныхH2%$0 )%*%2%$$,A /#1=$, 9,"4 )#$+"$, -"#*#$$'2 *08*09#":'&02

// Хорошоint num_dns_connections; // Большинство программистов знают, что такое DNS

int price_count; // Нормально, из контекста скорее всего будет ясен смысл// Но как раз тот случай, когда не лишним будет комментарий

// Плохо!// Аббревиатуры могут вводить в заблуждение

int wgc_connections; // Возможно только вы знаете расшифровку WGC

int pc_reader; // Эта переменная может означать практически что угодно

Page 27: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Именование переменныхI% -#&*0G0("% '2%$0 )%*%2%$$,A, .,9*0-,.0+ '8 $'A 96&.,

int error_count; // Хорошо

int error_cnt; // Плохо

Page 28: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Именование переменныхstring table_name; // Хорошоstring tablename; // Нормальноstring tableName; // Плохо, смешанный стиль

// Глобальная переменная ( префикс g_ )int g_max_integer;

// Константа (префикс k и смешанный стиль)const int kDaysInAWeek = 7;

Page 29: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Локальные переменныеint i; // Неправильно, нельзя разделять объявление иi = f(); // первое присваиваниеint j = g(); // Хорошо

// Нормальноwhile (const char* p = strchr(str, '/')) str = p + 1;

for (int i = 0; i < 1000000; ++i) { Foo f; // Плохо: объявление переменной внутри цикла f.DoSomething(i);}

Foo f;for (int i = 0; i < 1000000; ++i) { f.DoSomething(i);}

Page 30: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Именование типов и классов

// classes and structsclass UrlTable { ...class UrlTableTester { ...struct UrlTableProperties { ... // typedefstypedef hash_map<UrlTable *, string> GlobalMap;

// enumsenum UrlTableErrors { ...

Page 31: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Именование функцийAddTableEntry() // Глобальные функцииDeleteUrl() class MyClass {

public: // методы int num_entries() const { return num_entries_; } void set_num_entries(int num_entries) { num_entries_ = num_entries; } private: int num_entries_; // приватная переменная};

Page 32: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Именование enum’ов

enum UrlTableErrors { kOK = 0, kErrorOutOfMemory, kErrorMalformedInput,};

enum AlternateUrlTableErrors { OK = 0, OUT_OF_MEMORY = 1, MALFORMED_INPUT = 2,};

Page 33: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Вызовы функций

bool retval = DoSomething(arg1, arg2, arg3);bool retval = DoSomething(averyveryveryverylongargument1, argument2, argument3);bool retval = DoSomething(argument1, argument2, argument3, argument4);

71'$0 -"*#&' $% /#1=$0 )*%.,<0"4 80 -'2.#1#.

Page 34: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Условный оператор// Правильноif (condition) { // ...} else { // ... }

// Неправильно расставлены пробелыif(condition)if (condition){if(condition){ // Не хватает фигурных скобок (опасная конструкция) if (x) DoThis();else DoThat();

Page 35: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Условный оператор

// Следите за правильностью фигурных скобокif (condition) { foo(); } else bar(); if (condition) foo(); else { bar(); }

Page 36: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Hint! Тернарный оператор

a = (x > 0) ? (y > 0) ? 1 : 2 : (y > 0) ? 3 : 4;

M-1' 6 $02 $6=$# )#-:'"0"4 $%&#"#*#% 8$0:%$'% )# -1#=$#26 /%*%.6 6-1#.'(, "# 2#=$# -/%10"4 "0&:

Page 37: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Hint! Тернарный оператор

a = (x > 0) ? (y > 0) ? 1 : 2 : (y > 0) ? 3 : 4;

@*%/,/6G'( )*'2%* .,51+/'" 5#*08/# )#$+"$%%, :%2 "#" =% &#/ 9%8 3#*20"'*#.0$'+:

Page 38: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Циклыwhile (condition) { // ...}

// Цикл с пустым теломfor (int i = 0; i < kSomeNumber; ++i) {}

while (condition) continue; // Хорошо

while (condition); // Плохо, в коде будет смотреться как окончание конструкции do { } while ();

Page 39: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Конструкция Switchswitch (var) { case 0: { // отступ 4 пробела // ... // отступ 8 пробелов break; } case 1: { // ... break; } default: { assert(false); }}

Page 41: C++ - msu.ruО стилях кодирования в С++ • Google C++ Style Guide • GNU Coding Standards • Linux Kernel Coding Style • Mozilla Coding Style Guide Порядок

Вопросы ?