个人对编码规范的一些理解
个人对编码规范的一些理解
一些同学在写代码的时候一开始就不具备良好的习惯, 最后的代码压根没法看, 写一下自己对代码的编码规范的一些知识的整合.
1. 命名
在我们的编码过程中, 为了可维护性, 以及可扩展性, 我们需要让我们的代码的可读性增强, 尤其是在我们的团队开发项目, 和需要长期维护的项目中, 如果命名不规范, 很容易被打, 所谓的命名规范就是先做到见名知义.
常见的命名方式有以下三种.
-
驼峰式命名
顾名思义, 驼峰式命名的用法是首个单词小写, 从第二个单词开始就开始首字母大写, 比如我们在定义一个质数的个数这个变量的时候, 可以采用以下这种方式.
int numberOfPrime = 0;
这种方式可以很明显的看出要表达的意思, 这种方式应该是目前来说最为流行的命名方式了.
-
下划线式命名
下划线命名就是单词与单词之间使用下划线**_**隔开, 单词使用小写, 同上面的例子
int number_of_prime = 0;
这种命名方式常见于c语言的程序和数据库的表明中
-
帕斯卡命名
帕斯卡命名方式与驼峰式命名方法相似, 只不过第一个首字母不大写而已, 这种方式常见于c/c++/c#语言的函数中, 以及部分面向对象编程语言中类的命名
C#
static int Plus(int num1, int num2) { return num1 + num2; }
Java
class HelloWrold { }
2. 注释
-
行注释
-
一般修饰易读性不强的代码, 比如下面的岭段代码, 功能相同, 但如果用一句话来省略if的话, 那么可以说很长时间之后看不明白, 就可以写一个行注释标记一下
while(true) { if (resultIndex > arr.length) { resultIndex = 0; } resultIndex++; } while(true) { resultIndex = resultIndex % arr.length; resultIndex++; }
-
修饰一个块的结束, 比如一个if 或者while 循环发生了嵌套, 而且每一个嵌套里面有很多代码, 在最后就会出现很多括号在一起, 分不清哪一块是哪一块, 这块就会需要一个标识来说明结束, 比如下面这个例子
for (int i = 0; i < arr.length; i++) { while (index != 0) { if (index = 23) { } // end if } // end while } // end for
-
-
块注释
-
一般来说明一个小功能的时候来使用, 一般伴随着比较长的一个注释
void heapify() { /* 在这里实现以下heapify, 在三个节点中, 找到最大的放在头上, 另外两个不用动 */ }
-
另一种情况就是写自己的介绍或者自己对这个代码的注释进行排版, 多见于国外的api或者外国友人写的代码中的注释
-
-
文档注释, 这个多见于java代码中, 可以非常方便的对方法, 和全局变量附上信息, 在另外的地方也可以获得这种信息, 变量使用@param, 返回值使用@return 声明等等, 且支持html的大部分语法, 以下是节选了jdk中的部分源码
/** * Replaces the first substring of this string that matches the given <a * href="../util/regex/Pattern.html#sum">regular expression</a> with the * given replacement. * * <p> An invocation of this method of the form * <i>str</i>{@code .replaceFirst(}<i>regex</i>{@code ,} <i>repl</i>{@code )} * yields exactly the same result as the expression * * <blockquote> * <code> * {@link java.util.regex.Pattern}.{@link * java.util.regex.Pattern#compile compile}(<i>regex</i>).{@link * java.util.regex.Pattern#matcher(java.lang.CharSequence) matcher}(<i>str</i>).{@link * java.util.regex.Matcher#replaceFirst replaceFirst}(<i>repl</i>) * </code> * </blockquote> * *<p> * Note that backslashes ({@code \}) and dollar signs ({@code $}) in the * replacement string may cause the results to be different than if it were * being treated as a literal replacement string; see * {@link java.util.regex.Matcher#replaceFirst}. * Use {@link java.util.regex.Matcher#quoteReplacement} to suppress the special * meaning of these characters, if desired. * * @param regex * the regular expression to which this string is to be matched * @param replacement * the string to be substituted for the first match * * @return The resulting {@code String} * * @throws PatternSyntaxException * if the regular expression's syntax is invalid * * @see java.util.regex.Pattern * * @since 1.4 * @spec JSR-51 */ public String replaceFirst(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceFirst(replacement); }
3. 编码习惯
-
书写对人类友好的代码
简而言之, 就是让我们的代码可读性增强
-
按照命名规范编码
- 所谓命名规范, 就是我上面提到的一些命名规范和注释的规范, 写代码的时候要遵守这些规范
-
对变量名和方法/函数进行描述
- 变量名描述: 一般对全局变量名进行描述
- 方法/函数描述: 对每一个方法进行描述, 即添加注释, 避免方法名有歧义的地方
-
做好代码的缩进和换行
在编码过程中, 调整好代码的缩进和换行也是增强代码美观的方式, 体现程序员的专业素养
- 缩进: 缩进可以采用tab键的方式进行缩进, 也可以采用多个空格造成的缩进的方式, 但一定要注意不要两者混用. 并且在一个代码块中缩进要一致
- 换行: 适当的换行也可以增强代码的可读性.
-
-
在一定高度上思考
说白了就是把握好全局
-
不要在一个文件中写太多代码: 多见于编程的初学者
-
高内聚, 低耦合: 内聚, 就是一个功能在一个代码块/文件中实现, 一个代码块只实现这一个功能, 尽量不要牵连到其他内容, 低耦合就是各个功能之间尽量做到关系降到最低
-
编码之前做好计划
- 先写需求文档: 当我们做一个项目之前, 先写一下需求文档, 将所有的突发情况都想到之后我们再写代码.
- 做功能之前先写demo: 当我们学习一个东西, 或者要添加一个功能时候, 先写一个小demo, 测试通过了再加入到正式代码中.
- 写bug文档: 在有可能出现bug的地方写出来
-
编写可扩展性的代码
当我们写完一个代码之后, 想要为这个代码增加新功能的时候不需要重新写代码就性
-
不要乱加功能
- 只需要满足自己的需求就行
- 记住, 为什么要写一个你几乎不会用的功能呢? 只能说明你会, 而不是你应该做这个事
-
学会快速查找错误并解决
- 会debug, 会设置断点, 会看错误信息/日志
- 会过滤错误, 找出根源错误: 对于发生的多个错误, 要找出核心错误, 很有可能你的这一个核心错误, 造成了其余的所有错误.
-
会版本控制工具:
-
会学习
- 多看一些开源项目: 为开源框架找找bug, 学习GitHub上星星多的代码, 不会上Github的去Gitee上看看也行
- 一旦你入了程序员这一行, 就永远不要停止学习, 必须与时俱进, 永远站在时代的前列, 不然的话就会在裁员的浪潮中渣都没有剩下.
一旦你入了程序员这一行, 就永远不要停止学习, 必须与时俱进, 永远站在时代的前列, 不然的话就会在裁员的浪潮中渣都没有剩下.
作者联系方式
作者联系方式: [email protected]