如果你有一个数组,其中的元素各自代表不同东西,比如你有一个

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的更多相关文章

  1. 『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object

    有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你 ...

  2. 『重构--改善既有代码的设计』读书笔记----Replace Data Value with Object

    当你在一个类中使用字段的时候,发现这个字段必须要和其他数据或者行为一起使用才有意义.你就应该考虑把这个数据项改成对象.在开发初期,我们对于新类中的字段往往会采取简单的基本类型形式来保存,但随着我们开发 ...

  3. 『重构--改善既有代码的设计』读书笔记----Replace Temp with Query

    Replace Temp with Query,顾名思义,表示你用查询来替换临时变量本身,临时变量对于函数来说是只有当前函数可见的,如果你在同类的别的地方要用到这个变量你就必须重新写表达式来获取这个变 ...

  4. 『重构--改善既有代码的设计』读书笔记----Extract Method

    在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...

  5. 『重构--改善既有代码的设计』读书笔记----Change Value to Reference

    有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...

  6. 『重构--改善既有代码的设计』读书笔记---Duplicate Observed Data

    当MVC出现的时候,极大的推动了Model与View分离的潮流.然而对于一些已存在的老系统或者没有维护好的系统,你都会看到当前存在大把的巨大类----将Model,View,Controller都写在 ...

  7. 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field

    如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...

  8. 『重构--改善既有代码的设计』读书笔记----Move Method

    明确函数所在类的位置是很重要的.这样可以避免你的类与别的类有太多耦合.也会让你的类的内聚性变得更加牢固,让你的整个系统变得更加整洁.简单来说,如果在你的程序中,某个类的函数在使用的过程中,更多的是在和 ...

  9. 『重构--改善既有代码的设计』读书笔记----Substitute Algorithm

    重构可以把复杂的东西分解成一个个简单的小块.但有时候,你必须壮士断腕删掉整个算法,用简单的算法来取代,如果你发现做一件事情可以有更清晰的方式,那你完全有理由用更清晰的方式来解决问题.如果你开始使用程序 ...

随机推荐

  1. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1105  Solved: 331[Submit][Statu ...

  2. wxWidgets一个界面与数据分离的简单例子

    /*************************************************************** * Name: MyApp.h * Purpose: Defines ...

  3. zzuoj 10407: B.最大岛屿

    10407: B.最大岛屿 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 12  Solved: 5[Submit][Status][Web Board ...

  4. Redis未授权访问缺陷让服务器沦为肉鸡

    朋友的一个项目说接到阿里云的告警,提示服务器已沦为肉鸡,网络带宽被大量占用,网站访问很慢,通过SSH远程管理服务器还频繁断开链接.朋友不知如何下手,便邀请我帮忙处理. 阿里云的安全告警邮件内容: 在没 ...

  5. flashback drop(2015-2-3学习日记)

    知识面是由知识点组成的,你在研究某一个知识点的时候常常会遇到另一个知识点,然后你去研究那个知识点,又会带出更多的知识点,最终组成了知识面. 今天在看书的时候看到一个删除表的语句: DROP TABLE ...

  6. 在html使用a标签 直接下载图片 不通过后台实现直接下载

    由于a标签在HTML中链接图片会被识别并打开到网页上 如果想下载这个图片的话 就需要连接到后台读取文件并生成一个头信息下载.不过可以先给a标签加上一个download属性即可直接下载了. <a ...

  7. 【设计模式 - 22】之策略模式(Strategy)

    1      模式简介 在策略模式中,一个类的行为或其算法可以在运行时改变.策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可以互相替换. 策略模式的优点: 1)        算法可以自由 ...

  8. android账号与同步之同步实现

    上一篇博文我先介绍了账号与同步的账号管理,这篇就介绍一下还有一部分.就是android给提供的sync同步机制的使用. 事实上sync机制的使用和上一篇博文中介绍的账号管理非常类似,也是基于binde ...

  9. sift算法c语言实现

    前段时间在做三维測量方面的研究.须要得到物体表面三维数据.sift算法是立体匹配中的经典算法.以下是对RobHess的SIFT源码的凝视.部分内容參考网上,在这里向各位大神表示感谢. http://b ...

  10. oracle7

    管理初始化参数 管理初始化参数(调优的一个重要知识点,凭什么可以对数据库进行调优呢?是因为它可以对数据库的一些参数进行修改修正) 初始化参数用于设置实例或是数据库的特征.oracle9i提供了200多 ...