文档章节

30 多年的编码经验浓缩成的 10 条最佳实践

编辑部的故事
 编辑部的故事
发布于 2017/08/29 19:37
字数 1362
阅读 7579
收藏 247

所以,如何写出一手好代码?

良好的代码更易于阅读、理解、调试和修改,最重要的是它的缺陷也更少。显然,编写良好的代码需要更多的时间,但是从长远来看,它也具有更多的价值,因为这降低了维护的成本,而且具有更好的可重用性。

事实上,我们可以将好的代码等同为可重用的代码,这也是本篇文章罗列的许多技巧背后的驱动原则。作为一个要实现特定功能的开发者,代码可以实现你的短期目标,但如果没有其他人希望重用它(包括未来的自己),这些代码一定会缺失某些东西。无论它是太复杂,还是太具体,在不同情况下都有很大可能会出错,或者不被其他开发者信任。

我发现,只要尝试坚持将下面的最佳实践应用于你编写的所有代码(包括你的实验和原型),无论你现在的经验水平如何,都会编写出更好的代码。

1. 遵循单一职责原则

函数是程序员的工具中最重要的抽象形式。它们能更多地被重复使用,你需要编写的代码就越少,代码也因此变得更可靠。较小的函数遵循单一职责原则更有可能被重复使用。

2. 尽量减少共享状态

你应该尽量减少函数之间的隐式共享状态,无论它是文件作用域的变量还是对象的成员字段,这有利于明确要求把值作为参数。当能明确地显示函数需要什么才可以产生所需的结果时,代码会变得更容易理解和重用。

对此的一个推论是,在一个对象中,相对于成员变量,你更应该优先选择静态的无状态变量 (static stateless variables)。

3. 将“副作用”局部化

理想的副作用(例如:打印到控制台、日志记录、更改全局状态、文件系统操作等)应该被放置到单独的模块中,而不是散布在整个代码里面。函数中的一些“副作用”功能往往违反了单一职责原则。

4. 优先使用不变的对象

如果一个对象的状态在其构造函数中仅被设置一次,并且从不再次更改,则调试会变得更加容易,因为只要构造正确就能保持有效。这也是降低软件项目复杂性的最简单方法之一。

5. 多用接口少用类

接收接口的函数(或 C++ 中的模板参数和概念)比在类上运行的函数更具可重用性。

6. 对模块应用良好的原则

寻找机会将软件项目分解成更小的模块(例如库和应用程序),以促进模块级别的重用。对于模块,应该遵循的一些关键原则是:

  1. 尽可能减少依赖
  2. 每个项目应该有一个明确的职责
  3. 不要重复自身

你应该努力使你的项目保持小巧和明确。

7. 避免继承

在面向对象编程中,继承 —— 特别是和虚拟函数结合使用时,在可重用性方面往往是一条死胡同。我很少有成功的使用或编写重载类的库的经历。

8. 将测试作为设计和开发的一部分

我不是测试驱动开发的坚定分子,但开始编码时先编写测试代码会使得代码十分自然地遵循许多指导原则。这也有助于尽早发现错误。不过要注意避免编写无用的测试,良好的编码实践意味着更高级别的测试(例如单元测试中的集成测试或特征测试)在揭示缺陷方面更有效。

9. 优先使用标准库而不是手写的

我经常看到更好版本的 std::vector 或 std::string,但这几乎总是浪费时间和精力。一个明显的事实是 —— 你正在为一个新的地方引入 bug,其他开发者也不太可能重用你的代码,因为没有被广泛理解、支持和测试。

10. 避免编写新的代码

这是每个程序员都应遵循的最重要的教诲:最好的代码就是还没写的代码。你写的代码越多,你将遇到的问题就越多,查找和修复错误就越困难。

在写一行代码之前先问一问自己,有没有一个工具、函数或者库已经实现了你所需要的功能?你真的需要自己实现这个功能,而不是调用一个已经存在的功能吗?

写在最后的话

我发现编程是一门与学习艺术或运动非常相似的技能,你通过刻意的练习和从别人的经验中学习会得到更好的结果。不断提升你产出的代码质量有助于你成为更优秀的程序员。

译自:https://cdiggins.github.io/

© 著作权归作者所有

共有 人打赏支持
编辑部的故事

编辑部的故事

粉丝 1120
博文 244
码字总数 410711
作品 0
深圳
运营/编辑
加载中

评论(52)

久永
久永
以20年编程经验的来说,很赞成文章的总结,也因此总是被老板叫成(慢得像头)老牛。
我的名字叫李猜
我的名字叫李猜

引用来自“bappyfei”的评论

1.对自己好点 2.早点结婚 3.多陪陪家人 4.多交些朋友 5.多出去走走
正解
mahengyang
mahengyang
将测试作为设计和开发的一部分
这条好像没有人评论啊,测试真的好烦
此网页不存在
国内一定得写烂代码,别人接都没法接那种,这才能体现出你的重要性,bug多还能体现出工作量,关键时刻修改重要bug,确保项目成功上线。写的那么好,谁都能看懂,谁来了都能干,要你干啥?连bug都没有,上班干啥去?
东兴帅哥
东兴帅哥
模块 设计让我很爽,为什么不让我用呢
谁说谁是谁的灰
谁说谁是谁的灰
一定要坐直
开源中国-首席村长
开源中国-首席村长
第7条我不认同,违反了装逼法则之一:继承是高级程序员的基本常态技能。
Rezeroer
Rezeroer
能传递函数的地方就不要用类,继承那一套
yak
yak
写出一手好代码 能买上北京的房子吗?
Chet_W
Chet_W
避免继承???
敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)

我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷、UML及两者相结合的实战技巧。 ...

fireball1975
2014/03/19
0
0
[免费讲座] 成都软件技术沙龙 - 开启基于Scrum的敏捷开发全新征程讲座

成都软件技术沙龙4月28日活动议程 开启基于Scrum的敏捷开发全新征程 沙龙介绍: 成都软件技术沙龙成立于2008年,致力于发展成都地区软件事业,结交志同道合的软件界朋友,先后与微软.NET俱乐...

whfill
2011/04/27
0
0
如果你在找 CSS 学习资源,那就收藏这篇文章

本文由伯乐在线 -伯小乐 翻译。未经许可,禁止转载! 英文出处:Grace Smith。欢迎加入翻译组。 如果你在寻找一些 CSS 基础和高级的指南或资源,那这篇文章应该有你要的 CSS 初级和高级指南:...

伯乐在线
2014/11/07
0
0
掘金线下活动 JTalk 第九期 美团智能支付系统架构演进设计

🙋 报名 扫码报名: 报名链接:点我报名 🚀 介绍 掘金线下活动 JTalk 由掘金主办,每期 JTalk 会邀请垂直行业的优秀工程师来分享优秀的实践经验,技巧方法。旨在为开发者提供线下技术交流...

掘金官方
07/23
0
0
吴涛 :低延迟传输协议和新Codec将成为热点

和许多沉浸在多媒体行业多年的技术人一样,吴涛也经历了十多年的摸爬滚打对这一行业不离不弃。用他的话说,没有离开是因为“惰性”。他说,自已远未达到脱颖而出的境界,只是将所学技术和经验...

LiveVideoStack
05/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NetAssist.exe网络调试工具

NetAssist.exe:网络串口调试器, 可以用来网络的串口间的通信,实行串口的监控、调试。 用法:https://jingyan.baidu.com/article/fea4511a70803af7bb91258a.html 在cmd运行框内。输入:net...

一个小妞
今天
0
0
Java锁之ReentrantLock(二)

一、前言 上一篇《Java锁之ReentrantLock(一)》已经介绍了ReentrantLock的基本源码,分析了ReentrantLock的公平锁和非公平锁机制,最终分析ReentrantLock还是依托于AbstractQueuedSynchro...

木木匠
今天
0
0
665. Non-decreasing Array - LeetCode

Question 665. Non-decreasing Array Solution 题目大意: 思路:当前判断2的时候可以将当前元素2变为4,也可以将上一个元素4变为2,再判断两变化后是否满足要求。 Java实现: public boole...

yysue
今天
0
0
java Base64转码传图到C#

项目碰到一个需求,需要把后台的图片,传到终端去. Java服务端用webService传XMl格式数据到C#终端。 实现的思路是把图片字节流用Base64转码,到C#在解码。 开始的时候,在C#端死活转不回图片。后...

无小农
今天
0
0
Spring 装配类的几种方法

一.前言 二.将一个类交由spring管理的方法 1. @bean 2. @Controller, @Service, @Component .....等配合@ComponentScan 3. @Configuration 配合@EnableAutoConfiguration 4. @Import(Class<?......

JackieRiver
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部