文档章节

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

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

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

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

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

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

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/

© 著作权归作者所有

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

编辑部的故事

粉丝 1219
博文 255
码字总数 457655
作品 0
深圳
运营/编辑
私信 提问
加载中

评论(52)

冒牌攻城狮
冒牌攻城狮
新人在学习
DennisXiong
DennisXiong

引用来自“Klaus88”的评论

引用来自“DennisXiong”的评论

7. 避免继承

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



继承、多态都不让用了,请问该怎么做OOP,GOF的设计模式怎么用?

@DennisXiong 不要再去想什么设计模式了,程序如文章,关键是1、半年后你自己能看得懂自己的代码,2、别人能看懂你的代码。一圈又一圈的套设计模式是阻碍看得懂的,生套设计模式就和孔乙己一样了。

回复@Klaus88 : 不敢苟同,继承是对现实业务自然的抽象,为什么会影响阅读。
一生做恶
一生做恶
最重要一条,不要编码
戎码生涯
戎码生涯
除了避免继承,其他的感觉挺好
哦_是你
哦_是你

引用来自“大后锋”的评论

引用来自“开源中国-首席村长”的评论

第7条我不认同,违反了装逼法则之一:继承是高级程序员的基本常态技能。
可惜= =程序员往往没有财产,继承个啥啊?

扎心了老铁~~唉不说了
Klaus88
Klaus88

引用来自“DennisXiong”的评论

7. 避免继承

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



继承、多态都不让用了,请问该怎么做OOP,GOF的设计模式怎么用?

@DennisXiong 不要再去想什么设计模式了,程序如文章,关键是1、半年后你自己能看得懂自己的代码,2、别人能看懂你的代码。一圈又一圈的套设计模式是阻碍看得懂的,生套设计模式就和孔乙己一样了。
Andrew_Yang
Andrew_Yang

引用来自“bappyfei”的评论

1.对自己好点 2.早点结婚 3.多陪陪家人 4.多交些朋友 5.多出去走走
like+1
D名比人改晒
D名比人改晒

引用来自“bappyfei”的评论

1.对自己好点 2.早点结婚 3.多陪陪家人 4.多交些朋友 5.多出去走走
哈哈 笑死我了
大后锋
大后锋

引用来自“此网页不存在”的评论

国内一定得写烂代码,别人接都没法接那种,这才能体现出你的重要性,bug多还能体现出工作量,关键时刻修改重要bug,确保项目成功上线。写的那么好,谁都能看懂,谁来了都能干,要你干啥?连bug都没有,上班干啥去?
thread.sleep(100000),下次优化的时候删掉,满足客户的优化的心里预期
大后锋
大后锋

引用来自“开源中国-首席村长”的评论

第7条我不认同,违反了装逼法则之一:继承是高级程序员的基本常态技能。
可惜= =程序员往往没有财产,继承个啥啊?
PostgreSQL深圳用户分会

主题: PG逻辑复制BDR、PGXC、PG RDS 主办: Postgres深圳用户会201501会(40人规模) 微信公众号:PostgresChina 官网:postgres.cn 承办:Postgres深圳分会 费用:免费(特别感谢宝华提供会议场...

YuanyuanL
2015/08/10
68
0
LiveVideoStack Meet成都:多媒体开发新趋势

2018年初的音视频技术生态并不平静,Codec的争夺进入群雄逐鹿的时代,AV1和国产的AVS2对HEVC发起了挑战;WebRTC 1.0版定稿打通了在浏览器、移动端乃至IoT上的多媒体通信;AI、区块链技术的发...

rpandora
2018/11/12
0
0
移动开发烽火台:Android大咖秀

★ 对不起,这是一场实用型技术沙龙! 拒绝伪鸡汤,只谈技术实践! 想看大咖们如何披荆斩棘? 带上期待,一起来吧! ★ 活动议程: 13:30-14:00 签到 14:00-14:10 主持人开场词 14:10-14:40 ...

eimysty
2015/12/10
216
0
【上海】PyConChina2016 - 9/10

北京分场详情链接: http://www.huodongxing.com/go/pycon2016bj 深圳分场详情链接: http://www.huodongxing.com/go/pycon2016sz 大会详情 开源编程语言Python近年来在互联网、游戏、云计算...

TopGeek
2016/09/02
260
0
没有圣诞节礼物?Android先生送你一本《阿里巴巴Java开发手册》

来头 2017年,阿里诚意献上重磅大礼——《阿里巴巴Java开发手册》(以下简称“《手册》”),首次公开阿里官方Java代码规范标准。《手册》从构思开始,历时3年,历经无数次内部针锋相对地讨论...

24K纯帅豆
2017/12/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

207. 多数据源 ssm项目

参考博客: https://blog.csdn.net/a15020059230/article/details/76677322 1.效果 一个项目同时连接多个数据源 2. 过程 2.1 搭建单数据源ssm项目 https://my.oschina.net/springMVCAndsprin...

Lucky_Me
36分钟前
1
0
a标签点击浏览器下载图片,不打开

网上好多给a标签加download属性的,但都不好使。 <!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Auth......

S三少S
45分钟前
31
0
搭建私有maven仓库并在项目中使用

这是一篇写给女朋友看的教程...前方高能,注意避让~ 1.私有maven仓库的搭建 搭建环境为阿里云ESC服务器,CentOS.确保服务器已经安装Jdk。然后我要手把手教你安装和启动nexus。 Step1:新建一个...

liululee
47分钟前
4
0
js 写文件

//写文件function doSave(value, type, name) {    var blob;    if (typeof window.Blob == "function") {        blob = new Blob([value], {type: type});    }......

重城重楼
57分钟前
3
0
Ubuntu and Apache 搭建 Let's Encrypt SSL Https

本文参考来着来自https://www.howtoing.com/install-free-lets-encrypt-ssl-certificate-for-apache-on-debian-and-ubuntu 感谢作者的分享 本事例环境介绍 ubuntu (Version 16.04.1 LTS) ubu......

罗培海
今天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部