重新组织数据

重新组织数据

  • Self Encapsulate Field
    对于属性的访问采用访问函数的形式。通常这不是必须的,我们可以默认采用直接访问的方式,直至这种方式带来麻烦,我们可以通过重构来改变范文形式。
  • Replace Data Value with Object
    对于开发初期使用的简单的数据对象,随着业务发展越来越复杂,而对数据对象处理的函数也开始被重复定义的时候,我们需要考虑对数据对象进行封装,减少重复代码。
  • Change Value to Reference
    关于值对象和引用对象可以参考《Effect Java》有时,我们在值对象和引用对象的选择上常常会摇摆不定,最初我们可以选择值对象,直至需要修改某一对象需要同步到所有引用此对象的时候我们选择重构。我们将值对象改为引用对象我们就需要考虑引用对象什么时候被创建,以及如何将引用传递给需要使用的地方(通常使用工厂函数)。
  • Change Reference to Value
    如果你有一个引用对象,很小且不可变,而且不易管理,可以考虑将其变成一个值对象。不可变的值对象特别有用,因为你无需考虑他们同步的问题。转换成值对象时我们需要覆写equeals和hashCode
  • Replace Array with Object
    以对象替换数组。对于数组中的每一个元素,以一个字段来表示。数组应该只用于“以某种顺序容纳一组相似的对象”。如果一个数组容纳了多种不同的对象,这会为使用者带来困惑。
  • Duplicate Observed Data
    将数据复制到一个领域对象总。建立一个Observer模式,用以同步领域对象和GUI对象内的重复数据。一个良好设计的系统,应该将处理用户界面和处理业务逻辑的代码分开。
  • Change Unidirectional Association to Bidirectional
    如果两个类都需要使用对方的特性,但其间只有一条单向的连接。我们可以通过添加一个反向的指针,并使修改函数能够同时更新两条连接。反向指针如果使用不当会引起混乱。我们建立关联关系选择时可以参考:1、如果两者都是引用对象,其是一对多的关系,那么就由“拥有单一引用”的那一方承担控制者的角色。2、如果某个对象是组成另一对象的部件,那么由后者负责控制关联关系。3、如果两者都是引用对象,而且是多对多的关系,那么随便其中哪个对象来控制关联关系。
  • Change Bidirectional Association to Unidirectional
    如果两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性,我们就可以去除不必要的关联。
    双向连接的维护成本很高,并且容易造成“僵尸对象”,而且使得两个类之间有依赖。
  • Replace Magic Number with Symbolic Constant
    使用常量代替魔法数,不解释。
  • Encapsulate Collection
    让函数返回该集合的一个只读的副本,并在这个类中提供添加、移除集合元素的函数。对于对于取值函数而言,我们不应该返回集合自身,因为这会让用户得以需改集合内容而集合所有者却一无所悉。这也会对永不暴露过多对象内部数据结构的信息。另外不应该为这个集合提供一个设置函数,但应该提供用以为集合添加移除元素的函数。这样,集合拥有者就可以控制集合元素的添加和移除。这也是Effect Java中提倡的方法。但是对于Android开发者而言,复制集合会带来额外的开销,因此在保证逻辑清晰的基础上可以不依照这个原则来。
  • Replace Type Code with Class
    使用数字来表示类别通常导致编译器无法对类别做类型检验。如果遇到使用switch语句判断整数类别时,我们可能需要使用策略或者状态模式来进行重构。我们可以将为类型码创建类型,这样就可以通过编译器来强制类型检查了。
  • Replace Type Code with Subclasses
    如果类中会根据int型状态的判断进行不同的操作,典型的是switch或者if...else结构。此时我们可以创建一个继承体系以类型码的宿主类为基类,并针对每一种类型码各建立一个子类。使用子类的另一个原因是宿主类中出现了“只与特定类型码之对象相关”的特性。这种方式的好处在于把不同的行为从类用户那转移到了类自身。如果需要加入新的行为变化,只需添加一个子类就行了。
  • Replace Type Code with State/Strategy
    你有一个类型码,它会影响类的行为,但是你无法通过继承手法消除它。以状态对象取代类型码。这种方式通常会使用策略或者状态模式。
  • Replace Subclass with Fields
    如果各个子类的唯一差别只在“返回常量数据”的函数身上。修改这些函数,使它们返回超类中的某个字段,然后销毁子类。这样做的目的是避免了继承带来的复杂性,使程序更简洁。

总结

这一章主要介绍了类内部数据组织过程中常见的重构手法,其原则是保障程序的清晰性,增强程序的健壮性,而又谨慎地避免过度设计。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容

  • 1 Self Encapsulate Field(自封装字段) 直接访问一个字段,会导致字段之间的的耦合关系过于笨...
    hklbird阅读 520评论 0 0
  • 重新组织数据 如果你看到一个数组的行为方式很像一个数据结构, 就可以使用 用对象取代数组 把数组变成对象, 从而使...
    rxdxxxx阅读 449评论 2 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 辍笔十余年,今年终于又开始写文字了!无关其他,只因在文字的世界里才更清楚的看见自己的内心! 高中时期的我,对文字有...
    And行行阅读 717评论 2 4
  • 1玛莎 2练习主动被动 两人一组,一人原地被动,另一人主动的动关节,被动的人可以自由一点点,根据动可以影响其他部位...
    又见定阅读 156评论 0 0