文档章节

#程序员自我修炼(一) - 如何编写合格代码(上)

ali安东尼
 ali安东尼
发布于 2017/07/10 14:39
字数 832
阅读 4
收藏 0

在文章的开头,我先给 “合格的代码” 来做个定义:

  • 满足要求定义的初始化规则
  • 代码清晰简洁,没有思维逆反的逻辑或者刻意为之的陷阱代码
  • 尽可能控制代码风险
  • 合理的代码注释
  • 合理的标准化接口定义合,杜绝误用或者滥用

我先从一个实际例子来说起。

有人可能会问:如果一个函数的长度被标准化要求严格限制在几十行以内,还不够清晰简洁么?可读性还会差么?

我给出的答案是:会的。

function clean(tags) {
  var dedupe = {};
  for (var i=0; i<tags.length; i++){
	 tags[i] = tags[i].trim();
	 var aTag = tags[i];

		if(dedupe[aTag]){
 			 var t =tags.splice(i,1);
 			 i--;
		} else {
 			 dedupe[aTag] = true;
		}
  }
  return tags;
}

大家仔细把这代码读两遍,看看能不能推断出它想干什么?

我相信大家很难一下子明白。因为,这段代码有机个反人类的地方:

首先,在循环中改变循环相关的变量 tags,因为 tags 被改变,连带循环的终止条件也变化。因此又改变了循环的自变量 i--(这个改动肯定是调试的时候发现不对,为了解决问题加上去的)。

通过这两个反人类的处理,这个十行多一点的代码成功让自己成为其烂无比的代码。这样的代码只能通过读懂(或者测试出)其要表达的逻辑,然后重写之。

另一类的代码写的足够清晰,但是不够简洁。

const ALPHABET = ['1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

function randomCode(length) {
  const code = [];
  for (let i = 0; i < length; i++) {
const rand = Math.floor(Math.random() * 33);
code.push(ALPHABET[rand]);
  }
  return code.join('');
}

这段代码的问题相信大家能准确理解。虽然这个代码当然是可以进一步简化的,但基本上已经无法做更多有意义的重构。 其实,我希望大家要考虑的是,我们真的有必要自己撰写这样的高重用代码么?这种基本的问题必然已有前人妥善解决,比如说:randomstring 这个模块。

const randomstring = require('randomstring');
const randomCode = length => randomstring.generate({
  length, capitalization: 'uppercase',
});

有的人可能对于“拿来主义”有所不耻,认为必须要自己逐行逐字敲的代码才靠谱。但是,我们再来看看这段问题代码,其实它还有2个隐患:

  • 设计不通用,缺乏可扩展性。

    上述的代码如果哪天要改成小写字母、或者大小写混合怎么办?每次需求变动都涉及不少改动。

  • 缺乏可靠与稳定性。

    成熟的代码是经过充分测试的,如果你硬要重写,代价不仅仅是编码实现,更加重要的是需要再经过一轮严密而繁琐的测试。

严谨的代码设计、组织和合理利用第三方开源资源库,是编写合格代码必不可少的基本功。

想要学习更多的编程技巧,请继续关注后续的连载文章。

由睿江云提供,想了解更多,请登陆www.eflycloud.com

© 著作权归作者所有

共有 人打赏支持
下一篇: 升级ESXI主机
ali安东尼
粉丝 3
博文 192
码字总数 173101
作品 0
广州
私信 提问
工作日志_Index

1 程序员的自我修养 如何成为一个合格的 Java程序员 程序员如何提升自已 程序员如何学会沟通技巧 思维提升:思维广度,深度,高度,远度 大牛养成指南(1):吃的草够多,你也能成为大牛如何成为...

无寄语
2016/08/18
13
0
如何让编程产能翻二番?

软件开发过程有一个很自然的比喻:建楼房,要画图纸、搭架构、砌砖头。这个比喻大体说得过去,问题是,这个“砖头”绝非普通的砖头,具有以下特性: 一、每一块都由手工制作; 二、每一块的材...

dellfox
2014/05/08
0
0
转让一些经典书籍~

那些年,我们追过的.NET书籍 工作三年买了很多书,最近准备搬家才发现真是累赘,所以想把看完的书低价出售给需要的同学们. 书籍基本都是九成新,大部分都是原版经典书籍以及一些经典的国内书籍,...

Evo
2013/09/09
1K
30
如何从一个优秀的Java程序员变成一个高薪架构师

做了4年的java程序员,一直考虑以后的发展方向。感觉不适合走管理路线的人,所以考虑继续在技术方面深入下去。 相信好多程序员都有相同的感觉,做了好多年代码民工,感觉自己每天都在重复着相...

禁区铁铍人
2017/12/09
0
0
飞龙的程序员书单 – 思想、工程、架构、职业发展

思想 编程珠玑 编程珠玑,字字珠玑。这本书并不单纯讲解算法,而是由一系列实际问题切入,引导读者理解这些问题并学会解决方法,使用现有的算法,或者程序设计技巧解决问题。本书的特色是通过...

apachecn_飞龙
2016/01/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
2
0
mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 wher......

BraveLN
今天
3
0
Spring 事务初始化源码分析

相关文章 Spring 事务使用详解 Spring AOP 创建代理的源码解析 Spring AOP 注解方式源码解析 Spring AOP 功能使用详解 Spring 的 getBean 方法源码解析 Spring bean 创建过程源码解析 Spring...

TSMYK
今天
1
0
Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构

前面几节中,都是通过java层调用到jni中,jni向下到c++层并未介绍 看下Java层一个方法在c++层 MediaPlayer后续过程 frameworks/av/media/libmedia/MediaPlayer.cpp 找一个我们之前熟悉的setDa...

天王盖地虎626
今天
3
0
【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)

1、前言   框框博客在线报时:2018-11-07 19:31:06   当前MySQL最新版本:8.0.13 (听说比5.7快2倍)   官方之前表示:MySQL 8.0 正式版 8.0.11 已发布,MySQL 8 要比 MySQL 5.7 快 2 ...

Code辉
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部