【《重构 改善既有代码的设计》学习笔记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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分子模拟软件amber_【免费】指南针模拟计算课堂第五期:邂逅分子模拟「建议收藏」

    分子模拟软件amber_【免费】指南针模拟计算课堂第五期:邂逅分子模拟「建议收藏」不知不觉,在大家的陪伴和参与下,科学指南针的免费模拟计算线上课堂,将在本周六(12.7号)来到最后一期啦!一前四期的内容,我们分别讲了计算化学的整体情况、分类的量子化学和第一性原理的基本知识普及和操作演示。错过了前四期的小伙伴,也不要失望,每期课程都有视频,文章末尾有获取前四期视频的方式,欢迎领取。二第五期的课程,我们将带大家再了解下分子模拟的相关内容。本期课程包括分子动力学和力场的一些…

    2022年5月26日
    46
  • Opengles2.0入门「建议收藏」

    Opengles2.0入门「建议收藏」一二三四Opengles2.0渲染管线简单画图步骤着色器语言简单介绍镜像技术一OpenGLES2.0渲染管线1.基本处理初始化3D空间中物体的顶点坐标,顶点对应的颜色,顶点的纹

    2022年7月1日
    27
  • 列表中字符串按照某种规则排序的方法(python)

    列表中字符串按照某种规则排序的方法(python)

    2021年11月19日
    59
  • 安卓版本命名规则_什么是版本号

    安卓版本命名规则_什么是版本号手机软件完全的版本号定义规则:分三项:..,如1.0.0。修改规则:主版本号:功能模块有大的变动,比如增加多个模块或者整体架构发生变化。次版本号:和主版本相对而言,次版本号的升级对应的只是局部的变动。但该局部的变动造成了程序和以前版本不能兼容,或者对该程序以前的协作关系产生了破坏,或者是功能上有大的改进或增强。修订版本号:局部的变动,主要是局部函数的功能改进,或者bug的修正,或者功能的扩充。w…

    2025年10月24日
    2
  • beforeEach

    beforeEach首先store就是一个存放在全局的状态我这里的store里面存储的是登陆的信息跟状态beforeEach接收的参数是一个回调函数函数里面的参数有to,from,next每次路由跳转都会进来这个函数例如我从A->B那么这里to就是Bfrom就是Afrom->to这里的判断就是如果是登录的,你前往的页面是登录页,则给你跳回Home页(因为…

    2022年6月15日
    48
  • GridView使用RenderControl取得HTML的问题[通俗易懂]

    GridView使用RenderControl取得HTML的问题[通俗易懂]
    如果想在CodeFile中取得GridView结果的HTML内容,首先会遇到这样的错误讯息:
     型别’GridView’的控制项’GridView1’必须置于有runat=server的表单标记之中。
    这个问题,可以在您的CodeFile中加入以下这段来解决Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)      ‘处理’GridView’的控制项’GridView’必须置

    2022年7月20日
    13

发表回复

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

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