《重构:改善既有代码的设计》中提到过很多重构方法,关于重新组织数据的方法有8种。本文介绍:
以对象取代数组 replace array with object
- 名称:以对象取代数组 replace array with object
- 概要:有一个数组,其中的元素各自代表不同的东西。以对象替换数组,对于数组中的每个元素,以一个字段来表示。
- 动机: 一个数组中容纳了多种不同对象,很难记忆某几位是什么。如果运用对象,使用字段名称和函数名称来传达信息。而且将信息封装起来。
- 做法:
- 新建一个类表示数组所拥有的信息,并在其中以一个public字段保存原先的数组
- 修改数组的所有用户,让它们改用新类的实例。
- 编译,测试
- 逐一为数值元素添加取值/设值函数。根据元素的用途,为这些访问函数命名。修改客户端代码,让它们通过访问函数来取用数组内的元素。每次修改后,编译并测试。
- 当所有对数组的直接访问都转而调用访问函数后,将新类中保存该数组的字段声明为private
- 编译
- 对于数组内的每一个元素,再新类中创建一个类型相当的字段。修改该元素的访问函数,令它改用上述的新建字段
- 每修改一个元素,编译并测试
- 数组的所有元素都有了相应字段后,删除该数组
- 代码演示
修改之前的代码:
QString row[3] = {"rocket", "72", "10"};//1. 队伍名称,2.胜场,3. 败场
QString name = row[0];
int win = row[1].toInt();
int fail = row[2].toInt();
1) 创建一个新类performance, 将row[3]作为其成员变量。
2)在使用row[3]的地方,使用performance
3) 为数组元素添加有意义的取值/设值函数
4) 将数据封装起来,修改为private
5) 替换接口,用name,win,fail来替换row[3],删除row[3]。不要修改win和fail的数据类型,还是QString
修改之后的代码:
///.h
#ifndef REFACTORDATA_H
#define REFACTORDATA_H
class Performance
{
public:
Performance(QString name, QString win, QString fail);
QString GetName();
QString GetWin();
QString GetFail();
void GetName(QString name);
void GetWin(QString win);
void GetFail(QString fail);
private:
QString m_Name;
QString m_Win;
QString m_Fail;
};
#endif // REFACTORDATA_H
///.cpp
Performance::Performance(QString name, QString win, QString fail)
{
m_Name = name;
m_Win = win;
m_Fail = fail;
}
QString Performance::GetName()
{
return m_Name ;
}
QString Performance::GetWin()
{
return m_Win;
}
QString Performance::GetFail()
{
return m_Fail;
}
void Performance::GetName(QString name)
{
m_Name = name;
}
void Performance::GetWin(QString win)
{
m_Win = win;
}
void Performance::GetFail(QString fail)
{
m_Fail = fail;
}
///main.cpp
Performance perf("rocket", "72", "10");
QString name = perf.GetName();
int win = perf.GetWin().toInt();
int fail = perf.GetFail().toInt();