10 步让你成为更优秀的程序员

这篇文章要介绍的,是我作为专业程序员这些年来学到的能真正提高我的代码质量和整体工作效率的10件事情。

1. 永远不要复制代码

不惜任何代价避免重复的代码。如果一个常用的代码片段出现在了程序中的几个不同地方,重构它,把它放到一个自己的函数里。重复的代码会导致你的同事在读你的代码时产生困惑。而重复的代码如果在一个地方修改,在另外一个地方忘记修改,就会产生到处是bug,它还会使你的代码体积变得臃肿。现代的编程语言提供了很好的方法来解决这些问题,例如,下面这个问题在以前很难解决,而如今使用lambdas却很好实现:

[java] view plaincopyprint?
  1. /// <summary>  
  2. /// 一些函数含有部分重复代码  
  3. /// </summary>  
  4. void OriginalA()  
  5. {  
  6.     DoThingsA();  
  7.   
  8.     // unique code  
  9.   
  10.     DoThingsB();  
  11. }  
  12.   
  13. /// <summary>  
  14. /// 另外一个含有部分重复代码的函数  
  15. /// </summary>  
  16. void OriginalB()  
  17. {  
  18.     DoThingsA();  
  19.   
  20.     // 没有重复的代码  
  21.   
  22.     DoThingsB();  
  23. }  

现在我们重构含有部分相同代码的函数,用delegate模式重写它们:

[java] view plaincopyprint?
  1. /// <summary>  
  2. /// Encapsulate shared functionality  
  3. /// </summary>  
  4. /// <param name="action">User defined action</param>  
  5. void UniqueWrapper(Action action)  
  6. {  
  7.     DoThingsA();  
  8.   
  9.     action();  
  10.   
  11.     DoThingsB();  
  12. }  
  13.   
  14. /// <summary>  
  15. /// New implmentation of A  
  16. /// </summary>  
  17. void NewA()  
  18. {  
  19.     UniqueWrapper(() =>  
  20.     {  
  21.         // unique code  
  22.     });  
  23. }  
  24.   
  25. /// <summary>  
  26. /// New implementation of B  
  27. /// </summary>  
  28. void NewB()  
  29. {  
  30.     UniqueWrapper(() =>  
  31.     {  
  32.         // unique code  
  33.     });  
  34. }  

2. 留意你开始分心的时候

当你发现自己在浏览facebook或微博、而不是在解决问题,这通常是一种你需要短暂休息的信号。离开办公桌,去喝一杯咖啡,或去跟同事聊5分钟。尽管这样做看起来有点反直觉,但长久去看,它会提高你的工作效率。

3. 不要匆忙赶任务而放弃原则

当带着压力去解决一个问题或修改一个bug,你很容易失去自制,发现自己匆匆忙忙,甚至完全忘了一直坚持的重要的测试过程。这通常会导致更多的问题,会让你在老板或同事眼里显得很不专业。

4. 测试你完成的代码

你知道你的代码能做什么,而且试了一下,它确实好用,但你实际上需要充分的验证它。分析所有可能的边界情况,测试在所有可能的条件下它都能如期的工作。如果有参数,传递一些预期范围外的值。传递一个null值。如果可能,让同事看看你的代码,问他们能否弄坏它。单元测试是到达这种目的的常规方法。

5. 代码审查

提交你的代码之前,找个同事一起坐下来,向他解释你做了哪些修改。通常,这样做的过程中你就能发现代码中的错误,而不需要同事说一句话。这比自己审查自己的代码要有效的多得多。

6. 让代码更少

如果你发现写了大量的代码来解决一个简单的问题,你很可能做错了。下面的boolean用法是一个很好的例子:

[java] view plaincopyprint?
  1. if (numMines > 0)  
  2. {  
  3.    enabled=true;  
  4. }  
  5. else  
  6. {  
  7.    enabled=false;  
  8. }  

这时你应该写成这样:

[java] view plaincopyprint?
  1. enabled = numMines > 0;  

代码越少越好。这会使bug更少,重构可能性更小,出错的几率更小。要适度。可读性同等重要,你可不能这样做而使代码丧失可读性。

7. 为优雅的代码而努力

优雅的代码非常的易读,只用手边很少的代码、让机器做很少的运算就能解决问题。在各种环境中都做到代码优雅是很难的,但经过一段时间的编程,你会对优雅的代码是个什么样子有个初步的感觉。优雅的代码不会通过重构来获得。当你看到优雅的代码是会很高兴。你会为它自豪。例如,下面就是一个我认为是优雅的方式来计算多边形面积的方法:

[java] view plaincopyprint?
  1. static public double GetConvexPolygonArea(Vector2[] vertices)  
  2. {  
  3.     double area = 0;  
  4.     for (int i = 0; i < vertices.Length; i++)  
  5.     {  
  6.         Vector2 P0 = vertices[i];  
  7.         Vector2 P1 = vertices[(i + 1) % vertices.Length];  
  8.   
  9.         area += P0.Wedge(P1);  
  10.     }  
  11.   
  12.     return area / 2;  
  13. }  

8. 编写不言自明的代码

勿庸置疑,注释是编程中很重要的一部分,但能够不言自明的代码跟胜一筹,因为它能让你在看代码时就能理解它。函数名变量名要慎重选择,好的变量/方法名字放到语言语义环境中时,不懂编程的人都能看懂。例如:

[java] view plaincopyprint?
  1. void DamagePlayer(Player player, int damageAmount)  
  2. {  
  3.     if (!player.m_IsInvincible && !player.m_IsDead)  
  4.     {  
  5.         player.InflictDamage( damageAmount );  
  6.     }  
  7. }  

能自我说明的代码不能代替注释。注释是用来解释“为什么”的,而自我说明的代码是来描述“是什么”的。

9. 不要使用纯数字

直接把数字嵌入代码中是一种恶习,因为无法说明它们是代表什么的。当有重复时更糟糕——相同的数字在代码的多个地方出现。如果只修改了一个,而忘记了其它的。这就导致bug。一定要用一个命名常量来代表你要表达的数字,即使它在代码里只出现一次。

10. 不要做手工劳动

当做一系列动作时,人类总是喜欢犯错误。如果你在做部署工作,并且不是一步能完成的,那你就是在做错事。尽量的让工作能自动化的完成,减少人为错误。当做工作量很大的任务时,这尤其重要。

11. 避免过早优化

当你要去优化一个已经好用的功能代码时,你很有可能会改坏它。优化只能发生在有性能分析报告指示需要优化的时候,通常是在一个项目开发的最后阶段。性能分析之前的优化活动纯属浪费时间,并且会导致bug出现。

好吧,我说是10个,但你却得到了额外赠送的一个!

这些就是我要说的,我希望它们能帮助你改进编程开发过程。

下次再见!祝快乐!

Cheers, Paul.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《流浪地球》 电影全集

《流浪地球》 电影全集 《流浪地球》是由郭帆导演&#xff0c;吴京特别出演&#xff0c;屈楚萧、李光洁、吴孟达等人主演的科幻片《流浪地球》宣布定档2019大年初一。同时&#xff0c;影片发布了一款定档预告片&#xff0c;预告片开头传来一段广播声音&#xff1a;“太阳急速老…

kotlin之plus、copyOf、reverse、forEach、filter、map、reduce、fold等函数解释和使用

kotlin之::函数调用、plus&#xff08;增加元素&#xff09;、copyOf&#xff08;复制数组&#xff09;、reverse&#xff08;翻转数组&#xff09;、forEach&#xff08;遍历数组&#xff09;、filter&#xff08;过滤数组&#xff09;、map函数操作及扩展、reduce函数、fold函…

linux 常用命令 杂记

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.cat cat 命令用于连接文件并打印到标准输出设备上。 使用权限 所有使用者 2.Linux chgrp命令用于变更文件或目录的所属群组。 3.Linux…

C程序员要学C++吗?

最近网友问到这一问题&#xff0c;但我更希望被问的是“C程序员需要学面向对象编程吗&#xff1f;”&#xff0c;那就让我先从回答这一问题开始&#xff0c;并做适当的扩展。 就我的成长经历来看&#xff0c;C程序员必须学习面向对象编程&#xff01;面向对象编程语言有其天然的…

追女生心理研究(本人母胎单身,就是想做准备,并无其他意思)

聊天话题&#xff1a; 1。兴趣爱好&#xff1a;美食&#xff0c;旅游&#xff0c;宠物等 2。现在和曾经的自己&#xff0c;分享自己的经历 3。我变成我们&#xff0c;未来规划 4。分析隐私&#xff0c;比如一些小秘密 5。价值观&#xff0c;对未来的规划等 聊天话题技巧 …

dlopen 和 dlsym 动态调用函数

Linux/unix 提供了使用 dlopen 和 dlsym 方法动态加载库和调用函数&#xff0c;这套方法在 macOS 和 iOS 上也支持。dlopen 打开一个库&#xff0c;获取句柄。dlsym 在打开的库中查找符号的值。dlclose 关闭句柄。dlerror 返回一个描述最后一次调用dlopen、dlsym&#xff0c;或…

通过腾讯地图服务获取行政区划信息

接口说明地址&#xff1a; https://lbs.qq.com/webservice_v1/guide-region.html 以下是源代码及表创建脚本。 源码及相关文件下载转载于:https://www.cnblogs.com/challengesoflife/p/10405366.html

情感学习聊天方法

1.非正常聊天法 出人意料的聊天技巧&#xff0c;展示幽默感&#xff0c;让对方对自己产生兴趣 比如对方说&#xff1a;你的朋友圈好多美女啊。回答还好了&#xff0c;没有了。场面会一度尴尬 但可以这么说&#xff1a;你这样是在间接夸自己是美女。或者&#xff1a;还好啦&a…

面向对象设计的优点

一旦明白了软件设计的真谛&#xff08;参见《软件设计的真谛》&#xff09;&#xff0c;我们就更能理解面向对象设计的优点。简单说来&#xff0c;它更便于我们在软件中构建更真实的虚拟世界。 首先&#xff0c;对象的引入方便了在软件虚拟世界中模拟现实世界。现实世界是由很…

利用SVD-推荐未尝过的菜肴2

推荐未尝过的菜肴-基于SVD的评分估计 实际上数据集要比我们上一篇展示的myMat要稀疏的多。 from numpy import linalg as la from numpy import * def loadExData2():return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],[0, 0, 0, 0, 4, 0, 0, 1, 0,…

在图像中截取小图并保存

实现以横向步长step_row、纵向步长step_col&#xff0c;在一幅大图上剪裁宽度为width、高度为height的小图像&#xff0c;图像命名形式为“数字(递增)_大图名”格式&#xff0c;将小图保存在argv[6]的文件夹中。 #include <opencv2/opencv.hpp> #include <string> …

Linux 文件与目录管理、ls、cd、pwd、mkdir、rmdir、cp、 rm

见&#xff1a;http://www.runoob.com/linux/linux-file-content-manage.html我们知道Linux的目录结构为树状结构&#xff0c;最顶级的目录为根目录 /。 其他目录通过挂载可以将它们添加到树中&#xff0c;通过解除挂载可以移除它们。 在开始本教程前我们需要先知道什么是绝对路…

软件设计的真谛

假设我们身边的一切都是用制造材料加以描述的&#xff1a;“空调”不是“空调”&#xff0c;而是“由金属和塑料做成的物体”&#xff1b;“书”不是“书”&#xff0c;而是“由纤维和墨做成的物体”。沟通时我们也不用“空调”和“书”这样的词汇&#xff0c;而是“金属和塑料…

脱单特质

1.上进心 所有人都想过好日子&#xff0c;物质不行&#xff0c;一定要有上进心&#xff0c;可以做出未来给予 2.外在形象 注重打理外在形象&#xff0c;所有人都是爱美的 3.无法控制自己&#xff0c;同时不去了解女生 控制住自己&#xff0c;才有更多的时间去了解和思考女…

云栖社区云栖号(团队博客)攻略【2018版】

云栖社区云栖号是什么&#xff1f; 这是一个为技术团队打造的专区&#xff08;小站&#xff09;&#xff0c;团队成员的技术文章将在这里汇总&#xff0c;可以帮助团队沉淀优质技术内容、打造技术品牌和影响力等。 云栖号申请条件 点击https://yq.aliyun.com/teams页面右侧的【…

1030 完美数列 (25 分)二分

1030 完美数列 &#xff08;25 分&#xff09;给定一个正整数数列&#xff0c;和正整数 p&#xff0c;设这个数列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;则称这个数列是完美数列。 现在给定参数 p 和一些正整数&#xff0c;请你从中选择尽可能…

两性位置

男生不被女生当回事&#xff0c;在自己身上&#xff0c;需要从自身找原因 1.过度看重对方&#xff0c;会让对方看轻自己 2。气场比较弱&#xff0c;本身实力弱&#xff0c;会让对方俯视自己 3.太过善良&#xff0c;一昧迁就&#xff0c;会导致自己失去生活重心&#xff0c;让…

高质高效软件开发组织能力模型

背景至今&#xff0c;我在Motorola网络部工作超过了5年&#xff0c;所在的产品线也是采用统一软件开发过程和敏捷思想(但不是SCRUM)来组织软件开发活动的&#xff0c;但这5年多的工作经历从未引起我象微博上对于SCRUM话题的激烈讨论这样的思考。原因之一可能是&#xff0c;公司…

python并发编程之多线程

多线程 线程 1.什么是线程 进程是一个执行空间 , 线程就是其中真正工作的单位 , 每一个进程至少有一个线程(如果我们把操作系统比喻为一个工厂 , 进程就是车间 , 线程就是流水线) 进程包含了运行该程序所需要所有资源 , 进程是一个资源单位 , 线程是CPU的最小执行单位 每一个进…

JavaScript几个难点

1. 立即执行函数 立即执行函数&#xff0c;即Immediately Invoked Function Expression (IIFE)&#xff0c;正如它的名字&#xff0c;就是创建函数的同时立即执行。它没有绑定任何事件&#xff0c;也无需等待任何异步操作&#xff1a; (function() { // 代码 // ...})(); f…