【《重构 改善既有代码的设计》学习笔记8】重新组织数据

本篇文章的内容来自《重构 改善既有代码的设计》一书学习笔记整理并且加上自己的浅显的思考总结!

本篇介绍几个轻松处理数据的重构手法。

1、自封装字段(Self Encapsulate Field)

概述

你直接访问一个字段,但与字段之间 的耦合关系逐渐变得笨拙。为这个字段建立取值和设值函数,并且通过函数来访问字段。

【说白了就是使用get/set方法来访问字段】

private int low , high;
boolean includes(int arg){
    return arg >= low && arg <= high;
}
//改为
private int low , high;
boolean includes(int arg){
    return arg >= getLow() && arg <= getHigh();// 这里使用行数访问字段
}

int getLow(){return low;}
int getHigh(){return high;}


动机

在“字段访问方式”上,有两种截然不同的观点:

  • 第一种:在该变量的所在的类中,你可以自由访问它,直接访问。
  • 第二种:即使在这个类中你也应该使用访问函数间接访问,间接访问。

两种访问各自的好处:

  • 第一种:直接访问,代码比较容易阅读,不需要停下来说:这是一个取值函数。
  • 第二种:间接访问,子类可以通过覆写一个函数而改变获取数据的途径;还支持更加灵活的数据管理方式,例如延迟初始化(意思是:只有在需要用到某值时,才对它初始化)。

【我接触过的项目基本都是使用第一种方式】

做法

比较简单,就是为字段建立取值和设值函数,然后检查引用点。

此重构手法了解即可,看项目团队使用情况而定使用哪一种方式,就用那一种了

2、封装字段(Encapsulate Field)

这个也是一个重构手法,请了解!

你的类中有一个public字段,将它申明为private ,并提供访问函数(对应的get和set)。

【说白了就是我们长使用定义一个私有字段,生成get/set 方法】

**第二个重构手法完成后就是可以看作是第一个重构手法了。**第一个是本身就是私有字段,加了一个get方法而已。

上面这两个重构手法只是拿出来了解一下,想说明的是有一些东西是因为站在巨人的肩膀上,才让我们觉得习以为常!

3、以对象取代数组

概述

你又个数组,其中的各个元素各自代表不同的东西。以对象取代数组,对于数组中的每个元素,以一个元素来表示。

动机

**数组是一种常见的用以组织数据的结构,它们应该用于“以某种顺序容纳一组相似对象”。**有时候会发现一个数组容纳了多种不同的对象。如人们很难记住数组的第一个是人名 这样的约定。

做法

新建一个类,定义和数组中每个元素类型相当的字段。 最后去掉该数组。

范例

用实际中遇到的一块代码,修改成伪代码当作范例吧。如下:

private void delFtpFile(String analyUrl){

    String[] ftpInfos = new String[5];
    ftpInfos[0] = "username";
    ftpInfos[1] = "password";
    ftpInfos[2]= "server";
    //... 

}
// ---------修改后--------------

class Ftp{

    private String server;
    private int portNum = 21;
    private String username;
    private String password;
    //省略get/set方法
}
private void delFtpFile(String analyUrl){

    Ftp ftp = new Ftp();
    ftp.setUsername("username");
    ftp.setPassword("password");
    ftp.setServer("server");
    //... 
}

4、以字段常量去掉魔法数(Replace Magic Mumber with Symbolic Constant)

概述

创建一个常量,根据其意义为它命名,将字面数值替换为这个常量。

动机

魔法数 是历史最悠久的不良现象。 根据名称 魔法二字就可以知道,这是有魔力的,说明这个魔法数有着特殊的含义,却又不能明确表现这种意义。

【看一张代码图,你看一下魔法数 多魔法】

魔法数字

只有写代码的人知道这个数字是什么意思,当我看到这段代码的时候,我心里一万个 草泥马 奔腾而过!

做法

声明一耳光常量,令其值为原本的魔法数值,然后找到这个魔法数的所有引用点,替换!

这个是重构的手法,更是能反应写程序这个人的水平。阿里巴巴Java开发手册中也明确定义:

常量定义-强制

【不管怎么样,请一定记住这一点。不使用魔法值!如果有时间还请多多看看编码规范!】

我见过使用魔法值比上面截图那个例子还夸张的,一个程序中有1、2、3、4、5、6等等魔法值,代表不同的含义,对应数据库中的type。然后数据库中没有说明type的取值,代码中也没有,只能是看业务逻辑去理解。在这里在说明一下,如果有类似type的有多个值的,最好是定义一个枚举。

总结

本篇 看起来比较简单,主要掌握后面两个重构手法,希望能在后面的编码中不要写出类似的代码,并且发现相中中有这个的代码可以进行重构或者团队中伙伴写出这样的代码可以适当的指出,让代码不断朝着好的方向发展。也希望尽量不要使用重构技术。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页