clas风格 My Type命名 Type语句 风格、设计与实现 注释 MyType文档; MyType参考文献 风格风格0 风格风格0 额外的工作量为了减少工作量 我们必须培养良好的代码风格 Good points ■现在处于学习阶段,不能太懒 ■团队合作要求统一的风格 ■自己的代码适合别人学习,别人==几个月或者 几年后的自 ■从最切身的利益讲:有利于助教或者老师 批改; 风格要付出额外的劳动一增加输入量: ■人们经常忽略风格,或者不能达成共识 ■没有风格有利于代码的保密② 所以我们的代码需要风格 风格风格O 风格风格0 两个程序片段 ol Ca:aahk(onokDIN-ATE kftlarinz panee) t是什么了 n m哪坐来的 ak又是哪甲的了
1 风格、设计与实现 高壮 2007.10 class 风格 { private: MyType 命名; MyType 语句; MyType 注释; MyType 文档; MyType 参考文献; public: 风格(); ~风格(); }; 风格.风格() 额外的工作量为了减少工作量 So it is a tradeoff! Good Points: 阅读别人的代码方便; 自己的代码适合别人学习,别人=?=几个月或者 几年后的自己。 Bad Point: 风格要付出额外的劳动—增加输入量; 人们经常忽略风格,或者不能达成共识; 没有风格有利于代码的保密/ 风格.风格() 我们必须培养良好的代码风格: 现在处于学习阶段,不能太懒; 团队合作要求统一的风格; 从最切身的利益讲:有利于助教或者老师 批改;☺ 所以我们的代码需要风格 风格.风格() 两个程序片段: int main() { int qq, i, j, tot, pre; ------------------qq,tot是什么? scanf("%d", &qq); while (--qq >= 0) { memset(stock, 0, sizeof(stock)); scanf("%d%d", &side, &n); max = 0; ---------------------max,min哪里来的? min = 10; tot = 0; for (i = 0; i max) max = j; if (j totalSize || leftTop.second+pieceSize[piece]>totalSize) return false; for(int row=leftTop.first;row>caseNum; Case cutCake; while((caseNum--)>0) { cutCake.Input(); cutCake.Output(); } }
风格命名 风格命名 ■命名是程序风格中最重要的部分,也是初 ■词能达意 学者最容易忽略(甚至不屑)的部分 获得字符串的长度“的函数,下面两个名称: ■一个好的变量命名应该满足 hdzfcdcd ( 词能达意: COORDINATE leftTo getLength ( )表明身份:变量?函数? 局部?常 孰优孰劣,一目了然! 量?类?宏? e)存储类型:int?foat?char? **这里我们不提倡“爱国”,不要用拼音,尤其 是拼音首字母组合 风格命名 风格命名 ■表明身份 ■存储类型(匈牙利命名法): variable:局部变量 variable:全局变量 ■ BOOL eNable ■ Int nlength m variable:成员变量 n WORD wPos dosomething函数 CONSTANT VARIABLE:常量 n DWORD dw Range ClassName:类 MACRO0:宏 ■32位字符串指针lsN g_vErtex:全局变量,并且是指向顶点的指针 32位常量字符串指针 pszName ■ Windows对象句柄hWnd 风格命名 风格语句 t20向导自动生成的 MAnfran要 ■语句的风格主要包括 缩进 这个大家都做的很好! 空格:intb=a+c; vs int b=a+c; cManlramo 空行: rita md DumpNDupCantens de)cora ■文件中的主要部分要用空行分开 控件条嵌入成员 ■连续的两个多行定义之间用空行隔开 ■多行定义和其他代码之间应该用空行隔开 CKEATEsIKLCr Lptnaesmuck ■块局部变量和代码之间用空行分开 有什么不同?不统一的风格>NO
2 风格.命名 命名是程序风格中最重要的部分,也是初 学者最容易忽略(甚至不屑)的部分。 一个好的变量命名应该满足: a) 词能达意: COORDINATE leftTop b) 表明身份:变量?函数?全局?局部?常 量?类?宏?… c) 存储类型:int?float?char? 风格.命名 词能达意: ”获得字符串的长度“的函数,下面两个名称: hdzfcdcd() getLength() 孰优孰劣,一目了然! **这里我们不提倡“爱国”,不要用拼音,尤其 是拼音首字母组合** 风格.命名 表明身份: variable:局部变量 g_variable:全局变量 m_variable:成员变量 doSomething():函数 CONSTANT_VARIABLE:常量 ClassName:类 MACRO():宏 g_pVertex:全局变量,并且是指向顶点的指针 风格.命名 存储类型(匈牙利命名法): Char chGrade BOOL bEnable Int nLength WORD wPos LONG lOffset DWORD dwRange 指针 pDoc 远指针 lpszName 32位字符串指针 lpszName 32位常量字符串指针 lpszName Windows对象句柄 hWnd 风格.命名 class CMainFrame : public CMDIFrameWnd-------------------------.net 2003向导自动生成的CMainFrame类 { DECLARE_DYNAMIC(CMainFrame) public: CMainFrame(); public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); public: virtual ~CMainFrame(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // 控件条嵌入成员 CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); DECLARE_MESSAGE_MAP() };---------------------------------------------------------有什么不同?不统一的风格>NO 风格.语句 语句的风格主要包括: 缩进: ------------这个大家都做的很好!☺ 空格:int b = a + c; vs int b=a + c; 空行: 文件中的主要部分要用空行分开 连续的两个多行定义之间用空行隔开 多行定义和其他代码之间应该用空行隔开 块局部变量和代码之间用空行分开
风格语句 风格语句 不要滥用空格 ■少用具有二义性或者很难理解的语句 ■不要在单目运算符和其操作对象间加空格比 strai++I sizeof(str): = sizeof(str); (nt)a+b =>(int)a+b hild=(ILC&&!RO):0: (?RC: LO; 不要在引用操作符∵>前后加空格 subkey=subkey>>(bitoff-(bitoff>>3) leftTreel=0; = while((c=getchar)!=EOF PNode->leftTreel=0 # define square()()(3)2有没有问题?2/ square() 风格语句 风格注释 大括号(建议前一种) ■风格规范涉及在进行实际编码时,从注释、代码 while(condition) 块到类和函数域,以至于整个项目文件范围方方 面面形成的良好风格习惯。 ■初学者往往注重完成特定的算法功能,而忽视了注释 以及代码可读性、可维护性 ■注释应当是编码的一部分。没有注释 if(condition)i while(condition)t 整。写出好的注释如同写出好的代码,需要经验积累 ■注释要清晰、简沽,并且有价值。 风格注释 风格文档 ■对于注释,请尽量遵守下面的规范 ■文档是一个良好程序不可分割的一部分。一个程 ■使用∥/,因为/*·/不支持嵌套注释 序能否被广泛使用很大程度长觉得于它的文档的 ■文档应该包含 ■问题背景 ■问题分析 问题求斛 问题的结果分析 ■程序的性能: 最后的总结
3 风格.语句 不要滥用空格 不要在单目运算符和其操作对象间加空格比 如:!a,++a… sizeof (str); => sizeof(str); (int) a+b => (int)a+b 不要在引用操作符’.’ ’->’ ’[ ]’前后加空格 a [i] => a[i] pNode -> leftTree!=0; => pNode->leftTree!=0; 风格.语句 少用具有二义性或者很难理解的语句: i+++i; stra[i++] = strb[i++] = ‘ ‘; child=(!LC&&!RC)?0:(!LC?RC:LC); subkey=subkey>>(bitoff-((bitoff>>3)<<3)); 不要吝啬括号 while((c=getchar())!=EOF) #define square(x) (x)*(x)??有没有问题?2/square(x) 风格.语句 大括号(建议前一种) if (condition) while (condition) { { ... ... } } vs if (condition) { while (condition) { ... ... } } 风格.注释 风格规范涉及在进行实际编码时,从注释、代码 块到类和函数域,以至于整个项目文件范围方方 面面形成的良好风格习惯。 注释 : 初学者往往注重完成特定的算法功能,而忽视了注释 以及代码可读性、可维护性。 注释应当是编码的一部分。没有注释,编码不算完 整。写出好的注释如同写出好的代码,需要经验积累 与素养。 注释要清晰、简洁,并且有价值。 风格.注释 对于注释,请尽量遵守下面的规范: 使用’//’,因为’/*… */’不支持嵌套注释。 长注释应和代码分在不同的行 如果注释掉大段代码,请使用'#if 0...#endif'或'//'注释 代码,不要使用'/*...*/'。用'/*...*/'作注释可能会导致嵌套 注释,当被注释掉的代码块很大时更容易出现这种情 况,这样可能导致注释掉的区域不是我们想要的范 围。而'#if 0...#endif'方式可以嵌套,# if 0是废掉代码, #if 1是打开代码,非常方便。 确保所有注释(随代码)及时更新。一定要牢记注释 是编码的一部分,所以修改代码时,相应的注释也要 改。没有及时更新的注释会误导代码阅读和维护,甚 至产生严重的副作用。 风格.文档 文档是一个良好程序不可分割的一部分。一个程 序能否被广泛使用很大程度长觉得于它的文档的 质量。 文档应该包含: 问题背景; 问题分析; 问题求解; 问题的结果分析; 程序的性能; 最后的总结;
风格文档 风格文档 较好的文档实例: ■需要注意的文档风格: 上行优先理素,判断可否下只需检置一什 张贴大量代码,甚至全部代码,而没有说明 的 械,当且仅当,《+D可这个格子为空,我们用下的代到树定 1是当的要的小修,上足远的去形 风格参考文献 风格~风格0 ■高质量C++/C编程指南林锐博士 程序设计实践 Brian w. Kernighan, Rob pike a C++ Coding Standard, Andrei Alexandrescu Herb Sutter 谢谢!
4 风格.文档 较好的文档实例: 风格.文档 需要注意的文档风格: 张贴大量代码,甚至全部代码,而没有说明 风格.参考文献 高质量C++/C 编程指南 林锐 博士 程序设计实践 Brian W. Kernighan, Rob Pike. C++ Coding Standard,Andrei Alexandrescu, Herb Sutter 风格.~风格() 谢谢!