30 多年的软件经验,总结出 10 个编写出更好代码的技巧
30 多年的软件经验,总结 10 个最佳妙招。
那么,何以敲出一手好代码?
好代码可以定义为易读、易懂、易调试、易改,最重要的还要少缺陷。显然,要想敲出一手好代码,是要花不少时间,但这在长久来看是有意义的,因为你可以花更少时间及精力去维护和复用你的代码。
事实上,我们可以将好代码等同于可复用的代码,这也是下面提到的重要原则之一。代码可能只是完成了编程工作中短期目标的特定功能,但如果没人(包括你自己)愿意复用你的代码,这代码在某种程度上可以说是不足且有缺陷的。要么太复杂、要么太具体、要么在不同情况下极有可能崩掉,或者其他程序员可能不相信你的代码。
下面无论你的经验水平如何,如果你始终如一地将下面的妙招应用到你的代码中(包括你的实验或者原型),那么一手好代码随手可得。
1、 遵循单一责任原则
函数在程序员的库中是单一最重要的抽象形式。可以被复用的机会越多,你要写的代码就越少,这些代码就越可靠。遵循单一责任原则的小小函数更有可能被重新使用。
2、最小化共享状态
应该将函数之间的隐式共享状态最小化,无论它是文件作用域变量还是对象的成员字段,这有利于显式地将所需的值作为参数。当明确函数实现所需结果时,代码变得容易理解和重用。
对此可以得出一个结论,你应该优先选择静态无状态变量而不是对象的成员变量。
3、本地化副作用
理想的副作用(例如打印到控制台、记录、改变全局状态、文件系统操作等)应该放置在单独的模块中,而不是分散在整个代码中。功能上的副作用往往违反了单一的责任原则。
4、优先选择不可变的对象
如果一个对象的状态在其构造函数中设置一次,并且不再次更改,则调试变得容易得多,因为一旦构造正确就保持有效。这是降低软件项目复杂性的最简单方法之一。
5、多用接口少用类
接受接口的函数(或C++中的模板参数或概念)比在类上操作的函数可重用性更强。
6、对模块应用良好的原则
将软件项目分解成更小的模块(例如库和应用程序),以实现模块化重用。模块的一些关键原则是:
- 最小化依赖关系
- 每个项目都应该有一个单一明确的功能
- 不要重复
你应该努力让你的项目保持小巧和明确。
7.避免继承
在面向对象编程中,继承,特别是虚拟函数在可重用性方面往往是一个死穴。我很少能成功地使用能覆盖类的库。
8.同设计和开发一样进行测试
我并不是测试驱动开发的铁杆拥护者,但在你开始编写测试代码时,编写测试自然遵循了许多指导方针。它也有助于早点将错误暴露出来。避免编写无用的测试,良好的编码意味着更高级的测试(例如,单元测试中的集成测试或功能测试)在显示缺陷方面更有效。
9.优先选择而不是手写标准库
我无法告诉你需要多久才能看到一个 std :: vector 或 std :: string 更好的版本,但它几乎总是浪费时间和精力。除了一个显而易见的事实,那就是你正在把 bug 引入一个新的地方。(见技巧10)其他程序员不太可能重用您的代码,而不是那些被广泛理解、支持和测试的代码。
10.避免写新代码
最重要的一点是,每位程序员应遵循:“The best code is the code that isn’t written”(最好的代码是不用被复写的代码)。你的代码越多,缺陷就越多,找到并修复 bug 就越困难。
在编写一行代码之前先问问自己,有没有一个工具,函数或库已经做了你所需要的功能?你真的需要自己去实现这个功能,而不是调用另一个已经存在的功能吗?
总结
编程就好比是一种艺术形式或者一项运动,你只有通过不断地练习,不断地向他人学习,才能不断地提高代码的质量,这些都将有利于你成为更加高效的程序员。
原文:10 Tips for Writing Better Code
作者:Christopher Diggins
翻译:陈云龙
30 多年的软件经验,总结出 10 个编写出更好代码的技巧相关推荐
- 经验分享:10个简单实用的 jQuery 代码片段
尽管各种 JavaScirpt 框架和库层出不穷,jQuery 仍然是 Web 前端开发中最常用的工具库.今天,向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段. 您可能感兴趣的相 ...
- 10 个牛逼的单行代码编程技巧,你会用吗?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 「程序猿DD」星球活动第一期进行中!点击了解详情! 翻译 ...
- 超酷炫技:10 个牛逼的单行代码编程技巧
翻译 | 飒然Hang 来源 | https://www.rowkey.me/blog/2017/09/09/java-oneliners/ 原文 | https://github.com/aruld ...
- 有着 30 多年经验的程序员最终被辞退了
[编者按]试想这样一个问题:如果有一种终身职业,你愿意从事吗?本文主人公已经65岁,在建筑行业工作9年后开始转行做程序员,在他看来,只要愿意,这个职业就可以一直干下去-- 作者 | AP Carpen ...
- 硬核软件开发者 30 多年的 11 条经验教训
从非专业编程到专业的开发者,从 BASIC.C++ 到 Rust,在本篇文章中,已在软件开发行业摸爬滚打 30 年的老兵将带来自己最为深刻的 11 个经验教训. 作者 | Dean Roddey 译者 ...
- 30多年程序员生涯经验总结(成功源自于失败中的学习;失败则是因为容忍错误的横行)...
英文原文:Lessons From A Lifetime Of Being A Programmer 在我 30 多年的程序员生涯里,我学到了不少有用的东西.下面是我这些年积累的经验精华.我常常想,如 ...
- 30多年程序员生涯经验总结
本文是码农网原创翻译,转载请看清文末的转载要求,谢谢合作! 在我30多年的程序员生涯里,我学到了不少有用的东西.下面是我这些年积累的经验精华.我常常想,如果以前能有人在这些经验上指点一二,我相信我现在 ...
- rds基于什么开发_元王RDS--让H公司的10多年的设计经验重获新生!
提起H公司,估计没有人不知道,他是中国优秀民族企业的代表,是国人的骄傲.现在十个人总会有五个人是在用他们的产品,近些年H公司之所以能有如此大的成就,小编认为与H公司非常重视研发和知识管理密不可分.仅2 ...
- 循环队列,定义循环队列长度为10,编写初始化队列、入队、出队、求队长,实现10,20,30,40,50,60,70,80入队,10,20,30出队,56,67入队的算法功能。
循环队列,定义循环队列长度为10,编写初始化队列.入队.出队.求队长,实现10,20,30,40,50,60,70,80入队,10,20,30出队,56,67入队的算法功能. #include< ...
最新文章
- 在VS2017中用c#编写程序执行python遇到中文不能处理出现乱码的情况
- Gamebryo实例学习之二BackgroundLoad
- C#实现反射调用动态加载的DLL文件中的方法
- Requst Servervariables
- 微信一键设置“姓氏头像”,学起来!
- PaddlePaddle常用镜像
- Docker 容器启动 查看容器状态 - 四
- 上海财经应用统计考python_2021年上海财经大学应用统计硕士考研必看成功上岸前辈复习经验分享...
- 机器学习中最重要的公式——贝叶斯公式
- Android Studio报错Error:java.lang.RuntimeException: Crunching Cruncher xx.png failed, see logs
- Javaweb的HTML的表单标签
- Mezzanine基于 Django 的CMS系统框架搭建
- 复杂性思维中文第二版 五、细胞自动机
- 游戏运营相关名词及解释
- Fiddler 抓包HTTPS包,抓手机包
- 苹果发布Swift编程语言 - iOS移动开发周报
- Log4C的基本用法
- Java面试题基础系列228道(1),快看看哪些你还不会?
- Linux Shell程序设计(2)
- C#开发 AutoCAD二次开发 自动创建显示Ribbon界面(带图片),打开AutoCAD自动显示,执行响应程序
热门文章
- mysql 临时表_第05问:MySQL 在处理临时结果集时,内部临时表会使用多少内存?...
- python相同key合并value_python之入门
- 2020-10-13 四元数用法(不讲原理,只讲计算规则)
- jeecms内容管理系统使用了哪些技术
- 通过ITypedList实现数据绑定扁平化
- [Alfred]为Baidu Weather Workflow更新图标
- 奇怪吸引子---NoseHoover
- Restful framework【第七篇】权限组件
- Spring 学习04
- Python 字典dict操作定义