`
JokerT
  • 浏览: 23114 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

switch方法重构案例

    博客分类:
  • Java
阅读更多


面向对象语言开发过程中对于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 为何重构 ...

    重构:改善既有代码的设计.[美]Martin Fowler.epub【文字版手机格式】

    第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组statement() 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 2.2 为何重构 2.3 何时重构 2.4 怎么对经理说...

    9-重构1

    《重构:改善既有代码的设计》是一本深入探讨重构技术的书籍,作者通过实际案例阐述了重构的重要性及其实施方法。书中提到的第一个案例详细展示了如何逐步对一个名为`statement()`的函数进行重构,包括分解、重组...

    31天重构速成_中文版.pdf

    《31天重构速成》是一本旨在通过实际案例来教授重构技巧的指南。 #### 二、知识点详解 **1. Encapsulate Collection(封装集合)** - **定义**:当类中的集合属性暴露在外时,可能会导致外部对象对其进行非法修改...

    31天重构指南 《31Days Refactoring》中文版

    在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天重构速成

    该书通过一系列具体案例与实践,详细介绍了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 怎么...

    《重构改善既有代码的设计(2010年版)》(Martin Fowler[美] 著,熊节 译)

    第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 怎么...

    五个完整C#案例源码

    开发者会使用控件(如Button和Label)以及事件驱动编程模型,结合`switch`语句或函数重载来实现不同运算。 3. **c#实现关机_注销_重启源代码**: 类似于定时关机程序,这个案例更进一步,不仅涉及关机,还包含了...

    vc++详细案例源码

    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 何时...

    35丨 实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”1

    在本课程中,讲师通过一个实战案例展示了如何将一个简单的ID生成器代码进行重构,以提升其质量和可读性。这个ID生成器主要用于生成包含主机名、时间戳和随机字符的唯一标识字符串。课程分为四轮重构,每轮专注于解决...

Global site tag (gtag.js) - Google Analytics