文档章节

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

编辑部的故事
 编辑部的故事
发布于 2017/08/29 19:37
字数 1362
阅读 7513
收藏 248
点赞 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/

© 著作权归作者所有

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

编辑部的故事

粉丝 1083
博文 231
码字总数 392922
作品 0
深圳
运营/编辑
加载中

评论(52)

yumai_lau
yumai_lau

引用来自“小紫羽”的评论

这算码农界的鸡汤文吧
感觉算是。
piyoma
piyoma
这是谁写的?
首席缺陷修复工程师
首席缺陷修复工程师
如果你还在纠结第7条,说明你没理解,多用组合而不是继承
roadflow
roadflow

引用来自“久永”的评论

以20年编程经验的来说,很赞成文章的总结,也因此总是被老板叫成(慢得像头)老牛。
:+1:
最初的-梦想
最初的-梦想
尽量不要自己写代码,找别人写好的复制:smirk:
yhh晓龍zhh
yhh晓龍zhh

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

国内一定得写烂代码,别人接都没法接那种,这才能体现出你的重要性,bug多还能体现出工作量,关键时刻修改重要bug,确保项目成功上线。写的那么好,谁都能看懂,谁来了都能干,要你干啥?连bug都没有,上班干啥去?

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

thread.sleep(100000),下次优化的时候删掉,满足客户的优化的心里预期
溜的不行
Caelebs
Caelebs
干了这碗毒鸡汤
xmlspyspring
xmlspyspring

引用来自“Klaus88”的评论

引用来自“DennisXiong”的评论

7. 避免继承

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



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

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

引用来自“hqdmy”的评论

2. 尽量减少共享状态
这条没看明白
比如actor模式
Kit_lee
Kit_lee

引用来自“DennisXiong”的评论

7. 避免继承

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



继承、多态都不让用了,请问该怎么做OOP,GOF的设计模式怎么用?
没说不让用吧,只是避免而已,继承用多了会让代码耦合严重
javascript——从「最被误解的语言」到「最流行的语言」

JavaScript曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax的到来,JavaScript“从最受误解的编程语言演变为最流行的语言”,这除了幸运之外,...

modernizr ⋅ 2014/05/20 ⋅ 12

30 多年的编码经验总结成 10 条最佳实践

欢迎Follow我的GitHub, 关注我的CSDN. 其余参考Android目录 我们微信公众号:杨守乐 所以,如何使代码变得更好? 好的代码可以被识别为易于阅读、理解、调试和修改的代码,而且最重要的是很少...

xiaole0313 ⋅ 2017/10/22 ⋅ 0

没有圣诞节礼物?Android先生送你一本《阿里巴巴Java开发手册》

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

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

Python书单

Python 之所以这么流行得益于它适用于很多不同领域,目前 Python 使用最广泛的领域包括有 Python Web(后端)开发、数据分析挖掘、网络爬虫、机器学习人工智能、运维开发等等。不管你选择哪个...

liuzhijun ⋅ 2017/11/02 ⋅ 0

DBAplus广州社群第一次线下活动

2015年11月6日,由DBA+社群主办的数据库技术沙龙在广州成功举办。 沙龙专题1丨王津银:互联网运维的整体理念与最佳实践 本次沙龙特邀优维科技公司创办人王津银到场演讲分享,他曾任腾讯公司前...

jimshu ⋅ 2015/11/10 ⋅ 0

云栖大会 钉钉获评企业数据安全标杆

  【IT168 资讯】10月14日,在杭州举办的云栖大会进入第4天,《数据安全生态专场》举办的“数据经济 生态共建――数据安全可持续发展分论坛”引发关注。十多位国内顶尖的数据安全专家及法律...

it168网站 ⋅ 2017/10/16 ⋅ 0

OSC 第 112 期高手问答 -- 编写高质量的 C 程序代码

OSCHINA 本期高手问答(3月14日-3月18日)我们请来了 @madengwei (马伟)为大家解答关于编写高质量的 C 程序代码的问题。 @madengwei 马伟,现任华康移动医疗技术总监,资深软件开发专家和架构...

红薯 ⋅ 2016/03/14 ⋅ 30

java 7 入门书籍

一、Java从入门到精通 《Java从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识。 《Java从入门到精通(第3版...

modernizr ⋅ 2014/05/15 ⋅ 9

最新的 OWASP Top 10 ,查“缺”补“漏”必备神器

2017 年,Equifax 宣布黑客窃取了其 1.45 亿条客户记录。黑客利用了 Equifax 的 Web 应用程序托管平台的一个已知安全漏洞。2015 年,英国电信公司 TalkTalk 有 157000 条客户记录遭窃,一群十...

IBMdW ⋅ 01/23 ⋅ 0

上海云栖大会 - 阿里云 MVP 专场,等你加入

如何优化企业级系统架构 云栖大会的阿里云 MVP 专场是由 阿里云MVP 为演讲嘉宾输出的精品分论坛,阿里云 MVP 是云计算的布道师,行业的领路人,他们游走在各行业间,对专业领域颇有建树,他们...

费亮 ⋅ 06/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 33分钟前 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部