【《重构 改善既有代码的设计》学习笔记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的有多个值的,最好是定义一个枚举。

总结

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 简单的制作一个钓鱼网页游戏_简单网页制作代码

    简单的制作一个钓鱼网页游戏_简单网页制作代码网络钓鱼,一个价值很高的词语!如果你曾读过我的一篇文章《价值30亿美元的资料被窃取,网络钓鱼到底有多可怕!》就会知道,网络钓鱼到底有多”值钱”!如果对网络钓鱼这个词进行解释的话,简而言之,其就是一种黑客手段,或者是一种通过假装自己是受信任的实体来欺骗他人来获取凭据(账号、密码等信息)的方法。讲白话,都能听懂的就是去仿作一个和正规网站一样的登录页面,欺骗用户进行输入从而达到获取信息的目的!…

  • 安装SQLServer2008失败「建议收藏」

    安装SQLServer2008失败「建议收藏」由于操作系统不同(64位与32位)和可能安装的环境不一样再或者在安装SQL2008的时候已经安装SQLServer相关其他版本,因此可能会遇到问题。  问题1:安装sqlserver2008R2,安装过程中提示错误:此计算机上安装了MicrosoftVisualStudio2008的早期版本。请在安装SQLServer2008前将Microsoft…

  • visual studio发生了未处理的异常_灾难性故障0x8000ffff

    visual studio发生了未处理的异常_灾难性故障0x8000ffff故障说明:使用vs2010时,由于文件创建MFC类时,移除文件后重新创建正确的基类,覆盖之前创建的文件造成,在“解决方案资源管理器”点击“cpp”文件弹出该提示。解决方法:在“解决方案资源管理器”,重命名cpp文件,双击打开后,改回原名即可。

  • Java 读写文件工具类

    Java 读写文件工具类今天简单写了一下读写文件用的工具类,方便后面开发或者测试时直接使用。importlombok.Cleanup;importjava.io.*;importjava.util.ArrayList;importjava.util.List;publicclassFileUtils{//逐行读取文件内容返回内容列表publicstaticList<String>readLine(Stringpath){List<Str

  • AutoSize属性问题探索

    AutoSize属性问题探索AutoSize属性问题探索如有错误,欢迎指出Google在Android8.0(APIlevel26)中,为TextView加入了一个动态属性AutoSize。在布局文件中,直接设置autoSizeTextType属性为uniform即可。这样,文本内容便会忽略android:textSize属性,从水平和垂直两个方向上缩放文本的内容。android:autoSizeTextType=”uniform”android:autoSizeMaxT

  • 什么是机器学习?

    什么是机器学习?1.引言为了解决计算机上的问题,我们需要一个算法。算法是应该执行以将输入变换到输出的指令序列。例如,可以设计用于排序的算法。输入是一组数字,输出是它们的有序列表。对于相同的任务,可以有各种算法,并且

发表回复

您的电子邮箱地址不会被公开。

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