重构数据-Replace Array with Object以对象取代数组五
创始人
2025-05-30 11:45:46
0

重构数据-Replace Array with Object以对象取代数组五

1.以对象取代数组

1.1.使用场景

数组(array)是一种常见的用以组织数据的结构体。不过,它们应该只用于「以某种顺序容纳一组相似对象」。有时候你会发现,一个数组容纳了数种不同对象,这会给array用户带来麻烦,因为他们很难记住像「数组的第一个元素是人名」这样的约定。对象就不同了,你可以运用值域名称和函数名称来传达这样的信息,因此你无需死记它,也无需倚赖注释。而且如果使用对象,你还可以将信息封装起来,并使用Move Method 为它加上相关行为。

1.2.如何做

  • 新建一个类表示数组所拥有的信息,并在其中以一个public字段保存原先的数组。
  • 修改数组的所有用户,让它们改用新类的实例。
  • 编译,测试。
  • 逐一为数组元素添加取值/设值函数。根据元素的用途,为这些访问函数命名。修改客户端代码,让它们通过访问函数取用数组内的元素。每次修改后,编译并测试。
  • 当所有对数组的直接访问都转而调用访问函数后,将新类中保存该数组的字段声明为private。
  • 编译。
  • 对于数组内的每一个元素,在新类中创建一个类型相当的字段。修改该元素的访问函数,令它改用上述的新建字段。
  • 每修改一个元素,编译并测试。
  • 数组的所有元素都有了相应字段之后,删除该数组。

1.3.示例

我们的范例从一个数组开始,其中有3个元素,分别保存一支球队的名称、获胜场次和失利场次。这个数组的声明可能像这样:

 String[] row = new String[3];

客户端代码可能像这样

row [0] = "Liverpool";
row [1] = "15";
String name = row[0];
int wins = Integer.parseInt(row[1]);

为了将数组变成对象,我首先建立一个对应的class:

 class Performance {}

然后为它声明一个public值域,用以保存原先数组。(我知道public值域十恶不赦,请放心,稍后我便让它改邪归正。)

public String[] _data = new String[3];

现在,我要找到创建和访问数组的地方。在创建地点,我将它替换为下列代码

  Performance row = new Performance();

对于数组使用地点,我将它替换为以下代码

row._data [0] = "Liverpool";
row._data  [1] = "15";
String name = row._data[0];
int wins = Integer.parseInt(row._data[1]);

然后我要逐一为数组元素加上有意义的取值/设值函数(getter/setter)。首先从「球队名称」开始

 class Performance...public String getName() {return _data[0];}public void setName(String arg) {_data[0] = arg;}

然后修改row对象的用户,让他们改用「取值丨设值函数」来访问球队名称:

   row.setName("Liverpool");row._data  [1] = "15";String name = row.getName();int wins = Integer.parseInt(row._data[1]);

第二个元素也如法炮制。为了简单起见,我还可以把数据型别的转换也封装起来:

 class Performance...public int getWins() {return Integer.parseInt(_data[1]);}public void setWins(String arg) {_data[1] = arg;}....client code...row.setName("Liverpool");row.setWins("15");String name = row.getName();int wins = row.getWins();

处理完所有元素之后,我就可以将保存该数组的值域声明为private了。

   private String[] _data = new String[3];

现在,本次重构最重要的部分(接口修改)已经完成。但是「将对象内的数组替换掉」的过程也同样重要。我可以针对每个数组元素,在内建立一个型别相当的值域,然后修改该数组元素的访问函数,令它直接访问新建值域,从而完全摆脱 对数组元素的依赖。

 class Performance...public String getName() {return _name;}public void setName(String arg) {_name = arg;}private String _name;

对数组中的每一个元素都如法炮制。全部处理完毕后,我就可以将数组从我的Performance class删掉了。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...