|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
如果领导给你一个项目的源码让你阅读,并理解重构代码,但里面一句注释都没有,我想这肯定是之前同事“删库跑路”了。
1 o7 e# q6 w6 B 看一份源码什么很重要?除了各种代码规范之外,还有一个比较重要的就是注释。
3 R) ]3 S# }1 S8 u+ h# M注释虽然写起来很痛苦, 但对保证代码可读性至关重要,下面的将描述如何注释以及在哪儿注释。 [7 |' N* N% n# [7 u
1注释风格1.总述
& ]% A) u O* g) q2 M1 k# x一般使用 // 或 /* */,只要统一就好。
6 e6 `: Y9 X+ W2.说明
3 u4 u+ a" O1 s- A6 p// 或 /* */ 都可以,但 // 更 常用,要在如何注释及注释风格上确保统一。3 m7 F: E- ?4 u# ]' g2 N$ b
2 N* {0 m. p8 w4 e
2文件注释1.总述
5 N- a( T* \3 z/ E" I在每一个文件开头加入版权、作者、时间等描述。( S( o& d" e+ o* l
文件注释描述了该文件的内容,如果一个文件只声明,或实现,或测试了一个对象,并且这个对象已经在它的声明处进行了详细的注释,那么就没必要再加上文件注释,除此之外的其他文件都需要文件注释。
" [4 B9 z9 D9 J( R B" l, j2.说明法律公告和作者信息:每个文件都应该包含许可证引用. 为项目选择合适的许可证版本(比如, Apache 2.0, BSD, LGPL, GPL)。2 X" F9 H ]1 V, B6 v
( D0 z3 |# x% t$ q F8 d$ H如果你对原始作者的文件做了重大修改,请考虑删除原作者信息。
. F: m. t: i- }* I2 ^- J3.文件内容如果一个 .h 文件声明了多个概念, 则文件注释应当对文件的内容做一个大致的说明, 同时说明各概念之间的联系. 一个一到两行的文件注释就足够了, 对于每个概念的详细文档应当放在各个概念中, 而不是文件注释中。8 { Q& L: U# V- r9 X/ ?' _8 z* p1 }7 h/ j2 ?. X
不要在 .h 和 .cc 之间复制注释, 这样的注释偏离了注释的实际意义。
/ v! B. c V+ c. B0 j
/ m3 b3 D* `. R; o9 K. m: T& O) x) ~' u F( L. Z- o, `9 H5 g& X, P0 c6 F' d8 C, L B- v# f) \
3" K6 x# r9 O2 j2 c- G7 I- |2 d2 J3 ~
5 o! M1 q" }0 I6 x9 I( P函数注释1.总述6 Z( `( ^0 }& C! N* `. W. F
% I6 i0 y6 T) }6 I函数声明处的注释描述函数功能; 定义处的注释描述函数实现。; H/ B3 C# y8 N8 b' O D" j$ \1 w+ O& r8 A$ q3 e4 l& v
2.说明函数声明:基本上每个函数声明处前都应当加上注释, 描述函数的功能和用途. 只有在函数的功能简单而明显时才能省略这些注释(例如, 简单的取值和设值函数)。
3 J) k# i5 H5 I. U9 L3 y9 E比如:FreeRTOS创建任务函数申明:
. U3 v" s/ `9 A# d- Y/ V; l- k. v4 t' L% L3 |
/ X" u9 r. p: l) w; l函数定义:2 d3 O# g+ X# o& w4 U: J
4 c2 S( }1 h }# ?$ y1 m: f如果函数的实现过程中用到了很巧妙的方式, 那么在函数定义处应当加上解释性的注释。比如, 你所使用的编程技巧, 实现的大致步骤, 或解释如此实现的理由. 举个例子, 你可以说明为什么函数的前半部分要加锁而后半部分不需要。: y9 _: C# {- d0 L
! K" c4 F' K- A% X6 C7 x4 E9 `不要 从 .h 文件或其他地方的函数声明处直接复制注释. 简要重述函数功能是可以的, 但注释重点要放在如何实现上。( M; m! M. A5 L! ^- y
! Z$ d% _0 y+ {# P; E# i1 ~+ x3 @. q+ j5 _0 X) k' l
/ B6 Q0 E2 g" C9 t* w. P. r& h- Z |9 S9 ]! K+ X" _0 n; g0 U3 H: t A% E& i: d
4
9 ~/ m9 T+ c/ j7 u变量注释1.总述6 f3 u* f5 S. @0 {0 c3 k2 T
通常变量名本身足以很好说明变量用途, 某些情况下, 也需要额外的注释说明。
8 U& [2 ^% ?' g! j& F9 V m% R) @$ n3 ^" n
2.说明根据不同场景、不同修饰符,变量可以分为很多种类,总的来说变量分为全局变量、局部变量。
! G; Q' Y1 a# I3 w一般来说局部变量仅限于局部范围,其含义相对简单容易理解,只需要简单注释即可。
6 v, I! |$ t" A% D H全局变量一般作用于多个文件,或者整个工程,因此,其含义相对更复杂,所以在注释的时候,最好描述清楚其具体含义,就是尽量全面描述。( \6 D3 c4 R# D8 [; N9 e4 A$ E9 w' } o
(提示:全局变量尽量少用)) p. f/ K8 C- G" V. M5 m5 m4 `7 v- ?% a% R, `; k: |
52 k: P1 w B# P" M5 I8 H j
3 ?2 K: E2 X/ o) Q拼写注释1.总述# |$ S: B6 R4 _/ b8 Z
可能一个变量、一个函数包含的意思非常复杂,需要多个单词拼写而成,此时对拼写内容就需要详细注释。3 K7 Q5 Q/ k. T8 r" H' S' d
. ] b- u1 K, D$ n1 w( S4 N5 y
2.说明注释的通常写法是包含正确大小写和结尾句号的完整叙述性语句. 大多数情况下, 完整的句子比句子片段可读性更高. 短一点的注释, 比如代码行尾注释, 可以随意点, 但依然要注意风格的一致性。
# U) W1 I4 q7 a6 s7 V! Y同时,注释中的拼写、逗号也很重要。虽然被别人指出该用分号时却用了逗号多少有些尴尬, 但清晰易读的代码还是很重要的. 正确的标点, 拼写和语法对此会有很大帮助。" {* }% K" G0 h" Z& J
6+ M8 O/ V" J. k# Q% E* g
TODO 注释1.总述7 s6 V }( O6 H' p+ ]# D9 F$ x
对那些临时的, 短期的解决方案, 或已经够好但仍不完美的代码使用 TODO 注释。TODO 注释要使用全大写的字符串 TODO, 在随后的圆括号里写上你的名字, 邮件地址, bug ID, 或其它身份标识和与这一 TODO 相关的 issue. 主要目的是让添加注释的人 (也是可以请求提供更多细节的人) 可根据规范的 TODO 格式进行查找. 添加 TODO 注释并不意味着你要自己来修正, 因此当你加上带有姓名的 TODO 时, 一般都是写上自己的名字。7 }4 y; u. o- P$ f4 B. |% Z5 N
, e5 {3 ]' e5 K9 J3 a77 s/ k3 H1 g6 d: I* k1 E9 X2 { y
TODO 注释1.总述, s5 v3 [9 Q d- Y4 Z
通过弃用注释(DEPRECATED comments)以标记某接口点已弃用.您可以写上包含全大写的 DEPRECATED 的注释, 以标记某接口为弃用状态. 注释可以放在接口声明前, 或者同一行.在 DEPRECATED 一词后, 在括号中留下您的名字, 邮箱地址以及其他身份标识.弃用注释应当包涵简短而清晰的指引, 以帮助其他人修复其调用点. 在 C++ 中, 你可以将一个弃用函数改造成一个内联函数, 这一函数将调用新的接口.仅仅标记接口为 DEPRECATED 并不会让大家不约而同地弃用, 您还得亲自主动修正调用点(callsites), 或是找个帮手.修正好的代码应该不会再涉及弃用接口点了, 着实改用新接口点. 如果您不知从何下手, 可以找标记弃用注释的当事人一起商量。) q/ t* Z5 B! ~) y) T, C7 C, L7 j+ X6 U2 f6 c, V7 |
8
; h7 S1 z6 h8 Z5 L结语注释固然很重要, 但最好的代码应当本身就是文档,有意义的类型名和变量名, 要远胜过要用注释解释的含糊不清的名字。
# r p7 c1 p: f; s4 _3 w7 T0 R G# q+ @
: M2 f8 t/ _* @ - A4 a* R% r$ `2 F: S' G R
8 s( J/ _1 t' R0 i" k1 ^ \你写的注释是给代码阅读者看的, 也就是下一个需要理解你代码的人. 所以慷慨些吧, 下一个读者可能就是你! , [" \9 `$ r8 t+ N& f( F7 `
5 B. }4 d0 A+ M* w- ~# @1 l- _ |
|