Post on 09-Aug-2020
C++ Code Style Guide
Что такое Style Guide?!"# $%&'( )*'$+",( -.#/ )*0.'1 # "#2:
• &0& #3#*21+"4 &#/
• &0& '2%$#.0"4 )%*%2%$$,%, &10--,, 30(1,...
• &0& %$"'*#.0"4 &#/
• ' 2$#5#% /*65#%
Зачем он нужен?
• 71+ 6-&#*%$'+ *08*09#"&'
• 71+ 6.%1':%$'+ &0:%-".0 )*#5*022$#5# )*#/6&"0
• 71+ 9#1%% )*'+"$#( *09#", - &#/#2
Обо всем по порядку “!"#$% &'()* +$,-. /)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
Обо всем по порядку ;#14<'$-".# )0$'( ' $/ *08*09#":'&#. $% *0-)#1050%" .#82#=$#-"4> )'-0"4 /#&62%$"0?'> /1+ -.#%5# )*#/6&"0
Обо всем по порядку @# *+/6 )*':'$:
• #:%$4 201# A#*#<'A "%A$':%-&'A )'-0"%1%(
• $%" .*%2%$' '1' =%10$'+ )'-0"4 /#&62%$"0?'>
• /#&62%$"0?'+ $% 6-)%.0%" 80 )*#%&"#2
Обо всем по порядку B:%$4 9,-"*# )*#5*022'-", )*'<1' & .,.#/6, :"# -02 &#/ ' %-"4 /#&62%$"0?'+
@*':%2 .-%5/0 )#1$0+ ' 0&"6014$0+
На что тратится время?;#14<0+ :0-"4 .*%2%$' )*#5*022'-"0 "*0"'"-+ $% $0 $0)'-0$'% &#/0
45 %
6 %
49 %
Чтение кодаНаписание кодаОтладка и поиск багов
На что тратится время?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 %
Чтение кодаНаписание кодаОтладка и поиск багов
К чему это все?@#$'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#
О стилях кодирования в языке С++
О стилях кодирования в С++
F -##9G%-".% “)1>-%*#.” $%" #9G%5# -.#/0 -"'1%.,A )*0.'1
О стилях кодирования в С++
• Google C++ Style Guide
• GNU Coding Standards
• Linux Kernel Coding Style
• Mozilla Coding Style Guide
• Road Intranet's C++ Guidelines
• Qt Style Guide
О стилях кодирования в С++
H E"# "#14&# -02,% )#)61+*$,%
Какой же выбрать?• 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'
Google C++ 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+?''
Длина строки 71'$0 -"*#&' $% /#1=$0 )*%.,<0"4 80 ()*+#&#+
J0& 6&10/,.0"4-+ . 80 -'2.#1#. 96/%" )#&080$# /01%%
Далее внимательно следите за тем, где стоят пробелы, а где не стоят
Это важно!
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>:%$'+
Порядок подключения заголовков
#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"
Именование файлов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;)
Структуры и классы D"*6&"6*, '-)#1486>"-+ "#14&# /1+ *%01'80?'' #9K%&"#., A*0$+G'A ,#&-.# /0$$,%
F-% #-"014$,% #9K%&", *%01'86>"-+ &10--02'
Порядок определений в *.h файлах
• Typedef’, ' Enum’,
• J#$-"0$",
• J#$-"*6&"#*,
• 7%-"*6&"#*
• L%"#/, ' -"0"':%-&'% 2%"#/,
• @%*%2%$$,% ' -"0"':%-&'% )%*%2%$$,%
Именование переменных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; // Плохо
Именование переменных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; // Эта переменная может означать практически что угодно
Именование переменныхI% -#&*0G0("% '2%$0 )%*%2%$$,A, .,9*0-,.0+ '8 $'A 96&.,
int error_count; // Хорошо
int error_cnt; // Плохо
Именование переменныхstring table_name; // Хорошоstring tablename; // Нормальноstring tableName; // Плохо, смешанный стиль
// Глобальная переменная ( префикс g_ )int g_max_integer;
// Константа (префикс k и смешанный стиль)const int kDaysInAWeek = 7;
Локальные переменные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);}
Именование типов и классов
// classes and structsclass UrlTable { ...class UrlTableTester { ...struct UrlTableProperties { ... // typedefstypedef hash_map<UrlTable *, string> GlobalMap;
// enumsenum UrlTableErrors { ...
Именование функций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_; // приватная переменная};
Именование enum’ов
enum UrlTableErrors { kOK = 0, kErrorOutOfMemory, kErrorMalformedInput,};
enum AlternateUrlTableErrors { OK = 0, OUT_OF_MEMORY = 1, MALFORMED_INPUT = 2,};
Вызовы функций
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#.
Условный оператор// Правильноif (condition) { // ...} else { // ... }
// Неправильно расставлены пробелыif(condition)if (condition){if(condition){ // Не хватает фигурных скобок (опасная конструкция) if (x) DoThis();else DoThat();
Условный оператор
// Следите за правильностью фигурных скобокif (condition) { foo(); } else bar(); if (condition) foo(); else { bar(); }
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&:
Hint! Тернарный оператор
a = (x > 0) ? (y > 0) ? 1 : 2 : (y > 0) ? 3 : 4;
@*%/,/6G'( )*'2%* .,51+/'" 5#*08/# )#$+"$%%, :%2 "#" =% &#/ 9%8 3#*20"'*#.0$'+:
Циклыwhile (condition) { // ...}
// Цикл с пустым теломfor (int i = 0; i < kSomeNumber; ++i) {}
while (condition) continue; // Хорошо
while (condition); // Плохо, в коде будет смотреться как окончание конструкции do { } while ();
Конструкция Switchswitch (var) { case 0: { // отступ 4 пробела // ... // отступ 8 пробелов break; } case 1: { // ... break; } default: { assert(false); }}
Ссылки Google C++ Code Style Guide
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Вопросы ?