`

类之间的重构

阅读更多

转自:http://yaotiebing.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3d%25e6%258a%2580%25e6%259c%25af%25e6%2596%2587%25e6%25a1%25a3

 

类之间的重构操作:

 

主要的内容就是分解庞大的类,合并不负责任的类,在类间搬移值域和函数。

1.   MoveMethod你的程序中,有个函数与其所在的类意外的另一个类进行更多的交流,调用后者,或者背后者调用,说明这个函数可能不适合在这个类里面,适当的时候移动到适当的类里面。减少类之间的高度耦合。让类干净利索的完成系统交付的任务。看似简单,逐渐重构直到完善,没关系,这部分重构充斥在你整个开发过程中,所以你没有必要为不能恰当的移动函数而苦恼

2.   Move Field 搬移值域:道理通搬移函数,当你某个值域与其所在的类以外的另一个类有更多的交流时,考虑搬移这个值域。这个操作很可能就是搬移Method的一部分

3.   Extract class 提炼类:就是分解类,将类中的部分值域函数搬移到一个新类里面,显然这个类做个太多的工作,包含不属于她范围内,或者类太大需要拆分。一个类应该很明确的抽象处理一些明确的责任,,如果类中的某些函数经常同事变化彼此相依,那么就考虑将他们分离出去。写到这里感觉类间的设计大部分还是根据经验开始的时候尽量明确责任,设计合理的类,随着功能的增加或者需求的变化在开发过程中逐步完善。

4.   Inline class 内嵌类: 你的某个class 没有做太多的事情,可以合并到,经常调用这个类的类中

5.   Hide delegate 隐藏委托关系: 这部分复杂一些,首先要区分sever client class

看个例子:manager = john.getdepatment().getmanager();  这里面 manager 就是client 类,而john.getdepatment()返回的部门类 就是server类,隐藏委托关系就是在johh类里面建一个函数getmanager()方法,隐藏对server类(depatment类)的调用 即:

public pserson getmanager()

{

         Return _department.getmanager();

}

那客户端类的调用就变成了: manager = john.getmanager() 看了少了什么就知道隐藏了什么。

也就是说尽量不要类的嵌套调用。

而我一般写代码都是这么设计: manager = department.getmanger(john). 需要好好理解一下设计思路,向组织靠拢

6.   Remove middle man (移除中间人操作),就是一个类做了太多的hide delegate操作,这个server类完全变成了一个中间人此时你应该让客户直接调用delegate 很难说清楚什么时候hide delegate 什么时候remove middle man 在系统运行过程中不断调整,随系统变化而变化就可以了

7.   Introduce foreign method 引用外加函数: 你所使用的server 类需要一个额外的函数,但是你不能修改这个类,那么在client类中(就是调用server类的类中)增加一个函数,并一个server class 实体作为第一引用参数,扩展server类的功能,请注意这个新加的函数是写在那个类里面了(client里面)

8.   Introduce local extension 引入本地扩展: 当原则7里面新增加的函数 被另外的多个类调用,那么就要考虑新加一个类,使他包含这些额外函数。这个本地扩展有两个方法:1.新加一个server类的子,同时为这个子类增加需要的函数   2外覆类(wrapper 其实就是新加一个类 然后在 Introduce foreign method

类间的搬移这部分就讲完了,养足精力 后面的部分就不容易理解了

分享到:
评论

相关推荐

    重构(Refactoring)英文版

    重构与设计模式之间存在着紧密的联系。设计模式提供了一套经过验证的解决方案集,而重构则是将这些解决方案应用于现有的代码中。在重构过程中,开发者可以根据设计模式的原则来优化代码结构,使之更加符合最佳实践。...

    27丨理论一:什么情况下要重构?到底重构什么?又该如何重构?1

    1. **大规模高层次重构(大型重构)**:关注于系统架构、模块设计、代码结构以及类之间的关系。重构手段包括分层、模块化、解耦和抽象可复用组件等,通常涉及大量代码改动,影响广泛,风险较高,需要深入理解和熟悉...

    重构改善既有代码的设计PPT课件

    通过重构,程序员能够更有效地管理代码,提升开发效率,减少错误,并促进团队成员之间的沟通。 首先,我们要明白重构的定义。重构是对软件内部结构的一种调整,它的目标是在不改变外部行为的前提下,提高代码的可...

    代码重构&模式

    3. **行为型模式**:如策略、模板方法、观察者、访问者、迭代器、责任链、命令、备忘录、状态、解释器模式,它们关注对象之间的交互和职责分配。 例如,**单例模式**确保一个类只有一个实例,并提供一个全局访问点...

    系统重构.pdf 侯捷

    - **移动字段(Move Field)**:将字段从一个类移动到另一个类,优化类之间的关系。 - **内联方法(Inline Method)**:将方法体直接替换为调用处的代码,减少函数调用带来的开销。 - **设计模式作为目标**:设计...

    java重构pdf书籍

    - **改变双向关联为单向(Change Bidirectional Association to Unidirectional)**:优化对象之间的依赖关系,减少耦合度。 - **改变引用对象为实值对象(Change Reference to Value)**:在某些场景下,将引用类型转换...

    代码重构源码(包含重构前后代码)

    在这样的代码中,可能会发现类与类之间的关系不清晰,职责分配不合理,或者存在过长的函数和过多的条件判断。重构的目标就是解决这些问题,使代码更加模块化,更易于理解和维护。 重构的第一步通常是识别可以改进的...

    重构中的源码,可能对照重构的书籍进行阅读

    2. **移动函数/变量**:如果一个函数或变量在不同类之间被频繁调用,可能需要考虑将其移到更合适的位置,以减少依赖和提高代码的封装性。 3. **内联函数/变量**:如果一个函数或变量仅在一个地方被使用,可以将其...

    重构那点事情

    - **IDE Refactor 功能**:大多数现代集成开发环境 (IDE) 都提供了重构功能,如物理重组与重命名 (Rename、Move),重新定义类之间的关系,转换匿名类 (Convert Anonymous Class),以及在类继承关系内移动成员 (Push ...

    [Groovy入门]第六讲.脚本重构为类,重构为MVC模式

    在某些情况下,为了提高代码的可维护性、可扩展性和复用性,我们可能需要将简单的脚本重构为类,甚至进一步采用MVC(Model-View-Controller)设计模式来组织复杂的应用程序。在这一讲中,我们将深入探讨如何进行这样...

    C语言重构--Garrido2000

    ### C语言重构——Garrido2000 #### 软件重构的重要性与背景 软件重构是软件开发过程中的一个重要组成部分,特别是在维护阶段。多年来,多项研究显示软件维护的成本通常高于开发成本(如Boehm 1975、Lientz & ...

    重构中错误代码

    可以通过引入中介者模式、策略模式等设计模式,降低类之间的耦合度,提高模块的独立性。 **未被充分利用的抽象**是另一个重构错误。如果一个抽象类或接口没有被足够的子类实现,或者没有足够的实例使用,那么这个...

    基于快速协同表示分类和组内预测重构系数向量l2范数的人脸识别算法.pdf

    本文介绍了一种基于快速协同表示分类和组内预测重构系数向量L2范数的人脸识别算法(FCRC_L2N),旨在解决传统协同表示分类算法(CRC_RLS)在人脸识别应用中的速度问题。 传统的协同表示分类算法,如CRC_RLS,通过...

    31天重构速成

    - **步骤**:识别中介类的作用,直接在源类和目标类之间建立联系。 30. **尽早返回(Return ASAP)** - **概述**:在方法中尽可能早地返回结果。 - **应用场景**:当方法执行过程中有提前结束的条件时。 - **步骤...

    重构教科书讲解ppt

    - **解决办法**:通过移动字段或方法,或者创建新的类来拆散它们,保持类之间的适当边界,降低耦合度。 5. **暂时值域 (Temporary Field)** - **问题**:对象的某个成员变量仅在特定情况下使用,增加了代码的复杂...

    重构与模式.pdf

    10. **引入中间类**(Introduce Middle Class):当两个类之间存在复杂的关系时,可以引入一个中间类来简化这种关系。 #### 五、如何结合重构与模式 1. **识别重构机会**:首先,要能够识别出代码中哪些部分可以...

Global site tag (gtag.js) - Google Analytics