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

睿普_云博士

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

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

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

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

我给出的答案是:会的。

    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

转载于:https://my.oschina.net/u/3363053/blog/1525560

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值