zoukankan      html  css  js  c++  java
  • 『重构--改善既有代码的设计』读书笔记----Replace Array with Object

    如果你有一个数组,其中的元素各自代表不同东西,比如你有一个

    QList<QString> strList;

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

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

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

    例子:

    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];

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

    class Performance
    {
        public:
            QString name() const
            {
                return m_data[0];
            }
    
            void setName(const QString &value)
            {
                m_data[0] = value;
            }
    };

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

    row.setName("Livepool");
    row.m_data[1] = "China";
    
    QString name = row.name();
    QString nation = performance.m_data[1];

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

    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了

    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类中删除了。

  • 相关阅读:
    2019/5/13 洛谷P4742 【tarjan缩点 + 拓扑dp】
    图论500题
    欧拉回路与欧拉路径
    二分图的判定
    二分图的最大匹配以及带权匹配【匈牙利算法+KM算法】
    网络流三大算法【邻接矩阵+邻接表】POJ1273
    马拉车算法,mannacher查找最长回文子串
    tarjan算法(强连通分量 + 强连通分量缩点 + 桥(割边) + 割点 + LCA)
    luogu P5774 [JSOI2016]病毒感染 线性 dp
    luguo P2519 [HAOI2011]problem a dp+贪心
  • 原文地址:https://www.cnblogs.com/rickyk/p/4186754.html
Copyright © 2011-2022 走看看