代码整洁之道读书记

栏目: 后端 · 发布时间: 5年前

内容简介:软件编程中命名随处可见, 如函数, 参数, 类名, 变量, 包名, 文件名等。一个好的命名能够望名知意, 方便后续的维护。下面是一些基本的关于命名的规则:

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

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

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

  • 避免误导性命名

    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作为前缀。这就是没有保持一个概念一个词。
    
    另外就是保持你的代码风格统一性
    复制代码
  • 避免使用双关语

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

    举例说明
    比如使用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原则: 别重复自己

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning Google Maps API 3

Beginning Google Maps API 3

Gabriel Svennerberg / Apress / 2010-07-27 / $39.99

This book is about the next generation of the Google Maps API. It will provide the reader with the skills and knowledge necessary to incorporate Google Maps v3 on web pages in both desktop and mobile ......一起来看看 《Beginning Google Maps API 3》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码