转载请注明出处:

http://blog.csdn.net/gane_cheng/article/details/52152497

http://www.ganecheng.tech/blog/52152497.html (浏览效果更好)

代码规范、如何写出好代码

上大学以来,每当看到好的文章,第一反应都是使用浏览器的收藏功能,收藏下来,久而久之,收藏的网址越来越多。虽然浏览器收藏夹也有文件夹的功能可以分门别类,但是终究没有博客的Tag好用,而且只能收藏网址。内容被原作者修改,或者网址失效都是经常发生的事儿。考虑到CSDN应该轻易不会倒闭,还有吕兄和琥哥两位大神的亲身表率,特开通CSDN博客。

作为一个程序员,肯定希望能写出一手好代码,看起来赏心悦目,又易于理解。既方便日后自己回来翻阅一眼就能明白代码在干什么,又能让接手的人很快上手,看到精妙的地方,不由自主地发出由衷的感叹,悄无声息地改变别人不好的习惯。

如何才能写出好代码呢?

在一次讲座上,我听了一位编程大神的看法,在这里分享给大家。

好的代码应该至少具备下面这6个特点:

  1. 使用空行来分割逻辑
  2. 使用注释和花括号
  3. 不用的代码和引用删除
  4. 不要用中文拼音做变量名
  5. 可用,清晰优雅,高效
  6. 多写代码,多思考

使用空行来分割逻辑

一般代码超过30行左右,我们就在考虑,要不要把这些代码封装到一个方法中去。但是即使把这一大段代码扔到一个方法中去,在主函数里调用这个方法,也不能保证以后不会修改这个方法了。所以为了自己和他人,还是有必要对比较长的代码做一些处理。

一般即使是一个方法里面的代码,逻辑也是可以分成一小块一小块的,这个时候我们在这些逻辑中间加上空行,就能告诉别人,我这个代码这里,两个空行中间的代码关联比较大。

看下面的代码,在没有添加任何注释的情况下,因为有空行来分割逻辑,倒也不是一步就吓退想要看你代码的人。

private void tsm_open_file_Click(object sender, EventArgs e)
{this.Text = "数字签名工具 - 添加文件中,请稍候...";if (recordList.Count > 20){MessageBox.Show("最多支持20个文件一次性签名。");return;}OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "程序文件|*.exe;*.dll|可执行文件|*.exe|动态链接库|*.dll";openFileDialog.RestoreDirectory = true;openFileDialog.FilterIndex = 1;openFileDialog.Multiselect = true;if (openFileDialog.ShowDialog() == DialogResult.OK){String[] fileNames = openFileDialog.FileNames;for (int i = 0; i < fileNames.Length; i++){String oldPath = fileNames[i];if (canAddFile(oldPath) == false){MessageBox.Show(String.Format("文件{0}不能添加,因为已经有同名文件了。", oldPath));continue;}FileInfo fileInfo = new FileInfo(oldPath);Record record = new Record();record.FilePath = oldPath;record.AddTime = DateTime.Now;record.FileSize = fileInfo.Length;record.Progress = "0% 新添加";String md5 = MD5Util.getMD5(oldPath);if (md5 == null){MessageBox.Show(String.Format("文件{0}的MD5值计算失败,请查看文件是否被其他程序占用,或稍后再试。", oldPath));continue;}record.MD5 = md5;recordList.Add(record);int index = this.dataGridView.Rows.Add();this.dataGridView.Rows[index].Cells[0].Value = Path.GetFileName(record.FilePath);this.dataGridView.Rows[index].Cells[0].ToolTipText = record.FilePath;this.dataGridView.Rows[index].Cells[1].Value = record.AddTime.ToString();this.dataGridView.Rows[index].Cells[2].Value = FileSizeUtil.getFileSizeWithUnit(record.FileSize);this.dataGridView.Rows[index].Cells[3].Value = record.Progress;this.dataGridView.Rows[index].Cells[4].Value = record.MD5;this.dataGridView.Rows[index].Cells[5].Value = "";}}this.Text = "数字签名工具";
}

使用注释和花括号

在软件开发的生命周期中,文档应该是一直伴随着的。这样,后面接手的人看文档就知道当时发生了什么。如果项目组有使用文档来规范开发,那就要去遵守这个规定。但是文档也有一个问题,就是代码修改之后就要去修改文档,万一文档没有更新,接手的人反而会受到误导。

文档是个好习惯,在坚持更新项目文档的同时,还要记得更新代码的注释,敲完代码后随手加上的简短的几个字,会提高看代码的效率好多倍。

当你焦头烂额的猜测原来编码的人是怎么想的时候,看到下面添加了注释的代码,是不是有一种谢天谢地的感觉。

/// <summary>
/// 执行点击事件
/// </summary>
/// <param name="sender">控件</param>
/// <param name="e">事件</param>
private void tsm_open_file_Click(object sender, EventArgs e)
{//最大数量验证this.Text = "数字签名工具 - 添加文件中,请稍候...";if (recordList.Count > 20){MessageBox.Show("最多支持20个文件一次性签名。");return;}//弹出文件选择框OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "程序文件|*.exe;*.dll|可执行文件|*.exe|动态链接库|*.dll";openFileDialog.RestoreDirectory = true;openFileDialog.FilterIndex = 1;openFileDialog.Multiselect = true;//返回选中的文件if (openFileDialog.ShowDialog() == DialogResult.OK){String[] fileNames = openFileDialog.FileNames;for (int i = 0; i < fileNames.Length; i++){//记录文件路径String oldPath = fileNames[i];//查看是否能添加if (canAddFile(oldPath) == false){MessageBox.Show(String.Format("文件{0}不能添加,因为已经有同名文件了。", oldPath));continue;}//得到文件信息FileInfo fileInfo = new FileInfo(oldPath);//构造记录对象Record record = new Record();record.FilePath = oldPath;record.AddTime = DateTime.Now;record.FileSize = fileInfo.Length;record.Progress = "0% 新添加";String md5 = MD5Util.getMD5(oldPath);if (md5 == null){MessageBox.Show(String.Format("文件{0}的MD5值计算失败,请查看文件是否被其他程序占用,或稍后再试。", oldPath));continue;}record.MD5 = md5;//添加到列表,显示到页面上recordList.Add(record);int index = this.dataGridView.Rows.Add();this.dataGridView.Rows[index].Cells[0].Value = Path.GetFileName(record.FilePath);this.dataGridView.Rows[index].Cells[0].ToolTipText = record.FilePath;this.dataGridView.Rows[index].Cells[1].Value = record.AddTime.ToString();this.dataGridView.Rows[index].Cells[2].Value = FileSizeUtil.getFileSizeWithUnit(record.FileSize);this.dataGridView.Rows[index].Cells[3].Value = record.Progress;this.dataGridView.Rows[index].Cells[4].Value = record.MD5;this.dataGridView.Rows[index].Cells[5].Value = "";}}this.Text = "数字签名工具";
}

花括号{}在代码中一般是有两种形式:

  • 一种是Visual Studio中C++源码编辑器默认的上下对齐式
int main()
{cout<<"我是C++"<<endl;
}
  • 一种是Eclipse中Java源码编辑器默认的左花括号末尾排放式
public class HelloWorld { public static void main(String args[]) { System.out.println("我是Java"); }
}

C++默认方式,更容易看清代码层次;Java默认方式减少占用的行数。

个人更加倾向于上下对齐式。但是个人意见需要服从团队约定。你所在的团队使用哪种方式,你就要使用哪种方式,和大家保持统一。

并且这两种默认方式在集成开发环境IDE中都是可以调节的。比如Java的代码,我平时这样排版。

public class HelloWorld
{public static void main(String args[]){System.out.println("我是Java");}
}

不用的代码和引用删除

我们写代码时,需要修改代码时经常注释之前的代码,然后把自己的代码加上去。但是又不确定自己的代码100%正确,不敢删掉注释的代码,因为可能还会换为原来的代码。

这样导致的后果是以后如果没有看出注释代码的问题,反而觉得很有道理的话,真的会将你的代码重新用注释代码换回来。

我们写代码要相信自己,该删的时候就要删掉。要学会使用SVN或者是Git来进行版本控制。即使当前版本删掉了,回滚到之前版本依然能够找回来。大可不必担心真的会删掉了,这样万一有什么变故,也还是能够找回来的。

我们也会经常注意到编辑器行首有很多黄色的感叹号warning提示。虽然不影响程序正常运行,但是看着就是有点不雅观,而且过多没有使用的引用,或者外部包,框架,库等等也会拖慢程序的运行速度。干掉这些无用的东西既能净化我们的心灵,还能减少不易察觉的隐患。

不要用中文拼音做变量名

现在C#和Java都支持中文变量名,类名。可以试着玩一玩,但是真的不要用到项目中,不只是说中文,还有中文拼音。使用有意义的英文作为变量名更有利于沟通,和外国人沟通方便,和中国人沟通也方便。曾经看到有人设计数据库,字段名全部使用中文拼音缩写,令人费解,而且非常别扭,大概只有自己能看懂吧。

英文变量名也不要用a,b,c,d作为变量名,使用有意义的单词全称一眼就知道这个变量,这个类是做什么用的。大家都很忙,没时间猜来猜去。

可用,清晰优雅,高效

具体到一个实际的功能,代码是可用的,看起来清晰优雅的,运行起来高效的才是好代码的标准。

  • 要做到这三点,首先要明确需求,考虑全面一点,从正确性,边界值,反例三个角度去思考问题,定下详细的需求,掌握需求方的意图。
  • 其次,需要先做一个Demo,用于双方进一步确认需求。没有Demo,双方都不是很确定对方有没有get√到我的意思。有了Demo,绝大部分需求都可以确定下来了。一个粗糙的成品好过一个精美的半成品。不要过早优化,先把粗糙的成品做出来,后续慢慢优化。
  • 最后,具体到代码,很多时候都需要调试代码,不要一上来就断点调试,先看一遍代码,检查代码逻辑,理一理思路,然后采用二分法设置断点输出日志,快速定位问题代码。优化时,确定一个优化的基准,优化之后有对比,用数据来告诉别人优化的效果。

多写代码,多思考

多写代码,多思考;多喝热水,多锻炼。

好的代码是在一定代码量的基础上积累起来的,写的时候要多加思考,不能不知道自己在干什么。

程序员长时间坐在椅子上,对脊椎伤害很大,脖子僵硬。建议多喝热水,多活动。写代码一小时就要停下来休息一下,走一走,动一动。多锻炼身体,身体是革命的本钱。

代码规范、如何写出好代码相关推荐

  1. 大厂秘籍:谷歌代码规范开放下载,手把手教你写出好代码

    这两天和一位大厂的朋友聊天,说起他们今年技术岗晋级答辩要增加代码走读环节,那该如何写出好看又好用的代码? 代码是程序员改变世界的工具,每个程序员都会写代码,但不一定能写出好代码. 如今的大型商业软件系 ...

  2. idea代码提示插件_IDEA 插件推荐 —— 让你写出好代码的神器!

    概述 今天介绍的插件主要是围绕编码规范的.有追求的程序员,往往都有代码洁癖,要尽量减少代码的「坏味道」. 代码静态检查是有很多种类,例如圈复杂度.重复率等.业界提供了很多静态检查的插件来识别这些不合规 ...

  3. 如何写出“简单“代码?

    如何写出"简单"代码? 当你做实际开发中,你一定会发现有人跟你说,或者你在网上看:要写简单代码要写简单代码.    这句话其实就跟大家熟悉的设计模式中的简单(kiss)原则是挂钩的 ...

  4. 写出漂亮代码的45个小技巧

    不知道大家有没有经历过维护一个已经离职的人的代码的痛苦,一个方法写老长,还有很多的if else ,根本无法阅读,更不知道代码背后的含义,最重要的是没有人可以问,此时只能心里默默地问候这个留坑的兄弟. ...

  5. 写出漂亮代码的45个小技巧,真好用

    大家好,我是三友~~ 不知道大家有没有经历过维护一个已经离职的人的代码的痛苦,一个方法写老长,还有很多的if else ,根本无法阅读,更不知道代码背后的含义,最重要的是没有人可以问,此时只能心里默默 ...

  6. 优雅的写出 JavaScript 代码

    目录 前言 避免使用 js 糟粕和鸡肋 编写简洁的 JavaScript 代码 使用 ES6/ES7 新特性 Babel ESLint Prettier 采用函数式编程 优雅的敲 JS 代码的几个原则 ...

  7. 如何写出高性能代码(一)善用算法和数据结构

    同一份逻辑,不同人的实现的代码性能会出现数量级的差异: 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升:同一份代码,也可能在不同处理器上运行也会有几倍的性能差异:十倍程序员不是 ...

  8. 哈哈哈,这个教人写出烂代码的项目在 GitHub 上火了...

    如果说到什么是好代码,我们肯定都能说出一堆规则,例如使用一致的格式和缩进.使用清晰的变量名和方法名.在必要时提供文档与注释.不要过度精简代码等等. 但是对于什么是烂代码,你有比较清晰的认识吗? 在 G ...

  9. 写出漂亮代码的七种方法

    首先我想说明我本文阐述的是纯粹从美学的角度来写出代码,而非技术.逻辑等.以下为写出漂亮代码的七种方法: 1.尽快结束 if 语句 例如下面这个JavaScript语句,看起来就很恐怖:  functi ...

最新文章

  1. 不懂技术系列--如何快速调试html5页面/手机页面
  2. 垃圾回收器机制(一):对象存活及强,弱等各种引用辨析
  3. Gmail进程信息转储分析工具pdgmail
  4. 把一个ListT的数据复制至另一个ListT
  5. SQL Server-聚焦事务对本地变量、临时表、表变量影响以及日志文件存满时如何收缩(三十一)...
  6. php sql获取字段名称,mssql获取字段名及注释,以及一系列问题
  7. 方阵和的行列式、方阵行列式的和
  8. NETGEAR拒绝连接请求_详解 Tomcat 的连接数与线程池
  9. js获取jsp上下文地址
  10. LeetCode:66. 加一(python、c++)
  11. Mongodb中 Documents文档说明
  12. selenium启动火狐浏览器_selenium之nodejs入门使用
  13. 使用transmission下载BT
  14. 一年级同音字心田花开汇总资料(附拼音)
  15. uni-app第三方插件 根据银行卡卡号查询银行类型和卡类型
  16. sina邮箱的发件服务器拒绝,向新浪sina邮箱发信常见退信说明
  17. 九爷 带你玩转mysql引擎Mylsam
  18. MPI中的Bcast, Reduce和Gather使用举例
  19. ESP32开发路程——环境搭建、引脚、烧录、UART、ADC、WS2812、RFID、DAC、FreeRTOS、CJSON
  20. K8S 1.8 平台搭建手册

热门文章

  1. 如何快速学习CADD计算机辅助药物设计
  2. 慌了!ChatGPT吃我饭,还要掀我碗?
  3. 组件,库,控件,插件 集合(jQuery/绘图/富文本/PDF/Excel/国际化/Three.js/JSZip/JSEncrypt/Axios/其他)
  4. 塞氏盘法测水体透明度
  5. [MSSQL]汉字转全拼音函数优化方案(SQLServer),值得你看看
  6. JavaScript getElementById()方法介绍
  7. 淘宝 OAuth2.0 的登录验证与授权
  8. iOS AppStore隐私政策@简洁字帖
  9. Mac 80端口解决办法
  10. 钧道博物馆——022号藏品元早期钧窑红斑长颈瓶