『重构--改善既有代码的设计』读书笔记----Replace Array with Object

若是你有一个数组,其中的元素各自表明不一样东西,好比你有一个html

QList<QString> strList;

其中strList[0]表明选手姓名,strList[1]表明选手家庭住址,很显然这个数组表示的含义已经太多,你须要用对象来替换数组,而且对于数组中的每一个元素,以一个字段来表示。数组

数组是一种常见的用以组织数据的数据结构,不过,它们应该只用于“以某种顺序容纳一组类似对象”。对于上面的例子你能够看到一个数组容纳了不一样对象,这会给使用数组的客户带来麻烦,由于他们很难记住数组的第一个元素是姓名,第二个元素是家庭住址。对象就不一样了,你能够运用字段名称函数名称来表达这样的信息,你不须要死记硬背更加不须要依赖注释,并且使用对象的好处更是可让你使用Move Method给他添加跟数据有关的行为让这个类自己愈来愈有魅力。数据结构

  • 作法:
  • 新建一个类用来表示数组所拥有的信息,并先以public字段来保存原先数组。
  • 修改数组的全部客户,让他们改用新类实例。
  • 编译,测试。
  • 逐一为数组元素添加取值/设值函数,根据元素的用途,为这些访问函数命名,修改客户端代码,让他们经过访问函数去取用数组元素,每次修改以后,编译测试。
  • 当全部对数组的直接访问都转而调用访问函数以后,将新类中保存该字段从public改成private.
  • 编译。
  • 对于数组中的每个元素,在新类中建立一个类型至关的字段,修改该元素的访问函数,令他改用上述新字段。
  • 每修改一个元素,编译并测试。
  • 数组的全部元素都有了相应字段以后,删除该数组。

例子:app

QList<QString> row;

row.append("Livepool");
row.append("China");

QString name = row[0];
QString nation = row[1];

这个数组有两个元素,其中第一个元素保存姓名,第二个元素保存国籍,很显然这样写,会困扰客户,因此咱们须要重构,首先咱们声明一个类用来作数组转移函数

class Performance
{
    public:
        QList<QString> m_data;
};

首先咱们先把这个数组声明为public,放心,这只是暂时的,后期咱们会把他设为private : ) ,如今咱们要找到建立和访问数组的地方,在建立地点,咱们将他改成下面代码测试

Performance row;

row.m_data.append("Livepool");
row.m_data.append("China");

QString name = row.m_data[0];
QString nation = row.m_data[1];

咱们已经完成了第一步,已经把这个新建类开始引入了,别急,重构就是一步一步慢慢来,能够保证不会容易出错。接下来咱们要为数组元素逐一加上有意义的设值和取值函数,首先咱们从姓名开始spa

class Performance
{
    public:
        QString name() const
        {
            return m_data[0];
        }

        void setName(const QString &value)
        {
            m_data[0] = value;
        }
};

而后修改使用row对象的代码,让他们转而使用这些函数code

row.setName("Livepool");
row.m_data[1] = "China";

QString name = row.name();
QString nation = performance.m_data[1];

接下来咱们如法炮制第二个元素,最终代码为orm

class Performance
{
    public:
        QString nation() const
        {
            return m_data[1];
        }

        void setNation(const QString &value)
        {
            m_data[1] = value;
        }
};

row.setName("Livepool");
row.setNation("China");

QString name = row.name();
QString nation = row.nation();

处理完全部元素以后咱们就能够放心的把字段改成private了htm

private:
    QList<QString> m_data;

如今咱们完成了重构最重要的部分----接口,可是咱们还要进行替换对象内数组的过程,我能够针对每一个数组元素,在类中新建一个类型至关的字段,而后修改访问数组元素的访问函数,令他直接访问新字段,从而彻底摆脱对数组的依赖。

class Performance
{
    public:
        QString name() const
        {
            return m_name;
        }

        void setName(const QString &value)
        {
            m_name = value;
        }
    private:
        QString m_name;
};

待全部元素处理完毕以后,咱们就能够将数组从Performance类中删除了。

相关文章
相关标签/搜索