面向对象语言开发过程中对于switch语句是很敏感的,大多数switch基本都可以通过多态方式进行重构,从而使程序获得较好的拓展能力,最近项目开发中遇到这样一个案例,在此分享一下。
重构前程序
public void update(Request newReq){ Request existReq=dao.getExist(); Type _type=newReq.getMsgType();//Type为枚举类型 ... switch (_type) { case A_MSG: existMsg = methodA(existReq); case B_MSG: existMsg = methodB(existReq, newReq); case C_MSG: if(...) {existReq = methodA(existReq);} else { existReq=methodB(existReq, newReq);} }
dao.update(existReq); }
根据重构一般原则需要对_type进行抽象并建立继承关系,这里命名基类为MsgType
public abstract MsgType{ protected Request methodA(Request existReq, Request newReq) { ... } protected Request methodB(Request existReq) { ... } public abstract Request changeRequest(Request existReq, Request newReq); }
然后针对各Msg类型建立相应子类,并实现changeRequest方法
public AMsgType extends MsgType{ public Request changeRequest(Request existReq, Request newReq){ return super.methodA(); } }
public BMsgType extends MsgType{ public Request changeRequest(Request existReq, Request newReq){ return super.methodB(); } }
之后创立一个工厂方法,注意,这里仍然有一个switch,因为我们需要根据msgType来创建相应的type类。
public class MsgTypeFactory { public static MsgType createMsgType(Request newReq) { switch (newReq.getMsgType()) { case A_MSG: return new AMsgType(); case B_MSG: return new BMsgType(); case C_MSG: return new CMsgType(); default: throw new RuntimeException("不兼容消息类型:"+newReq.getMsgType()); } } }
工具已经齐备,可以向原程序开炮了,重构后程序如下:
public void update(Request newReq){ Request existReq=dao.getExist(); MsgType msgType=MsgTypeFactory.createMsgType(newReq); //根据不同消息类型做不同作更新操作 existReq=msgType.changeRequest(existReq, newReq); dao.update(existReq); }
之前还对factory里面的switch方法耿耿于怀,以为重构前功尽弃,但是仔细一想,其实现在的程序已经完成了service层的解耦,当有一个新Msg类型添加的时候只需要增加相应的子类,在工厂方法配制一下就可以了,同样当对某个msg变更处理策略时也可以控制在很小的修改范围。
据此,我的结论是:重构过程不是一个教条的过程,或许最后还是没办法完全消灭switch,但是重构的目的达到了就已经算是成功。
相关推荐
【标题】: "软件设计模式与重构大作业-心算大师游戏" 【描述】: 这是一个关于软件设计模式和重构的项目,具体是为西南科技大学的学生设计的心算大师游戏。游戏采用Java语言开发,运行于Windows平台,旨在提高用户的...
本文将详细介绍这一方法论,并基于案例分析,深入探讨如何运用五步技能链来重构糟糕设计。 #### 二、重构的重要性 重构是软件开发过程中不可或缺的一部分,它不仅能够提高代码的质量,还能增强团队的协作效率。一...
第1章 重构,第一个案例 1 1.1 起点 1 1.2 重构的第一步 7 1.3 分解并重组statement() 8 1.4 运用多态取代与价格相关的条件逻辑 34 1.5 结语 52 第2章 重构原则 53 2.1 何谓重构 53 2.2 为何重构 ...
第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组statement() 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 2.2 为何重构 2.3 何时重构 2.4 怎么对经理说...
《重构:改善既有代码的设计》是一本深入探讨重构技术的书籍,作者通过实际案例阐述了重构的重要性及其实施方法。书中提到的第一个案例详细展示了如何逐步对一个名为`statement()`的函数进行重构,包括分解、重组...
《31天重构速成》是一本旨在通过实际案例来教授重构技巧的指南。 #### 二、知识点详解 **1. Encapsulate Collection(封装集合)** - **定义**:当类中的集合属性暴露在外时,可能会导致外部对象对其进行非法修改...
在31天的重构旅程中,你会学习到如何识别代码坏味道,如重复代码(Duplicate Code)、长方法(Long Method)和开关语句(Switch Statement)等,并学习相应的重构策略来解决这些问题。例如,可以使用提取方法(Extract ...
第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组Statemen 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 2.2 为何重构 2.3 何时重构 2.4 怎么对经理说 2.5 重构的...
为了更好地理解和应用重构技术,本系列文章将详细介绍31种实用的重构技巧,并结合实际案例进行解析。 #### 二、重构概述与重要性 重构是指在不改变软件外部行为的前提下,对代码进行修改的过程。这个过程旨在改善...
该书通过一系列具体案例与实践,详细介绍了31种重构技巧,旨在帮助软件开发者在31天内快速掌握并应用重构技能,从而提升编程效率与代码质量。 ### 重要性与目标 重构是软件开发过程中不可或缺的一部分,它涉及修改...
第1章 重构,第一个案例1 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组statement()8 1.4 运用多态取代与价格相关的条件逻辑34 1.5 结语52 第2章 重构原则53 2.1 何谓重构53 2.2 为何重构55 2.3 何时重构57 2.4 怎么...
第1章 重构,第一个案例1 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组statement()8 1.4 运用多态取代与价格相关的条件逻辑34 1.5 结语52 第2章 重构原则53 2.1 何谓重构53 2.2 为何重构55 2.3 何时重构57 2.4 怎么...
第1章 重构,第一个案例1 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组statement()8 1.4 运用多态取代与价格相关的条件逻辑34 1.5 结语52 第2章 重构原则53 2.1 何谓重构53 2.2 为何重构55 2.3 何时重构57 2.4 怎么...
开发者会使用控件(如Button和Label)以及事件驱动编程模型,结合`switch`语句或函数重载来实现不同运算。 3. **c#实现关机_注销_重启源代码**: 类似于定时关机程序,这个案例更进一步,不仅涉及关机,还包含了...
1. **C++基础语法**:包括变量声明、数据类型、控制流(if、switch、循环)、函数定义和调用等基本概念。这些是所有编程语言的基础,理解并熟练运用它们是编写任何程序的前提。 2. **面向对象编程(OOP)**:VC++...
第1章 重构,第一个案例 1.1 起点1 1.2 重构的第一步7 1.3 分解并重组statement()8 1.4 运用多态取代与价格相关的条件逻辑34 1.5 结语52 第2章 重构原则 2.1 何谓重构53 2.2 为何重构55 2.3 何时...
在本课程中,讲师通过一个实战案例展示了如何将一个简单的ID生成器代码进行重构,以提升其质量和可读性。这个ID生成器主要用于生成包含主机名、时间戳和随机字符的唯一标识字符串。课程分为四轮重构,每轮专注于解决...