我是靠谱客的博主 高兴豌豆,这篇文章主要介绍《重构:改善既有代码的设计》 重新组织数据  之 4,现在分享给大家,希望可以做个参考。

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

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

修改之前的代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
///.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"); }

修改之后的代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
///.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;

最后

以上就是高兴豌豆最近收集整理的关于《重构:改善既有代码的设计》 重新组织数据  之 4的全部内容,更多相关《重构:改善既有代码的设计》内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(103)

评论列表共有 0 条评论

立即
投稿
返回
顶部