『重構--改善既有代碼的設計』讀書筆記----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類中刪除了。

相關文章
相關標籤/搜索