文章目录

  • 背景
  • 概念
  • 介绍
  • 案例
  • 目录
  • 购书
  • 送书规则


背景

最近公司正在组织 Code Review ,看看之前为了赶项目写的代码,真的是一言难尽。所以想趁同事审查我的代码之前做点“小动作”,没错,我想说的就是“代码重构”。

对于工作时间较短或者还未参加过工作的同学来说,可能对代码重构这个概念还不是很熟悉,今天随着阿Q的讲解,希望你可以对代码重构产生新的认识。

【阿Q送书第四期】好书推荐《重构的时机和方法》_学习

概念

所谓代码重构就是指对现有的代码进行修改,在不改变代码完成其功能的前提下,改善其内部结构,以提高代码的可读性、可维护性和可扩展性。重构的目标是使代码更简洁、更易于理解和修改,同时提高代码的质量和可维护性。

说人话就是对代码进行“美化”:比如将重复的代码提取为共有函数;将复杂的代码逻辑用设计模式进行应用等等。

记得阿里云数据库专家周正中说过:程序是慢慢长大的,没有哪个程序会说自己的这套代码就是它的终态;程序需要一代又一代的程序员来完成其进化,满足业务的需要。在进化过程中,重构是必不可少的工作,是跨时间线、跨空间的协作,重构方法论非常重要。

介绍

基于以上背景,我开始对自己的代码进行疯狂优化(很可能还没优化前效果好😃)。碰巧的是,我在不经意间看到了《重构的时机和方法》这本书,改书阐述的提高代码质量和工作效率方面的内容对我本次代码的重构产生了非常重要的作用。

这本书是由 Christian Clausen 编写,由郭涛翻译的。两位作者介绍如下:

【阿Q送书第四期】好书推荐《重构的时机和方法》_学习_02

【阿Q送书第四期】好书推荐《重构的时机和方法》_技能提升_03

这是一本面向程序员的代码设计晋级书籍,作者深入浅出地解析了重构是什么、什么时候要重构和如何重构。书中有大量的示例,一步步演示大师构建软件的关键历程,把成功的软件开发思维分享给所有的读者。

全书由风格不同的两部分组成。第 Ⅰ 部分为重构奠定了坚实的基础,并且针对个人学习。相比全面性,我更关注学习的容易性。这部分适用于尚未有着坚实的重构基础的人,例如学生和初级或自学的开发人员。如果你查看该书的源代码并认为“这似乎很容易改进”,那么可以直接跳过第 Ⅰ 部分。

在第 Ⅱ 部分中,作者更多地关注上下文和团队的学习。选择了自认为在现实世界中最有价值的软件开发课程。一些主题主要是理论性的,例如“与编译器协作”和“遵循代码中的结构”;还有一些主题主要是实用性的,例如“喜欢删除代码”和“让坏代码看起来很糟糕”。因此这部分的应用范围更广,即使是有经验的开发人员也应该学习这些章节。

第Ⅰ部分的章节都使用一个单一的总体示例,因此这些章节紧密地联系在一起,应该逐一阅读。但是在第 Ⅱ 部分中,除了一些相互参考,这些章节内容基本上是独立存在的。如果没有时间阅读整本书,你可以根据自己的需要选择第Ⅱ部分中最感兴趣的主题单独阅读。

案例

来个案例感受下重构之美。

重构前

function transformMap (map: Map) {
    map.setMap (new Array(rawMap.length));
    for (let y = 0; y < rawMap.length; y++) {
        map.getMap()[y] = new Array(rawMap[y] .length);
        for (let x = 0; x < rawMap[y].length; x++){
            map.getMap()[y][x]  = transformTile(rawMap[y][x]);
        }
    }
}

function updateMap(map: Map){
    for (let y = map.getMap().length - 1; y >= 0; y--)
        for (let x = 0; x < map.getMap()[y].length; x++)
            map.getMap()[y][x].update (map,x, y);
}
    
function drawMap(map: Map, g: CanvasRenderingContext2D) {
    for (let y = 0; y < map.getMap() .length; y++)
        for (let x = 0; x < map.getMap()[y].length; x++)
            map.getMap()[y][x].draw(g,x,y);
}

重构后

class Map{
    //...
    transform(){
        this.map = new Array(rawMap.length);
        for (let y = 0; y < rawMap.length; y++){
            this.map[y] = new Array(rawMap[y].length);
            for (let x = 0; x < rawMap[y].length; x++)
                this.map[y][x] = transformTile(rawMap[y][x]);
        }
    }
    
    update(){
        for (let y = this.map.length - 1; y >= 0; y--)
            for (let x = 0; x < this.map[y].length; x++)
                this.map[y][x].update(this,x,y);
    }
	draw(g: canvasRenderingContext2D) {
        for (let y= 0; y < this.map.length; y++)
            for (let x = 0; x < this.map[y].length; x++)
                this.map[y][x].draw(g, x, y);
    }    
}

目录

我给大家整理了一下该书的目录,有需要的同学可以看看

第Ⅰ部分 通过重构电脑游戏来学习

第1章 重构

第2章 重构的内部原理

第3章 拆分长函数

第4章 让类型代码发挥作用

第5章 将类似的代码融合在一起

第6章 保护数据

第Ⅱ部分 学以致用

第7章 与编译器协作

第8章 远离注释

第9章 喜欢删除代码

第10章 永远不要害怕添加代码

第11章 遵循代码中的结构

第12章 避免优化和通用性

购书

一本好书如一位良师,一本好书如一位益友,购书链接也给大家带来了,请收下我的膝盖


【阿Q送书第四期】好书推荐《重构的时机和方法》_原力计划_04