关于如何提取代码成为函数,自己浅薄的一些看法

From:技术宅,fat-man

之前很纠结抽取函数这档子事情,发现自己只要一认真,就会写一堆小函数出来,其实在小函数里跳来跳去的读代码也未必好,抽取函数应该有这么几个原则:复用性,扩展性,层次性,唯一性,清晰性,重要程度就是我列出的顺序,最不重要的就是清晰性,因为过度追求清晰性最终会丧失清晰性

复用性,就是多个地方存在相同代码,提取出来作为函数存在,这是最理直气壮的事,写出来也不需要怀疑自己这么做是对的吗?能复用就是最大的理由。大师们总是说DRY,不是吗

扩展性, 这是第二大理由,当一段代码被抽取出来成为函数,这个函数就成为了一个接口,隐藏了具体实现,因此当实现变化时,只会影响局部,接口变化了?这就没救了,所以还是需要一些预见性,估计会有几个不同的实现,而这些实现不会动摇接口才这么做

层次性,临时加的,代码整洁之道里提了一下这个,举例说,一个用户登录函数,输入用户名和密码,判断有无该用户,有就登陆,没有就返回错误,那么给密码计算MD5,连接数据库查询这些操作算底层逻辑,判断有没有,设置错误或者登陆这些操作才是业务逻辑,那么一个函数里的代码不应该混杂了不同逻辑层的代码,底层逻辑应该以函数的形式给上层逻辑使用,基本上认同,但是感觉层次不宜太多,逻辑层太多也会搞出一堆小函数

唯一性,也是临时加的,早上在地铁上看《可读代码的艺术》想起来的,也就是说一个函数每次只做一件事,有个现实的例子,老大还在的时候帮我写了权限系统的基本API,相当于搭了架子,我去填写实现,那么老大的代码就很符合这个唯一性,代码里每一个处理流程都需要根据某个条件写一个if语句,与其这样,不如分拆成两个流程,每个流程写一个函数

清晰性,最后是这个,重要性靠后的理由上面说过了,现在只说何时为了清晰性提取出代码成为小函数是合算的,第一函数实在太大,几百行甚至上千行代码的函数,翻了几屏也看不完整的,拆了肯定合适,还有就是超级复杂的表达式,语句,给它们起个反应它们在干啥的名字也很棒


 其实没写完,现在继续:

当复用性,扩展性都不太具备的时候,清晰性,函数大小也还能忍受,那还是忍了吧orz,不过我觉得函数最大还是不超过一屏为好,超过一屏就要依靠记忆力了,我记忆力不算太好。。。

还有如果遵循复用性,那么程序写出来应该不会很大,至少代码的增长会慢一些,并且好的重构总是能砍掉一些代码,做的事情没变化或者更多更好,代码量却变的更少了

层次性这事,我吃不准一个好的架构是不是能帮我解决掉这些问题,换句话说,好的架构下我不需要操这个心,恩,继续观察,厚积而薄发,加油


新的老大曾经开过学习性的会议批判过我的烂代码,--!不过他有个观点我现在很认同,就是:代码可以不需要立即拆出去,可以保留成大函数,但是函数内的代码应该是一块一块的,块之间的联系要尽量少,这样当发现某块代码可以复用就可以很容易的拆出去成为小函数,这个给了我很大的启发,感觉写代码和武术一样,应该留有余地,不能一拳把力使足了,而是随时蕴含后手,一旦发现特殊情况可以及时变招或者发力,嗯,用九阴真经的经文,结束这篇随笔(不知道是否扯远?):天之道,损有余而补不足,是故虚胜实,不足胜有余,柔弱胜刚强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值