文档章节

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

编辑部的故事
 编辑部的故事
发布于 2017/08/29 19:37
字数 1362
阅读 7554
收藏 247
点赞 16
评论 52

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

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

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

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

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/

© 著作权归作者所有

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

编辑部的故事

粉丝 1105
博文 241
码字总数 400552
作品 0
深圳
运营/编辑
加载中

评论(52)

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

引用来自“bappyfei”的评论

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

11月6日,由DBA+社群主办的数据库技术沙龙在广州成功举办。本次沙龙特邀优维科技公司创办人王津银到场演讲分享,他曾任腾讯公司前端/数据存储运维负责人,并曾在YY和UC参与不同业务形态的运维...

王津银
2015/11/12
0
0
2006 IBM SOA主题会开始座席预定工作

前一段时间的SOA全国巡讲使得SOA这一名词在业内的热度很高,SOA已经成为眼下十分热门的一个话题。今日记者得到消息,IBM也将于11月3日在北京五洲皇冠假日酒店举办一个名为“2006 IBM SOA 直通...

晨曦之光
2012/03/09
0
0
SegmentFault 2017 年社区周报 Vol.1

Hello,各位 SegmentFault 的 GG 和 MM,SegmentFault 新人 Jenny 来报道啦!本喵资料:性别女,爱好你猜,皂片请点击头像~ 新人一周见闻:分享了技术头条,学习了技术问题,放行了一丢丢内容...

Jenny
2017/04/21
0
0
干货|开卷有益,大神级程序猿都在看的17本书

开卷有益,学习的最好途径就是看书。然而很多程序员们往往有看书的冲动,但不知道看哪些书。小编今天就推荐三个不同领域的好书,相信大家一定能够从中有所获益。 前端开发 作为一名前端开发人...

杜弥
01/07
0
0
《移动优先》(Mobile First)

作者:Luke Wroblewski 出版日期:2011年9月 摘要 IT业长期以来翘首以盼的一本完整的,战略性的移动web设计著作终于问世。前雅虎设计架构师和Bagcheck的联合创作者Luke Wroblewski比我们都更...

CTOCIO
2011/12/09
0
0
害怕数据泄露,成为下一个Facebook吗?大牛面对面讲述实战经验!

数据资产的发现和保护一直是个老大难问题,十多年来各种安全技术方案层出不穷,但似乎数据泄露的状况并没有得到改善,反而越来越严重,Equifax、Facebook的数据泄露事件,都给我们敲响了警钟...

奕欣
05/14
0
0
2014年值得学习的编程语言书

经过数据分析和研究 Jobs Tractor 的 45000 个开发人员招聘职位数据,我们得到了上图的结果: 自上一年,主要的变化如下: PHP和Java换了位置,但是仍旧是高居不下 Java的Android已经取代了S...

modernizr
2014/05/22
15.4K
16
互联网+:如何向移动互联网快速战略布局【深圳站】

互联网+:如何向移动互联网快速战略布局【深圳站】 活动概况 时间:2015年04月25日13:30-17:30 地点:深圳腾讯大厦2楼多功能厅 主办:APICloud、信鸽、梆梆安全 网址:www.apicloud.com 费用...

API_Cloud
2015/04/13
112
0
推荐指数五星丨错过直播!不能再错过的百场技术直播全回顾

细数2017,几乎每晚20:00,云栖君都和大家相约在屏幕两端。云栖社区2017年共举办300余场在线直播,10+在线技术峰会,内容涵盖多个技术领域,开发者们可谓是过足了瘾。 考虑到大家忙忙碌碌的工...

云迹九州
01/09
0
0
2014Oracle技术嘉年华

作为国内最顶尖的Oracle数据库技术盛会,我们今年荣幸的邀请到Oracle公司副总裁Thomas Kyte,Pythian集团 CTO Alex Gorbachev等Oracle数据库领域国际级专家,特别为中国的数据库爱好者带来他...

harries
2014/10/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深入了解 Java 自动内存管理机制及性能优化

一图带你看完本文 一、运行时数据区域 首先来看看Java虚拟机所管理的内存包括哪些区域,就像我们要了解一个房子,我们得先知道这个房子大体构造。根据《Java虚拟机规范(Java SE 7 版)》的规...

Java大蜗牛
昨天
7
1
SpringBoot | 第六章:常用注解介绍及简单使用

前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志 配置等。这章节开始,开始总结一些关于springboot的综合开发的知识点。由于SpringBoot本身是基于Spring和SpringMvc...

oKong
昨天
20
0
云数据库架构演进与实践

如今,大型企业如金融企业和银行等,在下一代的微服务架构转型要求下,需要基础软件和数据平台能够实现原生的云化,以满足微服务架构的需求。 微服务,也就是一种面向服务的,有特定边界的松...

巨杉数据库
昨天
1
0
Linux系统梳理---系统搭建(一):jdk卸载与安装

1.去官网下载符合Linux版本的jdk,暂用jdk-8u171-linux-x64.rpm 2.登陆Linux,进入usr目录,创建java目录(方便管理,可以其他位置):mkdir java 3.上传下载的jdk包至Linux服务器,使用rz指令(sz f...

勤奋的蚂蚁
昨天
1
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

六库科技
昨天
1
0
JVM 堆内存设置 -Xmx -Xms

在Tomcat的启动参数里可以设置,如下 参数说明: -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xmx 此设置控制 Java 堆的最大大...

不开心的时候不要学习
昨天
1
0
如何用遗传算法进化出一只聪明的小鹦鹉

问题 现在有一些样本数据,如下表所示。你是否能找到其中的规律,然后计算出新样本的output是多少? input output 样本1 5, 8, 7 9 样本2 2, 8, 4 6 样本3 3, 0, 5 3 样本4 9, 12, ...

StanleySun
昨天
0
0
Coding and Paper Letter(七)

资源整理 1 Coding: 1.R语言包smapr,用于获取和处理NASA SMAP数据的R包。NSIDC提供多个SMAP数据产品,这些产品的处理量各不相同。 目前,smapr主要支持3级和4级数据产品,分别代表全球每日...

胖胖雕
昨天
0
0
IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别

如果面试问到IO操作,这篇文章提到的问题,基本是必问,百度的面试官问我三个问题 (1)什么是NIO(Non-blocked IO),AIO,BIO (2) java IO 与 NIO(New IO)的区别 (3)select 与 epoll,poll区别 我...

1527
昨天
8
0
AMRv8内存管理简介

date: 2017-8-28 1 ARMv8架构简介 1.1背景 2011年,ARM推出了第8代架构ARMv8(ARMv4之前的架构已经被废弃),ARMv8架构是迄今为止ARM历史上变革最大的架构。 如果知道了架构的历史背景,以及...

我叫半桶水
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部