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

《重构:改善既有代码的设计》中提到过很多重构方法,关于重新组织数据的方法有8种。本文介绍:
将引用对象改为值对象 change reference to value

  • 名称:将引用对象改为值对象 change reference to value
  • 概要:有一个引用对象,很小且不可变,而且不易管理。将它变成一个值对象
  • 动机: 无论何时,只要调用同一对象的同一个查询函数,都应该得到同样的结果。
  • 做法:
    • 检查重构目标是否为不可变对象,或是否可修改为不可变对象。如果该对象目前还不是不可变的,就使用remove setting method,直到它成为不可变的为止
    • 将调用Map修改为直接调用构造函数(c++中没有java的实现方法,所以修改成此)
    • 编译,测试
    • 考虑是否可以删除工厂函数,并将构造函数声明为public
  • 代码演示

修改之前的代码:

///.h
#ifndef REFACTORDATA_H
#define REFACTORDATA_H
#include <QMap>
class Customer
{
public:
    QString getName() const;
    static Customer* GetNamedCustomer(QString name);
    static void LoadCustomers();
private:
    Customer(QString name);
private:
    QString m_name;
    static QMap<QString, Customer*> m_Instance;
};

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

private:
    Customer *m_pcustomer;

};
#endif // REFACTORDATA_H

///.cpp

Order::Order(QString customerName)
{
    m_pcustomer = Customer::GetNamedCustomer(customerName);
}

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

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

QMap<QString, Customer*>  Customer::m_Instance;

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

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

Customer* Customer::GetNamedCustomer(QString name)
{
    return m_Instance[name];
}

void Customer::LoadCustomers()
{
    m_Instance["Test1"] = new Customer("Test1");
    m_Instance["Test2"] = new Customer("Test2");
    m_Instance["Test3"] = new Customer("Test3");
}

修改之后的代码:

///.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;
};
#endif // REFACTORDATA_H
///.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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

giantmfc123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值