zoukankan      html  css  js  c++  java
  • 高质量的函数 —— 《clean code》读后感

        函数应该是编程中最小的组成元素,函数的质量直接影响可维护性和代码开发难度。高质量的函数应该遵循以下原则:

    1)函数的第一规则是要短小,第二规则是还要更短小。函数越小,越有利于一眼看出函数的作用,封顶20行,越短越好。函数内部如果有if、else、while等语句,其中的代码应该只有一行,该行应该是一个函数调用(将处理逻辑别放一个函数,而不要放在直接放在if等语句里),函数嵌套、缩进不该多于一层或两层。

    2)函数应该只做一件事。不在在函数里处理太多的逻辑,每个函数只负责做一件事。

    3)如何让函数只负责做一件事呢?如此一来,不是需要定义大量的函数吗?没错,的确是需要大量的函数。所以我们应该对函数建立起抽象层级。比如说render(abc.html)是一个比较高的层级,可能和应用层最接近,而setTitleValue("h1","hello world")就属于一个较低的层级。建立起这样的层级概念,方便在阅读代码的时候,自顶向下阅读。在读高层级的代码的时候,思绪不会纠结于底层实现细节,能把握主要的逻辑。

    4)switch、if之类的语句应该保持在一个较低的抽象层级。因为switch天生就是做N件事的,我们希望一个函数只做一件事,所以我们需将switch放到足够低的层级,将它的影响降到最低。

    5)使用描述性的名称。别怕给函数起太长的名字,函数的名字是否清晰实在太重要了。好的函数名能让你更快理解函数的作用,(在看rails的时候,我的确感觉到了长命名对可读性带来的好处,大师们果然英雄所见略同,不拘于小节,实用为王)。函数越短小,功能越集中,越便地取个好名字。函数只一件事,为函数取名也带来了帮助。好的命名,可以不需要注释帮忙就可以很好地理解。

    6)函数参数应该越少越好。最理想的参数数量是零个,其次是一个,再次是二,应尽量避免三个或三个以上参数。参数不易对付,参数越多,函数要做的功能可能就越多,我们在阅读代码的时候也需要注意的环境也就越多。与其用多个参数,不如把函数分解成多个函数。

    drag()和drag(true)        不如       dragWithChild()和dragWithoutChild()

    7)动词和关键字。 给函数取个好名字能较好地解释函数的意图,除了动词外,我们还可以进一步添加关键字进来。

    write(name) 是个很好的名字,我们知道要write一个name出来,不管name是什么,都要被write出来。

    writeField(name) 是个更好的名字,我们不但知道要write一个name出来,还知道name是一个field。

    assertEqual(expected,actual) 是个好名字。

    assertExpectedEqualsActual(expected,actual) 是个更好的名字。

    8) 无副作用。每个函数只能做一件事,这件事必须要在命名上表达出来。如果在函数里做了别的事情,就给函数带来了副作用,在命名上没有反映出来,所以在调用函数时经常会引入预期外的作用。特别是副作用如果还有时序性的耦合就更糟了。 如果无法避免不了调用其它功能,那就一定要在命名上说明清楚,比如:

    不好的:

    function checkPassWord(){

         xxxx

         Session.initialize();           // 副作用

    }

    好的:

    function checkPassWordAndInitializeSession(){

         xxxx

         Session.initialize();

    }

    虽然这仍然违反了“只做一件事”的规则。

    9) 分隔指令与询问。 函数名应该区别指令和询问,以提高可读性。

    不好的:

    if(set("username","unclebob"))

    好的:

    if(attributeExists("username")){

         setAttribute("username","unclebob");

    }

    10) 别重复自己。相同的代码抽离成独立的函数,不要在多处重复自已。

    11)如何写出这样的函数呢? 写代码和写别的东西很像,在写论文或文章的时候,我们会一边写,一想改,最后可能会再整个梳理一遍。同样的,写代码一开始也可能会写得冗长而复杂,有太多缩进和嵌套循环,有过长的参数列表,名称是随意取的,也会有重复代码。所以我们需要“重构”,这也是xp极限编程倡导的一个步骤,以此保证高质量的输入,防止代码腐化。

    “我并不从一开始就按照规则写函数。我想没人做得到。”

  • 相关阅读:
    win10下安装虚拟环境
    apache的rewrite重写、日志切割、防盗链
    apache的虚拟主机配置
    springboot 框架下对象使用时new()和注解注入的区别
    当new()发生时,代码初始化顺序
    爬虫----设置代理HttpClientDownloader
    爬虫:HttpClient Jsoup 爬虫学习
    爬虫webmagic入门学习
    爬虫使用的simhash网页去重算法-----项目改造使用-----java.lang.IllegalStateException: TokenStream contract violation: reset()/close()问题
    JAVA 基本类型与其封装类及两者与String的转换
  • 原文地址:https://www.cnblogs.com/cly84920/p/4426813.html
Copyright © 2011-2022 走看看