前两天参加了公司组织的一个培训,主题是“如何写出好的代码” ,刚看到这个主题,第一反应是又不知道是哪个培训机构来忽悠钱的!老大安排了,就去听听呗。

  说实在的,课程内容没有什么新鲜的东西,就是讲讲如何发现代码的坏味道,如何重构函数,如何修改遗留系统的代码。这些东西从本科到研究生到实习到正式工作,也不知道看过多少听过多少了,话说本科的课程设计也和代码重构相关,私底下重构和设计模式方面的书也没少看,感觉应该没啥好培训的,不过两天的课程听完,打心眼里觉得来对了,意犹未尽!

  课程结束了,感觉需要把这两天课程的内容回顾总结一下,加深一下印象。

  关于代码质量。这是一个永远萦绕在程序员心头的问题,特别是在敏捷团队,code quality更是一个时常听到的词语,静态扫描,单元测试,持续集成平台上永远少不了这些东西,感觉有了这些工具,能看到一些报告,就对代码质量有交代了。其实呢,发现实际根本不是那么回事,规则流程有了,工具平台有了,代码质量并没有提高,反而,因为维护UT占了大量的时间,代码写的更随意,更不规范了。培训老师说了一句话挺对的“代码重构是个良心活”,一段代码很烂,不重构能work,重构好了,没人知道,重构出了问题,反而会引来各种抱怨,谁去干这吃力不讨好的事儿,系统中没用的老代码都不想删,何况去动正在运行着的代码呢。所以说,要想提搞代码质量,靠程序员的良心是不太行得通的,特别是交付压力很大的情况下,就是有这个良心也只能昧着良心check in了。那怎么办,要靠manager,只有manager关注这块儿,才真的能触动代码质量的提升,不求manager去review代码,manager哪怕是盯一下静态扫描工具产生的报告,稍微找负责人谈谈话,代码质量就能上去,敏捷搞得manager们只看User Story完成的情况,只看能不能持续交付产品了,选择性忽略了代码质量。当然了,程序员也不是一点责任都没有,程序员写clean code是职业素养,是一种习惯,很多时候,我们从刚开始就没有能够养成这种良好的习惯,现在要改变也很困难,所以程序员要培养编程价值观,要改变对写代码的认识,养成好的习惯。

  再说说敏捷开发,这个不知道从什么时候从外企传到私企,从大企业传到初创公司改变传统软件工程的模式,我觉得真心是鸡肋,至少在中国的公司中是不能充分发挥它的价值的。敏捷开发作为一种为迎合当今快速变化的市场的开发模式,面向的是市场,而软件工程是有工程过程规律的,既然是一项工程,就要按部就班的搞,就得有规划,就设计,有实现,有验收,还要有工匠精神,对细节的打磨,一个环节也不能少,不会因为用了敏捷,就能神奇的缩短时间,历史证明,多快好省是不可能的,偷工减料,还能又多又好么!那为啥外国公司要搞敏捷呢,依我看,是因为外国公司和咱国内情况不一样,美国公司啥个情况,就拿我们公司总部,在硅谷,据B1回来的同事说那儿的工作状态:每周最多上四天班,周一下午才来,周五下午不见了,四天里怎么工作呢,上午咖啡下午茶,吃完午饭打个盹,把大部分脏活累活外包到中国印度,自己留着核心的慢慢磨,或者做做创新。这个状态下,敏捷起来确实能提高效率,因为有大把的时间可以挤出来。而国内的,本来就处在满负荷运转了,再搞敏捷,需求不断改,UT,TA各个sprint都要跟上,还有功夫去关注代码质量么?中央为什么要提中国特色,情况不一样,发展阶段不一样,生拉硬套别人的不好使。

  扯远了,拉回来。

  关于代码的坏味道。什么是好的代码?没人说得清楚,但我们能指出什么是坏的代码,《重构---改善既有代码的设计》这本书开始讲的就是这个,比培训课程里讲得更好更全。只要没有坏味道的代码,就是好的代码,问题是如何闻出代码中的坏味道,有一些量化的规定,比如,函数长度不能超过50行,参数不能超过7个,嵌套不能多于3层,圈复杂度不能大于10,不能出现重复的代码等。有了这些明确的标准,只要会数数,就一定能发现代码中的坏味道。当然了,数学再好也未必就能数的出坏味道,还得有节操。

  关于高质量函数。到底为什么要写函数?封装变化,单一职责,隐藏细节,避免重复代码,提高可移植性等,太多理由了,以至于程序员出于本能就会说“这个地方写个函数处理一下”。当然了,本能是一个从刻意到随意的过程,想写出高质量的函数,刚开始也要刻意为之。创建函数三原则:单一抽象层次原则,单一职责原则,函数短小原则。

  1. 单一抽象层次原则:让一个方法中的所有操作处于相同的抽象层。比如描述业务流程的public方法,可以罗列调用几个私有的分步方法,只显示流程大体步骤。这样把程序划分成几个处于同一层次的方法,自然的产生多个包含许多小方法的程序,每个方法只包含少量代码了。
  2. 单一职责原则:函数应该做一件事情,做好这件事,只做这件事。这个原则更多的是针对助手函数,对于描述业务流程的顶层方法,很难做到一函数一件事情。有时候总是喜欢命名一些函数actionAndaction,其实就是懒得去抽开,当然也有为了省掉一个循环,在一个循环里做了两件事情,对于循环,看数据集大小,如果分成两个循环并不会太影响性能,抽成两个函数,代码会更清晰。
  3. 函数短小原则:函数越短,越不会出现嵌套过深,功能复杂等情况。

函数10个一:

  1. 每个变量只用于单一用途。
  2. 每一行代码只表达一件事。
  3. 一个循环只做一件事。
  4. 每个函数语句应该遵守单一抽象层次原则。
  5. 代码组织的一次只做一件事情。
  6. 一种变化导致的修改应该仅仅修改一处。
  7. 圈复杂度小于一十。
  8. 函数第一原则短小。
  9. 单一职责。
  10. 写代码时要有一颗谦卑的心

  关于修改系统遗留的代码。这是个头疼的问题,特别是大公司的程序员,很多人刚入职就是从维护老代码开始,原代码的作者早就离职了,有文档的不多,有用的注释也不多,只能靠自己理解,而当需要改代码的时候,就犯愁了,不敢动。很多时候,程序员就会选择往老代码里塞新代码:加个判断,多写个分支,顺着原来的代码结构完成新的功能。可是这很容易把老代码变的更糟,怎么保证不要让老代码变的更糟呢,要对老代码进行隔离,可以采用新生方法,新生类,外包装方法调用老代码,外覆盖类等方式,这些在《修改代码的艺术》里讲得很详细。要时时提醒自己,拒绝软件的退化。

说说怎么写clean code的更多相关文章

  1. Writing Clean Code 读后感

    最近花了一些时间看了这本书,书名是 <Writing Clean Code ── Microsoft Techniques for Developing Bug-free C Programs& ...

  2. 小课堂Week12 Clean Code Part1

    小课堂Week12 Clean Code Part1 今天的主题是函数,让我们看一个函数,找一找其中的"不整洁". 我们也根据这段代码,讨论下对于整洁代码的两个重要原则. publ ...

  3. 《Clean Code》 代码简洁之道

    作者介绍 原文作者: Robert C. Martin, Object Mentor公司总裁,面向对象设计.模式.UML.敏捷方法学和极限编程领域的资深顾问,是<敏捷软件开发:原则.模式.与实践 ...

  4. 《代码整洁之道》(Clean Code)- 读书笔记

    一.关于Bob大叔的Clean Code <代码整洁之道>主要讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派 ...

  5. 聊聊clean code

    clean code,顾名思义就是整洁的代码,或者说清晰.漂亮的代码,相信大多数工程师都希望自己能写出这样的代码. 也许这是个千人千面的话题,每个工程师都有自己的理解.比如我,从一个天天被骂代码写得烂 ...

  6. 《Clean Code》一书回顾

    <Clean Code>一书从翻开至今,已经差不多两个月的时间了,尽管刨去其中的假期,算下来实在是读得有点慢.阅读期间,断断续续的做了不少笔记.之前,每每在读完了一本技术书籍之后,其中的诸 ...

  7. Clean Code之JavaScript代码示例

    译者按: 简洁的代码可以避免写出过多的BUG. 原文: JavaScript Clean Code - Best Practices 译者: Fundebug 本文采用意译,版权归原作者所有 引文 作 ...

  8. 《clean code》讲述代码中的道,而不是术

    Clean code 看<clean code>一书,学习高手写出的代码,简单高效的代 1.目标 Bjarne Stroustrup:优雅且高效:直截了当:减少依赖:只做好一件事 Grad ...

  9. 【笔记】Clean Code(持续更新)

    这个暑假出来实习,第一次体会到在一个团队中开发的体验,与网上的网站看到的大为不同,以前看网上说什么程序员写了屎山代码,写了一堆模糊的注释或者说垃圾代码不写注释. 但在我的实习体验中,代码虽然看起来很多 ...

随机推荐

  1. GridView点击排序

    快速预览:GridView无代码分页排序GridView选中,编辑,取消,删除GridView正反双向排序GridView和下拉菜单DropDownList结合GridView和CheckBox结合鼠 ...

  2. 打包apk

    apk 配置环境变量 打开"终端",输入"pico .bash_profile"命令 export ANDROID_SDK_ROOT=/Users/sun/Do ...

  3. 使用CSS修改HTML5 input placeholder颜色

    HTML <input type="text" placeholder="Value" /> 有三种实现方式:伪元素(pseudo-elements ...

  4. java第一节课

    1.安装 2.编写java程序 首先,新建一个文本文档:把后缀改成.java,然后起一个文件名,要是英文的,如:Hello. 然后,编辑,代码如下: class Hello { public stat ...

  5. 浅谈Java中的Set、List、Map的区别

    http://developer.51cto.com/art/201309/410205_all.htm

  6. HTML&CSS----练习隐藏导航栏(三级导航)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. java抛出异常是怎么回事?

    一.Java异常的基础知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如 ...

  8. 【新产品发布】【iCore2 ARM / FPGA 双核心板】

    iCore2是一款包含ARM / FPGA两大利器的双核心板.ARM方面,采用意法半导体高性能的32位Cortex-M3内核STM32F103VE微处理器,主频达72MHz,并包含丰富外设接口.FPG ...

  9. iOS textFiled 在storyBoard中的使用

    step 1. 在UITableViewCotroller的xib中设置一个静态表格,在Utilities里选择属性检查器(第四个啦)设置属性,content : static cells. styl ...

  10. 如何设置jquery的ajax方法为同步

    jax请求默认的都是异步的如果想同步 async设置为false就可以(默认是true) var html = $.ajax({  url: "some.php",  async: ...