代码整洁之道读书记

有意义的命名

软件编程中命名随处可见, 如函数, 参数, 类名, 变量, 包名, 文件名等。一个好的命名能够望名知意, 方便后续的维护。

下面是一些基本的关于命名的规则:

  • 命名语意化: 有意义的命名能够替代注释

  • 避免误导性命名

    1. 命名外形上的相似
    如 数字0与字母O同时出现   变量xyzControllerForOrderOfSetting和xyzControllerForLoginSetting(需要花时间去区分)
    
    2. 语义废话,含混不清的命名
    如 同一个模块出现这样的方法或者命名(需要花时间去区分). getUserInfo/getUserData/getUser, userInfo/userData/user
    
    复制代码
  • 多使用能够读的出来的名称: 避免自造词, 多使用合乎规范的英文单词

  • 使用易搜索的名称

    1. 易搜索指的是在海量代码中快速定位到该命名
    2. 以单个字母命名的名称仅适用于短方法中的本地变量(如js中d(document),w(window))
    3. 命名的长短应该与作用域大小成对应关系
    复制代码
  • 类名

    类名与对象名应该是名词或者名词短语, 避免使用Processor, UserData等,类名不应该是动词
    复制代码
  • 方法名

    方法名应该是动词或者动词短语
    属性访问器,属性修改器,断言等应该加上get, set, is等前缀
    复制代码
  • 每个概念对应一个词, 并且一以贯之

    举例说明:
    比如你在一个类里面的同类型方法都是使用get作为前缀, 但是在另外一个类里面的方法又是使用fetch作为前缀。这就是没有保持一个概念一个词。
    
    另外就是保持你的代码风格统一性
    复制代码
  • 避免使用双关语

    避免同一个单词用于不同的目的,同一个术语用于不同的概念
    复制代码
  • 多使用大家达成统一认识的领域名称(术语)

    扫描二维码关注公众号,回复: 4613766 查看本文章
    举例说明
    比如使用visitor(访问者)而不是accounrVistor
    Queue/jobQueue
    复制代码
  • 添加有意义的语境

    大多数时候我们是没法通过命名达到自我说明, 这个时候就需要添加适当的语境来方便我们理解。
    添加语境的方式就是给命名添加前缀。
    createXxxx / addXxx / deleteXxx / updateXxx
    复制代码
  • 避免添加无意义的语境

    当短名称足够描述清楚时候, 要优于长名称
    复制代码

    如何写好函数

  • 短小

    函数应该短小,不能太长, 20行封顶
    复制代码
  • 代码块和缩进

    if语句,else语句,while语句,switch/case中子句等, 其中的代码块应该只有一行,该行也应该是一个函数调用语句。
    例如:
    if (true) {
        // 函数调用
    } else {
        // 函数调用
    }
    复制代码
  • 一个函数应该只做一件事

    当你的函数不能再被拆开一个函数时候就标示做了一件事
    复制代码
  • 一个函数一个抽象层级(抽象逻辑块)

    代码应该保持一个自顶向下的阅读顺序。
    每一个函数后面尽可能紧跟下一个抽象层级的函数
    复制代码
  • switch语句

    switch/case语句有多个子句时候,可以把switch语句置于抽象工厂中,不对外暴露,然后工厂方法中针对不同的case语句创建不同的实体
    复制代码

  • 使用描述性的名称

  • 函数参数

    1. 函数参数个数: 理想情况函数参数个数依次为0,1,2,超过两个应该避免
    2. 当函数需要三个或者超过三个以上参数时候, 推荐把一些对象封装为类
    3. 当我们需要传入个数可变的参数时候, 可以使用参数列表
    
    复制代码
  • 动词与关键词结合

  • 对于一元函数时候, 我们可以使用动词与关键词结果方式来更好表述该函数的作用。
    举例:
    writeField(name): => 修改字段name
    复制代码
  • 无副作用

    虽然我们说函数只做一件事, 但是常常会隐式的做一些其他事情,导致异常的发生, 尤其像动态语言(Python,JavaScipt), 没有类型约束, 一不小心就修改了对象类型。
    
    避免使用输出参数, 如果参数必须要修改某种状态,索性就修改所属对象的状态
    复制代码
  • 分隔指令与询问

    函数要么做什么事情,要么回答什么事情,两者不可兼得。即
    函数要么修改某对象的状态, 要么返回该对象的有关信息
    复制代码
  • 使用异常替代返回错误码

    举例:
    一个函数deletePage(page)用错误码标示执行的结果: E_OK / E_ERROR
    如果你的代码中大量采用该风格的函数, 有时候会导致大量的if嵌套。
    
    if (deletePage(page) == E_OK) {
        if (deletePerson(person) == E_OK) {
            
        } else {
            
        }
    } else {
        
    }
    
    我们应该使用异常替代返回错误码的方式,这样错误处理代码就能把代码进行分离
    
    try (
    	// 主路径代码
    ) catch () {
        // 错误处理
    }
    复制代码
  • 抽离try/catch代码块

    函数应该只做一件事, 错误处理就是一件事 
    复制代码
  • DRY原则: 别重复自己

    消除重复 => 提取代码中能复用的模块, 复用的类, 复用的方法等
    复制代码

猜你喜欢

转载自juejin.im/post/5c1ee35e5188257d99375f9a