`
足至迹留
  • 浏览: 495901 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

5. 重新组织对象(数据)

 
阅读更多
程序中处理的所有对象都是数据,所有抽象、算法都是为了表示数据、处理数据。下面我们就看看如何更好的组织数据。

5.1 Self Encapsulate Field (自封装字段)
在同一个类中如果直接访问这个类的一个字段,则与字段之间的耦合关系很深,为这个字段建立取值/设值函数,并且只以这些函数来访问字段。就如有一个原则“尽可能让所有的字段都是private的”,其实可变字段即使只通过getter/setter字段访问,也会有安全隐患,除非使用保护性拷贝等手段。

在“字段访问方式”这个问题上,存在两种截然不同的观点:
(1)在该变量定义所在的类中,可以自由访问它。
(2)即使在这个类中也应该只使用访问函数间接访问。
个人支持第一种,除非对于一个变量每次使用的都是经过一定算法计算后的值,那么可以把这个算法包装起来。当然,智者见智。

5.2 Replace Data Value with Object (以对象取代数据值)
有一个数据项,需要与其他数据和行为一起使用才有意义,就可以将数据项变成对象,封装数据和行为。

开发初期,我们往往决定以简单的数据项表示简单的情况。但是,随着开发的进行,这些简单数据项不再那么简单了。比如一开始可能用一个String来表示“电话号码”,但后来发现,电话号码需要“格式化”,“提取区号”之类的特殊行为。这样Duplicate Code和Feature Envy味道很快就会从代码中散发出来。当这些坏味道开始出现,就应该讲数据值变成对象了。这是一个演变的过程,随着需求的变化,组织的变化,我们代码的处理方式也要随之变化。

5.3 Change Value to Reference (将值对象改为引用对象)
当从一个类衍生出许多彼此相等的实例,我们希望将他们替换为同一个对象。

也就是尽可能少的创建对象。如果多个对象里包含的是同一个对象(比如Date),那么就可以采用引用而不需要为每个对象创建一个对象。这可以通过使用静态工厂方法或单例模式等来实现。

5.4 Replace Array with Object (以对象取代数组)
如果有一个数组,其中的元素各自代表不同的东西。那么可以以对象来替代数组。对于数组中的每个元素变成对象的一个字段。

相信很少有人会犯这种错误。一个数组的元素一般都是同一个范畴的数据,否则结构会很乱

5.5 Duplicate Observed Data (复制“被监视数据”)
比如有一些领域数据置身与GUI控件中,可以把这些领域数据单独组成一个对象,利用观察者模式。这样可以解耦数据与展示,对相同的数据可以有不同的展示方式。这也是基于良好的分层结构,将业务处理逻辑与界面展示层分开。


5.6 Replace type code with subclasses (以子类取代类型码)
如果有一个不可变的类型码,而且它会影响类的行为(根据不同的值执行不同的动作)。可以以子类取代这个类型码。


一般来说,这种情况的标志就是像switch这样的条件表达式。可能有两种表现形式:switch语句或if-else结构。不论哪种形式,都是检查类型码值,并根据不同的值执行不同的动作,这时可以以replace conditional with polymorphism进行重构。
为了能顺利进行重构,首先应该将类型码替换为可拥有多态行为的继承体系。这样的一个继承体系应该以类型码的宿主类为基类,并针对每一种类型码各建立一个子类。然后把不同的行为分别放到对应的子类中,选择不同的子类型执行不同的行为来代替以前的switch判断。
但有以下两种情况不能这么做:
(1)类型码值在对象建立之后发生了改变。
(2)由于其他原因,类型码宿主类已经有了子类。这就需要使用replace type code with State/Strategy。这其实是“继承和组合”之间的抉择,当然还是优先推荐组合。

特别注意:
并不是所有的只要出现switch就需要替换掉类型码。只是当类型码重复出现决定类的行为,重复出现根据type code来做不同的行为时,才需要动手重构。毕竟需要判断的地方是不能省的。

5.7 replace type code with State/Strategy (以State/Strategy取代类型码)
有一个类型码,它会影响类的行为,但无法通过继承手法消除它,还可以使用状态对象取代类型码。


State模式和Strategy模式非常相似,因此无论选择其中哪个,重构过程都是相同的。
  • 大小: 68.5 KB
  • 大小: 7.7 KB
  • 大小: 12.2 KB
  • 大小: 49.7 KB
  • 大小: 22.9 KB
  • 大小: 10.4 KB
  • 大小: 10 KB
  • 大小: 9.2 KB
0
1
分享到:
评论

相关推荐

    5.js.对象.rar

    JavaScript对象是语言的基石之一,它们是键值对的集合,可以用来组织和操作数据。 1. **对象的基本概念** JavaScript中的对象可以视为一种复杂的数据结构,由属性(keys)和对应的值(values)组成。属性可以是...

    数据结构对象的基本概念.docx

    数据结构对象是指在计算机科学中用来存储和组织数据的方式和方法。它是指描述数据的逻辑结构和物理结构的方式,包括数据的逻辑关系、数据的存储方式和数据的操作方式。 二、数据结构对象的类型 数据结构对象可以...

    基于Greenplum Hadoop- 分布式平台的大数据解决方案18.定义数据库对象(8)-创建和装载分区表.zip

    5. **与Hadoop集成**:Greenplum可以与Hadoop生态系统无缝集成,比如通过Hadoop的HDFS作为数据源或目标。这使得数据在Greenplum和Hadoop之间自由流动,支持更复杂的数据处理工作流。 文件"18 - 定义数据库对象(8)....

    面向对象空间数据模型构建研究

    模型设计考虑继承性、多态性和封装性原则,用以组织对象的属性和方法。 6. 面向对象空间数据模型的框架构建:提出了一种组织结构框架,该框架由空间特征数据的二进制结构表达和空间属性数据文件组成。同时,结合...

    hdf5.h c++ 库文件

    2. 创建或打开一个Group对象,作为数据组织的起点。 3. 定义一个DataType,根据需要的数据类型。 4. 创建一个DataSpace,指定数据集的维度和大小。 5. 创建一个DataSet,用DataType和DataSpace初始化。 6. 写入或...

    面向对象数据模型.pdf

    在GIS领域中,面向对象数据模型提供了更加符合现实世界的空间信息组织方法。地理实体如道路、建筑物、河流等都可以被视为具有属性和行为的对象。GIS中的面向对象数据模型通过以下概念实现数据的组织和管理: 1. ...

    数据结构的面向对象描述方法研究.pdf

    类图通过展示各个类之间的层次结构和相互关系,为开发人员提供了一个直观的视图来理解系统的数据组织和行为。 综上所述,面向对象的描述方法为数据结构的描述带来了革新,它不仅提高了软件的整体质量,还能够帮助...

    14811数据结构(用面向对象的方法与C++语言描述)(第2版)

    通过这些基础知识的学习,读者可以理解数据如何在计算机内存中组织和操作。 2. **C++编程基础**:为了使非C++背景的读者能够顺利学习,书中会涵盖C++的基础语法,如变量、运算符、流程控制语句(如if、switch、for...

    GIS的技术特点及数据组织与数据结构.doc

    3. **数据组织**:GIS中的数据组织通常采用面向对象的方法,每个地图目标对象(点、线、面)都包含几何属性和关联属性信息,这种组织方式方便对特定对象进行操作和查询,同时也便于进行复杂的地理分析。 综上所述,...

    hdf5-1.10.1.tar.gz

    1. **分层结构**:HDF5允许用户创建一个层次化的数据结构,类似于文件系统的目录结构,可以方便地组织和管理大量数据。 2. **自描述性**:每个数据对象都包含关于其自身的信息,如数据类型、形状和存储位置,这使得...

    易语言源码对象用法大全.rar

    - 集合类如列表、队列、字典等,提供灵活的数据组织方式,方便对对象进行增删查改操作。 9. **事件与事件处理** - 易语言支持事件驱动编程,对象可以触发事件,其他对象订阅并响应这些事件。 - 事件处理程序通过...

    面向对象的用电信息数据交换协议(加目录).pdf

    - 对象模型:描述了用电信息系统的对象如何通过继承关系组织成接口类。 - 接口类的表示方法:定义了接口类的结构和命名规则。 - 对象标识:为系统中的对象分配唯一编码,确保可以准确无误地识别每个对象。 - 接口类...

    面向对象数据结构与软件开发

    ### 面向对象数据结构与软件开发 #### 核心知识点详解 ##### 一、面向对象编程(OOP)基础 **定义:** 面向对象编程是一种编程范式,它使用“对象”来设计软件。对象是数据和操作这些数据的方法的封装体。 **...

    osgEarth数据加载及组织解析

    本篇文章将深入探讨osgEarth的数据加载与组织解析过程,帮助你理解如何有效地利用这一工具。 首先,我们来了解什么是数据加载。在osgEarth中,数据加载涉及到将各种地理数据格式(如TIFF、KML、SHP等)转化为场景中...

    计算机监控系统的监控对象数据结构研究.pdf

    本文所讨论的计算机监控系统的监控对象数据结构研究,不仅需要考虑如何建立和维护监控对象的属性,还需要确保这些属性能够准确及时地反映监控对象的状态变化。监控对象数据结构的研究为监控系统的开发和维护提供了...

    hdf5-1.8.13.tar.gz

    HDF5的设计目标是提供一种高效、可靠且跨平台的方式来组织和存储各种类型的数据,包括数值、图像、文本等。它的核心特性包括: 1. **分层结构**:HDF5文件采用类似于文件系统的分层结构,可以创建目录(Group)和...

    多维数据模型在面向对象数据库中的应用

    5. **缓存机制的应用**:面向对象数据库通常内置了缓存机制,这对于处理大量的多维数据尤为重要。合理利用缓存不仅可以加快查询速度,还能减轻数据库服务器的压力。 #### 五、案例分析 假设一家零售公司需要分析...

    ( 数据结构(用面向对象的方法与C++语言描述)(第2版).

    这些是最基本的数据组织形式,是理解更复杂数据结构的基础。面向对象的设计原则,如封装、继承和多态性,将被用来构建这些数据结构的类。 2. **线性数据结构**:栈和队列是线性数据结构的典型代表。栈是一种后进先...

    Abap基础学习文档12_以簇方式存 储数据对象.doc

    ### Abap基础学习文档12_以簇方式存储数据对象 #### 概述 本文档主要介绍了如何在ABAP环境中使用数据簇来管理和存储复杂的内部数据对象。数据簇是一种能够帮助程序员有效地组织、存储和检索数据的方法。它既可以在...

    精通WindowsAPI.pdf

    2.1.2 Windows数据类型与标准C数据类型的关系...................................................28 2.1.3 Windows数据类型与Windows API...................................................................28 ...

Global site tag (gtag.js) - Google Analytics