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

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

《重构:改善既有代码的设计》中提到过很多重构方法,关于重新组织数据的方法有8种。本文介绍:
以对象取代数据值 replace data value with object

  • 名称:以对象取代数据值 replace data value with object
  • 概要:有一个数据项,需要与其他数据和行为一起使用才有意义。将数据项变成对象
  • 动机: 开发初期,以简单的数据线表示简单情况。比如一个字符串表示电话号码。后面如果区号,格式化等特殊行为,就会变的味道很坏。
  • 做法:
    • 为代替换数值新建一个类,其字段和源类中的代替换数值类型一样。在新类中加入这个字段的取值函数,再加上一个接受此字段为参数的构造函数。
    • 编译
    • 将源类中的待替换数值字段改为新建的类
    • 修改源类中该字段的取值函数,令它调用新类的取值函数
    • 如果源类构造函数中用到这个待替换字段(多半是赋值动作),我们旧修改构造函数,令它改用新类的构造函数来对字段进行赋值动作
    • 修改源类中待替换字段的设值函数,令它为新类创建一个实例
    • 编译,测试
  • 代码演示

修改之前的代码:

///////////////////////////.h
#ifndef REFACTORDATA_H
#define REFACTORDATA_H
class Order
{
public:
    Order(QString customer);
    QString getCustomer() const;
    void setCustomer(const QString &customer);
    
private:
    QString m_customer;
};

#endif // REFACTORDATA_H
///////////////////////////.cpp
QString Order::getCustomer() const
{
    return m_customer;
}

void Order::setCustomer(const QString &customer)
{
    m_customer = customer;
}

///////////////////////////main.cpp
int numberOfOrdersFor(vector<Order *> orders, QString customer)
{
    int result = 0;
    for (auto iter = orders.begin(); iter != orders.end(); iter++)
    {
        if (!(*iter)->getCustomer().compare(customer))
        {
            result++;
        }
    }
    return  result;
}

    vector<Order *> orders;
    int order1number = 0;
    orders.push_back(new Order("Order1"));
    orders.push_back(new Order("Order2"));
    orders.push_back(new Order("Order3"));
    order1number = numberOfOrdersFor(orders, "Order1");
    qDebug() << "order1 number = " << order1number;

1)创建customer类,增加取值函数和构造函数
2)将order中的m_customer字段修改为Customer类,并修改引用该字段的函数
3) 之所以再设值函数中创建一个customer实例,因为以前的字符串是个值对象,所以现在的customer对象也应该是个值对象,这也一位置每个order对象都包含自己的一个customer对象。当然,也可以重构成引用对象。
4) 使用rename method将getCustomer()修改为getCustomerName(), 使含义更明确。其他也一样
修改之后的代码:

///////////////////////////.h
#ifndef REFACTORDATA_H
#define REFACTORDATA_H
class Customer
{
public:
    Customer(QString name);
    QString getName() const;

private:
    QString m_name;
};

class Order
{
public:
    Order(QString customer);
    QString getCustomerName() const;
    void setCustomer(const QString &customer);

private:
    Customer *m_pcustomer;
};
///////////////////////////.cpp
Order::Order(QString customerName)
{
    m_pcustomer = new Customer(customerName);
}

QString Order::getCustomerName() const
{
    return m_pcustomer->getName();
}

void Order::setCustomer(const QString &customerName)
{
    m_pcustomer = new Customer(customerName);
}

Customer::Customer(QString name)
{
    m_name = name;
}

QString Customer::getName() const
{
    return m_name;
}


///////////////////////////main.cpp
int numberOfOrdersFor(vector<Order *> orders, QString customerName)
{
    int result = 0;
    for (auto iter = orders.begin(); iter != orders.end(); iter++)
    {
        if (!(*iter)->getCustomerName().compare(customerName))
        {
            result++;
        }
    }
    return  result;
}


    vector<Order *> orders;
    int order1number = 0;
    orders.push_back(new Order("Order1"));
    orders.push_back(new Order("Order2"));
    orders.push_back(new Order("Order3"));
    order1number = numberOfOrdersFor(orders, "Order1");
    qDebug() << "order1 number = " << order1number;

猜你喜欢

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