《重构:改善既有代码的设计》 重新组织数据 之 5

版权声明:请注明转发出处 https://blog.csdn.net/mafucun1988/article/details/89458393

《重构:改善既有代码的设计》中提到过很多重构方法,关于重新组织数据的方法有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();

猜你喜欢

转载自blog.csdn.net/mafucun1988/article/details/89458393