重构
文章平均质量分 77
Martin Flower 重构
CodeChecker
这个作者很懒,什么都没留下…
展开
-
C++ 设计模式
C++ 设计模式内容参考:《设计模式:可复用面向对象软件的基础》面向对象设计原则模板方法策略方法观察者模式装饰模式桥模式工厂方法抽象工厂原型模式构造器单件模式享元模式门面模式代理模式适配器中介者状态模式备忘录组合模式迭代器职责链命令模式访问器解析器总结...原创 2021-04-06 09:46:06 · 68 阅读 · 0 评论 -
C++ 设计模式 单件模式
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Singleton面向对象很好地解决了"抽象"的问题,但是必不可免地付出一定的代价,对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。“对象性能”模式典型模式:SingletonFlyweight动机(Motivation)在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中存在一个实例,才能确保它们的逻辑正确性,以及良好的效率。如果绕过常规的构原创 2021-05-17 20:22:41 · 183 阅读 · 0 评论 -
C++ 设计模式 享元模式
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Flyweight面向对象很好地解决了"抽象"的问题,但是必不可免地付出一定的代价,对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。“对象性能”模式典型模式:SingletonFlyweight动机(Motivation)在软件系统采用纯粹对象方案的问题在于大量细颗粒的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价如何在原创 2021-05-17 11:03:00 · 141 阅读 · 0 评论 -
C++ 设计模式 解析器
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Interpreter在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。典型模式:Interpreter动机(Motivation)在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构.原创 2021-05-16 20:24:32 · 194 阅读 · 0 评论 -
C++ 设计模式 访问器
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Visitor动机(Motivation)“行为变化”模式在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。典型模式:CommandVisitor示例要点总结...原创 2021-05-15 20:50:07 · 185 阅读 · 0 评论 -
C++ 设计模式 命令模式
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Command“行为变化”模式在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。典型模式:CommandVisitor成员函数一般分为两类,虚函数和非虚函数(或静态),非虚函数(或静态)是编译的时候以地址的形式直接绑定,虚函数是运行时通过虚函数指针进行绑定动机(Motivation)在软件构建过原创 2021-05-14 15:29:00 · 127 阅读 · 0 评论 -
C++ 设计模式 职责链
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Composite“数据结构”模式常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。典型模式CompositeIteratorChain of Resposibility动机(Motivation)在软件构建过程中,一个请求可能被原创 2021-05-14 15:12:47 · 447 阅读 · 1 评论 -
C++ 设计模式 迭代器
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Iterator“数据结构”模式常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。典型模式CompositeIteratorChain of Resposibility动机(Motivation)在软件构建过程中,集合对象内部结.原创 2021-04-29 17:36:44 · 141 阅读 · 0 评论 -
C++ 设计模式 组合模式
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Composite“数据结构”模式常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。典型模式CompositeIteratorChain of Resposibility动机(Motivation)示例要点总结...原创 2021-04-25 16:56:14 · 178 阅读 · 0 评论 -
C++ 设计模式 备忘录
以下内容均来自GeekBand极客班C++ 设计模式课程(李建忠老师主讲)Memento“状态变化”模式在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供一种解决方案。典型模式stateMemento动机(Motivation)在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需求,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象原创 2021-04-25 16:42:54 · 148 阅读 · 2 评论 -
C++ 设计模式 状态模式
State“状态变化”模式在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供一种解决方案。典型模式stateMemento动机(Motivation)在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生改变,不如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合。《设计模.原创 2021-04-23 20:01:11 · 162 阅读 · 0 评论 -
C++ 设计模式 中介者模式
Mediator“接口隔离”模式在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题,甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。典型模型Facade(门面模式)Proxy(代理模式)Adapter(适配器)Mediator(中介者)动机(Motivation)在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的..原创 2021-04-23 16:35:02 · 210 阅读 · 1 评论 -
C++ 设计模式 适配器
Adapter“接口隔离”模式在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题,甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。典型模型Facade(门面模式)Proxy(代理模式)Adapter(适配器)Mediator(中介者)动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的.原创 2021-04-23 15:20:43 · 94 阅读 · 0 评论 -
C++ 设计模式 代理模式
Proxy“接口隔离”模式在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题,甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。典型模型Facade(门面模式)Proxy(代理模式)Adapter(适配器)Mediator(中介者)动机(Motivation)在面对对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等,直接访问会给使用者,或者操作系统结构带来很多麻原创 2021-04-23 11:05:11 · 102 阅读 · 0 评论 -
C++ 设计模式 门面模式
Facade“接口隔离”模式在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题,甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。典型模型Facade(门面模式)Proxy(代理模式)Adapter(适配器)Mediator(中介者)动机(Motivation)示例要点总结...转载 2021-04-23 10:18:01 · 99 阅读 · 0 评论 -
C++ 设计模式 构建器
Builder“对象创建”模型通过“对象创建”模式绕开new,避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式Factory MethodAbstract FactoryPrototypeBuilder动机(Motivation)在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一原创 2021-04-22 21:01:26 · 520 阅读 · 3 评论 -
C++ 设计模式 原型模式
Prototype“对象创建”模型通过“对象创建”模式绕开new,避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式Factory MethodAbstract FactoryPrototypeBuilder动机(Motivation)在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客原创 2021-04-22 16:53:01 · 115 阅读 · 0 评论 -
C++ 设计模式 抽象工厂模式
Abstract Factory“对象创建”模型通过“对象创建”模式绕开new,避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式Factory MethodAbstract FactoryPrototypeBuilder动机(Motivation)和工厂方法非常类似,都是解决同一类问题在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。原创 2021-04-22 16:21:57 · 110 阅读 · 0 评论 -
C++ 设计模式 工厂模式
Facotry Method“对象创建”模型通过“对象创建”模式绕开new,避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式Factory MethodAbstract FactoryPrototypeBuilder动机(Motivation)在软件系统中,经常面临着常见对象的工作,由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“原创 2021-04-22 11:13:58 · 137 阅读 · 0 评论 -
C++ 设计模式 桥模式
Bridge“单一职责”模式:在软件组件的设计中,如果责任划分不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码(典型的Bad smell),这时候的关键是划分责任。典型模式:DecoratorBridge动机(Motivation)由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。现在有如下示例,一个多平台的消息系统示例class Messagerclass Messager{public:原创 2021-04-11 11:06:25 · 115 阅读 · 0 评论 -
C++ 设计模式 装饰模式
Decorator“单一职责”模式:在软件组件的设计中,如果责任划分不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码(典型的Bad smell),这时候的关键是划分责任。典型模式:DecoratorBridge动机(Motivation)在某些情况下,我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增加),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。原创 2021-04-08 17:16:15 · 156 阅读 · 0 评论 -
C++ 设计模式 观察者模式
Observer“组件协作”模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作模式”通过晚绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式:Template MethodStrategyObserver/Event动机(Motivation)在软件构建过程中,我们需要为某些对象建立一种“通过依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很原创 2021-04-07 21:54:43 · 117 阅读 · 0 评论 -
C++ 设计模式 策略模式
“组件协作”模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作模式”通过晚绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式:Template MethodStrategyObserver/Event...原创 2021-04-07 10:51:08 · 135 阅读 · 0 评论 -
C++ 设计模式 模板方法
Template Method动机(Motivation)在软件构建过程中,对于某一项任务,它常常有稳定的整体操作骨架结构,但各个子步骤却有很多改变的需求,或者由于固有原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。使用Template Method即可在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期需求?《设计模式》GOF定义:“定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类不改变(复用)一个算原创 2021-04-06 20:39:29 · 132 阅读 · 0 评论 -
C++ 设计模式 面向对象设计原则
C++ 设计模式 面向对象设计原则因为"变化"的存在,为软件设计带来了复杂性,那么如何解决?分解:分而治之,大问题分解为小问题 抽象:由于不能掌握全部的复杂对象,选择忽视它的非本质细节,而去处理泛化和理想化的对象模型。下面以画图为目的(图形工具),进行分解和抽象两种解决方案的演示:按照C++的编程规范,不同职责的类应该处于不同的文件中,而字段(成员变量)一般都是private类型,此处为了更方便的展示思想,会忽略部分编程规范。分解版本:class Pointc...原创 2021-04-06 11:04:18 · 141 阅读 · 0 评论 -
重构(Martin Fowler)——处理概括关系
有一批重构手法专门用来处理类的概括关系(继承关系),其中主要是将函数上下移动于继承体系中Pull Up Field 和 Pull Up Method都用于将特性向继承体系的上端移动Push Down Method 和 Push Down Field 则将特性向继承体系的下端移动构造函数比较难以向上拉动,因此专门有一个Pull Up Constructor Boby处理它我们不会将构造函数往下推,因为Replace Constructor with Factory Method通常更管用.原创 2021-03-05 21:15:10 · 360 阅读 · 0 评论 -
重构(Martin Fowler)——简化函数调用
在对象技术中,最重要的概念莫过于“接口”(interface)。容易被理解和被使用的接口,是开发良好面向对象软件的关键。最简单也最重要的一件事就是修改函数名称。名称是程序写作者与阅读者交流的关键工具。只要你理解一段程序的功能,应该大胆使用Rename Method将你所知道的东西传给其他人。函数参数在接口之中扮演十分重要的角色。Add Parameter 和 Remove Parameter都是很常见的重构手法。可以对参数列进行增删。如果同一个对象的多个值被当作参数传递,你可以运用P..原创 2021-02-24 16:44:32 · 628 阅读 · 0 评论 -
重构(Martin Fowler)——简化条件表达式
条件逻辑有可能十分复杂,因此本章提供一些重构手法,专门用来简化它们。其中一项核心重构就是Decompose Conditional将一个复杂的条件逻辑分成若干小块。本章的其余重构手法可用以处理另一些重要问题:如果你发现代码中的多处测试有相同的结果,应该实施Consolidate Conditional Expression如果条件代码中有任何重复,可以运用Consolidate Duplicate Conditional Fragments面对对象程序的条件表达式通常比较少,因为很多条件原创 2021-02-23 11:39:58 · 383 阅读 · 0 评论 -
重构(Martin Fowler)——重新组织数据
核心内容源于《重构 改善既有代码的设计》(Refactoring Improving the Design of Existing Code——Martin Fowler著)。本章将会介绍几个能够轻松处理数据都重构手法。Part1:关于“对象应该直接访问其中的数据,还是应该通过访问函数来访问数据”一直有争议,当需要通过函数去访问数据时,可使用Self Encapsulate FieldPart2:面对对象语言有一个很有用的特征:除了允许使用传统语言提供的简单数据结构类型,它们还允许你定义原创 2021-02-19 17:53:16 · 441 阅读 · 0 评论 -
重构(Martin Fowler)——在对象之间搬移特性
核心内容源于《重构 改善既有代码的设计》(Refactoring Improving the Design of Existing Code——Martin Fowler著)。初衷Martin Fowler设计本章的目的是为了称述,把责任放置在合适的地方。常常使用Move Method和Move Field简单地移动对象行为,就可以简单解决这些问题。如果这两个重构方法都需要用到,那么首先使用Move Field,再使用MoveMethod。一个类往往会因为承担过多的责任而变得臃肿不堪。这种.原创 2021-02-17 19:38:16 · 142 阅读 · 0 评论 -
重构(Martin Fowler)——重新组织函数
核心内容源于《重构 改善既有代码的设计》(Refactoring Improving the Design of Existing Code——Martin Fowler著)。1.1Extract Method(提炼函数)将一段代码组织并独立出来示例:原创 2021-02-14 12:46:16 · 358 阅读 · 0 评论