说说怎么写clean code
前两天参加了公司组织的一个培训,主题是“如何写出好的代码” ,刚看到这个主题,第一反应是又不知道是哪个培训机构来忽悠钱的!老大安排了,就去听听呗。
说实在的,课程内容没有什么新鲜的东西,就是讲讲如何发现代码的坏味道,如何重构函数,如何修改遗留系统的代码。这些东西从本科到研究生到实习到正式工作,也不知道看过多少听过多少了,话说本科的课程设计也和代码重构相关,私底下重构和设计模式方面的书也没少看,感觉应该没啥好培训的,不过两天的课程听完,打心眼里觉得来对了,意犹未尽!
课程结束了,感觉需要把这两天课程的内容回顾总结一下,加深一下印象。
关于代码质量。这是一个永远萦绕在程序员心头的问题,特别是在敏捷团队,code quality更是一个时常听到的词语,静态扫描,单元测试,持续集成平台上永远少不了这些东西,感觉有了这些工具,能看到一些报告,就对代码质量有交代了。其实呢,发现实际根本不是那么回事,规则流程有了,工具平台有了,代码质量并没有提高,反而,因为维护UT占了大量的时间,代码写的更随意,更不规范了。培训老师说了一句话挺对的“代码重构是个良心活”,一段代码很烂,不重构能work,重构好了,没人知道,重构出了问题,反而会引来各种抱怨,谁去干这吃力不讨好的事儿,系统中没用的老代码都不想删,何况去动正在运行着的代码呢。所以说,要想提搞代码质量,靠程序员的良心是不太行得通的,特别是交付压力很大的情况下,就是有这个良心也只能昧着良心check in了。那怎么办,要靠manager,只有manager关注这块儿,才真的能触动代码质量的提升,不求manager去review代码,manager哪怕是盯一下静态扫描工具产生的报告,稍微找负责人谈谈话,代码质量就能上去,敏捷搞得manager们只看User Story完成的情况,只看能不能持续交付产品了,选择性忽略了代码质量。当然了,程序员也不是一点责任都没有,程序员写clean code是职业素养,是一种习惯,很多时候,我们从刚开始就没有能够养成这种良好的习惯,现在要改变也很困难,所以程序员要培养编程价值观,要改变对写代码的认识,养成好的习惯。
再说说敏捷开发,这个不知道从什么时候从外企传到私企,从大企业传到初创公司改变传统软件工程的模式,我觉得真心是鸡肋,至少在中国的公司中是不能充分发挥它的价值的。敏捷开发作为一种为迎合当今快速变化的市场的开发模式,面向的是市场,而软件工程是有工程过程规律的,既然是一项工程,就要按部就班的搞,就得有规划,就设计,有实现,有验收,还要有工匠精神,对细节的打磨,一个环节也不能少,不会因为用了敏捷,就能神奇的缩短时间,历史证明,多快好省是不可能的,偷工减料,还能又多又好么!那为啥外国公司要搞敏捷呢,依我看,是因为外国公司和咱国内情况不一样,美国公司啥个情况,就拿我们公司总部,在硅谷,据B1回来的同事说那儿的工作状态:每周最多上四天班,周一下午才来,周五下午不见了,四天里怎么工作呢,上午咖啡下午茶,吃完午饭打个盹,把大部分脏活累活外包到中国印度,自己留着核心的慢慢磨,或者做做创新。这个状态下,敏捷起来确实能提高效率,因为有大把的时间可以挤出来。而国内的,本来就处在满负荷运转了,再搞敏捷,需求不断改,UT,TA各个sprint都要跟上,还有功夫去关注代码质量么?中央为什么要提中国特色,情况不一样,发展阶段不一样,生拉硬套别人的不好使。
扯远了,拉回来。
关于代码的坏味道。什么是好的代码?没人说得清楚,但我们能指出什么是坏的代码,《重构---改善既有代码的设计》这本书开始讲的就是这个,比培训课程里讲得更好更全。只要没有坏味道的代码,就是好的代码,问题是如何闻出代码中的坏味道,有一些量化的规定,比如,函数长度不能超过50行,参数不能超过7个,嵌套不能多于3层,圈复杂度不能大于10,不能出现重复的代码等。有了这些明确的标准,只要会数数,就一定能发现代码中的坏味道。当然了,数学再好也未必就能数的出坏味道,还得有节操。
关于高质量函数。到底为什么要写函数?封装变化,单一职责,隐藏细节,避免重复代码,提高可移植性等,太多理由了,以至于程序员出于本能就会说“这个地方写个函数处理一下”。当然了,本能是一个从刻意到随意的过程,想写出高质量的函数,刚开始也要刻意为之。创建函数三原则:单一抽象层次原则,单一职责原则,函数短小原则。
- 单一抽象层次原则:让一个方法中的所有操作处于相同的抽象层。比如描述业务流程的public方法,可以罗列调用几个私有的分步方法,只显示流程大体步骤。这样把程序划分成几个处于同一层次的方法,自然的产生多个包含许多小方法的程序,每个方法只包含少量代码了。
- 单一职责原则:函数应该做一件事情,做好这件事,只做这件事。这个原则更多的是针对助手函数,对于描述业务流程的顶层方法,很难做到一函数一件事情。有时候总是喜欢命名一些函数actionAndaction,其实就是懒得去抽开,当然也有为了省掉一个循环,在一个循环里做了两件事情,对于循环,看数据集大小,如果分成两个循环并不会太影响性能,抽成两个函数,代码会更清晰。
- 函数短小原则:函数越短,越不会出现嵌套过深,功能复杂等情况。
函数10个一:
- 每个变量只用于单一用途。
- 每一行代码只表达一件事。
- 一个循环只做一件事。
- 每个函数语句应该遵守单一抽象层次原则。
- 代码组织的一次只做一件事情。
- 一种变化导致的修改应该仅仅修改一处。
- 圈复杂度小于一十。
- 函数第一原则短小。
- 单一职责。
- 写代码时要有一颗谦卑的心
关于修改系统遗留的代码。这是个头疼的问题,特别是大公司的程序员,很多人刚入职就是从维护老代码开始,原代码的作者早就离职了,有文档的不多,有用的注释也不多,只能靠自己理解,而当需要改代码的时候,就犯愁了,不敢动。很多时候,程序员就会选择往老代码里塞新代码:加个判断,多写个分支,顺着原来的代码结构完成新的功能。可是这很容易把老代码变的更糟,怎么保证不要让老代码变的更糟呢,要对老代码进行隔离,可以采用新生方法,新生类,外包装方法调用老代码,外覆盖类等方式,这些在《修改代码的艺术》里讲得很详细。要时时提醒自己,拒绝软件的退化。
说说怎么写clean code的更多相关文章
- Writing Clean Code 读后感
最近花了一些时间看了这本书,书名是 <Writing Clean Code ── Microsoft Techniques for Developing Bug-free C Programs& ...
- 小课堂Week12 Clean Code Part1
小课堂Week12 Clean Code Part1 今天的主题是函数,让我们看一个函数,找一找其中的"不整洁". 我们也根据这段代码,讨论下对于整洁代码的两个重要原则. publ ...
- 《Clean Code》 代码简洁之道
作者介绍 原文作者: Robert C. Martin, Object Mentor公司总裁,面向对象设计.模式.UML.敏捷方法学和极限编程领域的资深顾问,是<敏捷软件开发:原则.模式.与实践 ...
- 《代码整洁之道》(Clean Code)- 读书笔记
一.关于Bob大叔的Clean Code <代码整洁之道>主要讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派 ...
- 聊聊clean code
clean code,顾名思义就是整洁的代码,或者说清晰.漂亮的代码,相信大多数工程师都希望自己能写出这样的代码. 也许这是个千人千面的话题,每个工程师都有自己的理解.比如我,从一个天天被骂代码写得烂 ...
- 《Clean Code》一书回顾
<Clean Code>一书从翻开至今,已经差不多两个月的时间了,尽管刨去其中的假期,算下来实在是读得有点慢.阅读期间,断断续续的做了不少笔记.之前,每每在读完了一本技术书籍之后,其中的诸 ...
- Clean Code之JavaScript代码示例
译者按: 简洁的代码可以避免写出过多的BUG. 原文: JavaScript Clean Code - Best Practices 译者: Fundebug 本文采用意译,版权归原作者所有 引文 作 ...
- 《clean code》讲述代码中的道,而不是术
Clean code 看<clean code>一书,学习高手写出的代码,简单高效的代 1.目标 Bjarne Stroustrup:优雅且高效:直截了当:减少依赖:只做好一件事 Grad ...
- 【笔记】Clean Code(持续更新)
这个暑假出来实习,第一次体会到在一个团队中开发的体验,与网上的网站看到的大为不同,以前看网上说什么程序员写了屎山代码,写了一堆模糊的注释或者说垃圾代码不写注释. 但在我的实习体验中,代码虽然看起来很多 ...
随机推荐
- BZOJ2062 : 素颜2(face2)
写个cmp然后sort就好了. cmp的话,需要快速知道两个串的lcp,于是倍增+Hash即可. #include<cstdio> #include<algorithm> ty ...
- 发送JS错误日志到服务器
JS记录错误日志/捕捉错误 //onerror提供异常信息,文件路径和发生错误代码的行数的三个参数. window.onerror = function(e,url,index){ var msg = ...
- TYVJ P1062 合并傻子 Label:环状dp
背景 从前有一堆傻子,钟某人要合并他们~但是,合并傻子是要掉RP的...... 描述 在一个园形操场的四周站着N个傻子,现要将傻子有次序地合并成一堆.规定每次只能选相邻的2个傻子合并成新的一个傻子,并 ...
- TYVJ P1013 找啊找啊找GF Label:动态规划
做题记录:2016-08-15 22:19:04 背景 MM七夕模拟赛 描述 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见.""诶,别再见啊.. ...
- javascript第四弹——变量、作用域、内存
一.变量 定义 变量是松散型的 变量是保存特定值的一个名字 变量包含两种数据类型的值:基本数据类型的值和引用数据类型的值 基本数据类型值 基本数据类型值是一个简单的数据段,在内存中占用固定的空间,保存 ...
- PHP对于Session漏洞的防范
目前,基于PHP的网站开发已经成为目前网站开发的主流,本文笔者重点从PHP网站攻击与安全防范方面进行探究,旨在减少网站漏洞,希望对大家有所帮助! 一.常见PHP网站安全漏洞 对于PHP的漏洞,目前常见 ...
- linux下六大IPC机制【转】
转自http://blog.sina.com.cn/s/blog_587c016a0100nfeq.html linux下进程间通信IPC的几种主要手段简介: 管道(Pipe)及有名管道(named ...
- poj2387 初涉最短路
前两天自学了一点点最短路..看起来很简单的样子... 就去kuangbin的专题找了最简单的一道题练手..然后被自己萌萌的三重for循环超时虐的不要不要的~ 松弛虽然会但是用的十分之不熟练... 代码 ...
- Apache Storm技术实战之3 -- TridentWordCount
欢迎转载,转载请注明出处. 介绍TridentTopology的使用,重点分析newDRPCStream和stateQuery的实现机理. 使用TridentTopology进行数据处理的时候,经常会 ...
- js 表单内容使用ajax以json格式混合提交
脚本代码 function submitForm(){ var post_data = $("#form1").getdict(); var data_dict = { ...