『重构--改善既有代码的设计』读书笔记----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[];
QString nation = row[];
这个数组有两个元素,其中第一个元素保存姓名,第二个元素保存国籍,很显然这样写,会困扰客户,所以我们需要重构,首先我们声明一个类用来做数组转移
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[];
QString nation = row.m_data[];
我们已经完成了第一步,已经把这个新建类开始引入了,别急,重构就是一步一步慢慢来,可以保证不会容易出错。接下来我们要为数组元素逐一加上有意义的设值和取值函数,首先我们从姓名开始
class Performance
{
public:
QString name() const
{
return m_data[];
} void setName(const QString &value)
{
m_data[] = value;
}
};
然后修改使用row对象的代码,让他们转而使用这些函数
row.setName("Livepool");
row.m_data[] = "China";
QString name = row.name();
QString nation = performance.m_data[];
接下来我们如法炮制第二个元素,最终代码为
class Performance
{
public:
QString nation() const
{
return m_data[];
} void setNation(const QString &value)
{
m_data[] = 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类中删除了。
『重构--改善既有代码的设计』读书笔记----Replace Array with Object的更多相关文章
- 『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object
有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Data Value with Object
当你在一个类中使用字段的时候,发现这个字段必须要和其他数据或者行为一起使用才有意义.你就应该考虑把这个数据项改成对象.在开发初期,我们对于新类中的字段往往会采取简单的基本类型形式来保存,但随着我们开发 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Temp with Query
Replace Temp with Query,顾名思义,表示你用查询来替换临时变量本身,临时变量对于函数来说是只有当前函数可见的,如果你在同类的别的地方要用到这个变量你就必须重新写表达式来获取这个变 ...
- 『重构--改善既有代码的设计』读书笔记----Extract Method
在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...
- 『重构--改善既有代码的设计』读书笔记----Change Value to Reference
有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...
- 『重构--改善既有代码的设计』读书笔记---Duplicate Observed Data
当MVC出现的时候,极大的推动了Model与View分离的潮流.然而对于一些已存在的老系统或者没有维护好的系统,你都会看到当前存在大把的巨大类----将Model,View,Controller都写在 ...
- 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field
如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...
- 『重构--改善既有代码的设计』读书笔记----Move Method
明确函数所在类的位置是很重要的.这样可以避免你的类与别的类有太多耦合.也会让你的类的内聚性变得更加牢固,让你的整个系统变得更加整洁.简单来说,如果在你的程序中,某个类的函数在使用的过程中,更多的是在和 ...
- 『重构--改善既有代码的设计』读书笔记----Substitute Algorithm
重构可以把复杂的东西分解成一个个简单的小块.但有时候,你必须壮士断腕删掉整个算法,用简单的算法来取代,如果你发现做一件事情可以有更清晰的方式,那你完全有理由用更清晰的方式来解决问题.如果你开始使用程序 ...
随机推荐
- 在线App开发平台——应用之星傻瓜式开发平台
随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,出于对技术的敬畏,很多企业下意识认为开发APP是一个有难度的技术活,所以很多时候有心无力,也担心APP的后续的技术支持. ...
- having的用法以及与where区别介绍
having子句可以让我们筛选成组后的各种数据,having子句在查询过程中慢于聚合语句,接下来通过实例介绍下,感兴趣的你可以参考下,希望可以帮助到你 having的用法 having子句可以让我们筛 ...
- NIO组件Selector工作机制详解(下)
转自:http://blog.csdn.net/haoel/article/details/2224069 五. 迷惑不解 : 为什么要自己消耗资源? 令人不解的是为什么我们的Java的New I/ ...
- 深入理解C++中的explicitkeyword
深入理解C++中的explicitkeyword kezunhai@gmail.com http://blog.csdn.net/kezunhai C++中的explicitkeyword仅仅能用于修 ...
- PL/SQL:使用pragma restrict_references限制包权限
在看别人的代码的时候.发现了例如以下的编译指令. pragma restrict_references(get_attribute_name, wnds); get_attribute_name是一个 ...
- Eclipse快捷键调试
Eclipse中有如下一些和运行调试相关的快捷键Ctrl+Shift+B:在当前行设置断点或取消设置的断点 F11:调试最后一次执行的程序 Ctrl+F11:运行最后一次执行的程序F5:跟踪到 ...
- POJ 1006 Biorhythms(中国剩余定理)
题目地址:POJ 1006 学习了下中国剩余定理.參考的该博客.博客戳这里. 中国剩余定理的求解方法: 假如说x%c1=m1,x%c2=m2,x%c3=m3.那么能够设三个数R1,R2,R3.R1为c ...
- Android开发_Android数据的四种存储方式
Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...
- JQuery Kendo UI使用技巧总结
Kendo UI开发总结 By Gloomyfish on 2013-04-25 在Grid中支持分页刷新: scrollable: {virtual : true }, 在Gr ...
- Windows XP下安装WinCE6.0开发环境
Windows下怎样编译WinCE6.0及开发应用程序.以下介绍(安装之前必须保证C盘有足够的空间!20g左右!主要是由于在安装程序在安装过程中要解压): 在Visual Studio 2005之前, ...