【《重构 改善既有代码的设计》学习笔记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)
blank

相关推荐

  • Beta 分布_f分布与beta分布

    Beta 分布_f分布与beta分布相信大家学过统计学的都对正态分布二项分布均匀分布等等很熟悉了,但是却鲜少有人去介绍beta分布的。用一句话来说,beta分布可以看作一个概率的概率分布,当你不知道一个东西的具体概率是多少时,它可以给出了所有概率出现的可能性大小。举一个简单的例子,熟悉棒球运动的都知道有一个指标就是棒球击球率(b

    2022年10月21日
  • 全套电商ERP源代码出售,电商ERP管理系统、电商仓储管理系统、电商分销管理系统[通俗易懂]

    全套电商ERP源代码出售,电商ERP管理系统、电商仓储管理系统、电商分销管理系统[通俗易懂]技术架构:后端C#.net4.5ORMWEBAPI分布式REDIS,前端:VUEAntDesignAggrid(前后端完全分离)1,产品定位:电商ERP管理系统、电商仓储管理系统、电商分销管理系统2,对接了淘宝天猫、京东、拼多多等主流电商平台50+3,多租户4,分布式5,单客户日均100万数据处理能力6,完整导入导出方案7,前端界面自动生成(表格、搜索条件、编辑字段)8,完整开放平台9,微信小程序10,高度可定制的打印方案11,核心功能模块:订单管

  • journalctl 日志查看方法

    journalctl 日志查看方法1概述日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从message这个文件里读取信息。Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.confjournalctl功能强大,用法非常多。本文将介绍journalctl的相关使用方法。2journalctl使用方法.查看所有日志默认情况下,只保存本…

  • PHP加密技术 附源码

    PHP加密技术 附源码

  • c中getline的用法_enum用法

    c中getline的用法_enum用法getline()用法getline是C++标准库函数;它有两种形式,一种是头文件<istream>中输入流成员函数;一种在头文件<string>中普通函数;它遇到以下情况发生会导致生成的本字符串结束:(1)到文件结束,(2)遇到函数的定界符,(3)输入达到最大限度。输入流成员函数getline()函数语法结构:在<istream>中的g…

    2022年10月26日
  • VS2010过期密钥「建议收藏」

    VS2010过期密钥「建议收藏」VS2010 旗舰版可用Key:YCFHQ-9DWCY-DKV88-T2TMH-G7BHP

发表回复

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

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