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

本篇文章的内容来自《重构 改善既有代码的设计》一书学习笔记整理并且加上自己的浅显的思考总结!本篇介绍几个轻松处理数据的重构手法。1、自封装字段(Self Encapsulate Field)概述你直接访问一个字段,但与字段之间 的耦合关系逐渐变得笨拙。为这个字段建立取值和设值函数,并且通过函数来访问字段。【说白了就是使用get/set方法来访问字段】private int low …

大家好,又见面了,我是全栈君。

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

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

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的有多个值的,最好是定义一个枚举。

总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121045.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html5 datalist 选中option选项后的触发事件

    html5 datalist 选中option选项后的触发事件

    2021年11月8日
    44
  • 精灵图

    精灵图精灵图什么是精灵图:css精灵(CSSsprites),是一种网页图片应用处理技术。主要是指将网页中需要的零星的小图片集成到一个大的图片中应用的原因:1.减少对浏览器的请求次数,避免网页的延迟2.方便小图标的统一管理精灵图的制作:1.软件:ps2.制作方法:新建透明图层添加参考线将画布划分,将小图标放入划分好的格子中精灵图的使用:css精灵图需要配…

    2022年6月10日
    39
  • avc1 vs avc3 in fragment MP4 difference

    avc1 vs avc3 in fragment MP4 differenceAmendment2ofISO/IEC14496-15(AVCfileformat)isdefininganewstructureforfragmentedMP4called”avc3″.TheprincipaldifferencebetweenAVC1andAVC3isthelocationofthecodecinitialisationdata(e.g.SPS,PPS).InAVC1thisdataisplacedin.

    2022年10月17日
    7
  • springcloud和dubbo区别「建议收藏」

    springcloud和dubbo区别「建议收藏」最大区别SpringCloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式。这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。…

    2022年6月5日
    32
  • SwapBuffer驱动进阶(一)[通俗易懂]

    SwapBuffer驱动进阶(一)[通俗易懂]之前通过阅读swapbuffer的read的部分代码,基本上弄明白了缓存交换的原理。    那么我们怎么做到文件的透明加解密,直接使用其缓存交换的方式来实现呢,目前参考了Antinvader,有一个步骤是肯定要做的,那就是在Create的Post中,添加文件流的上下文,这样才能知道你打开的文件,是不是在read中确认是你需要处理的问题,因为在Read中的FileName是不准确的,例

    2022年5月12日
    41
  • 代码保护(一) 几款加壳工具[通俗易懂]

    代码保护(一) 几款加壳工具[通俗易懂]DRMsoftEncryptEXE(有激活成功教程版)加密模式:非绑定模式—-加密后的文件不绑定用户电脑,但用户需要一个开启密码才可以打开绑定模式—-一机一码授权,加密后的文件不同用户电脑需要不同的开启密码无密码模式—-加密后的文件无需要开启密码即可运行,仅对原始文件做加密保护一码通模式—-采用相同秘钥和产品编号加密的不同文件,在同台电脑上只需认证一次特点:可以设置加密…

    2022年6月27日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号