java if else重构_使用重构移除丑陋的if else代码-Java频道-中国IT实验室

本文介绍如何将一个充斥大量ifelse的系统状态管理类转变为更面向对象的设计,并通过编写测试用例确保重构过程的安全。作者以实际项目为例,演示如何利用设计模式简化SystemManager类,降低维护难度。
摘要由CSDN通过智能技术生成

我们知道因为编程语言的限制,历史遗留下来的系统总是有很多的毛病,不够面向对象,尤其是很多系统滥用if else.我曾经见过一个项目,大家基本上就是写一个方法,然后在里面if else套if esle得嵌套了好几层,难看就不必说了,这种代码根本就没法维护。

今天我就使用从实际项目中提炼出来的例子来讲解一下如何将这类代码变得更加面向对象 - 重构成模式并且添加测试代码,

先来看一个丑陋的类:

packagede.jingge.refactoring;publicclassSystemManager {publicstaticfinalintLOGGEDIN=0;publicstaticfinalintLOGGEDOUT=1;publicstaticfinalintIDLE=2;intstate;publicvoidlogin() {//call service#login()updateState(LOGGEDIN);

}publicvoidlogout() {//call service#logout()updateState(LOGGEDOUT);

}publicvoididle() {//call some other servicesupdateState(IDLE);

}publicvoidupdateState(intstate) {if(state==LOGGEDIN) {//do something after logging in is successful,//for example: show welcome dialog, open the last edit document, etc.}elseif(state==LOGGEDOUT) {//do something after logging out is successful,//for example: free used resource, dispose GUI components, etc.}elseif(state==IDLE) {//do something after the user is idle,//for example: save the application state temporarily, lock the application, etc.}else{thrownewIllegalArgumentException("unknown state");

}this.state=state;

}

}

这里我们展示了一个 SystemManager,它负责处理用户在系统中的状态:登入(logged in),登出(logged out),以及空闲(idle)。从代码中可以看到,这个类用了int来定义状态并且因此导致了updatteState()方法里面出现大量if else.从目前看来这些if else是无法避免的,应为这个类需要针对不同的状态作出反应。随着状态的增加,if else的数量也会继续增加。这个解决方案显然很差。

那么怎么样才能让这个类更加地面向对象呢?

在处理面向对象之前,我们首先要编写一个测试类,这也是处理这类历史遗留下来代码所必需做的第一步,只有在测试代码的保护下,我们才能放心大胆地进行重构。

初步的测试代码如下:

packagede.jingge.refactoring;importorg.junit.AfterClass;importorg.junit.BeforeClass;importorg.junit.Test;importstaticorg.junit.Assert.*;publicclassSystemManagerTest {privatestaticSystemManager manager;

@BeforeClasspublicstaticvoidsetUpClass()throwsException {

manager=newSystemManager();//add some service mock objects}

@AfterClasspublicstaticvoidtearDownClass()throwsException {

}

@Testpublicvoidlogin() {

manager.login();

assertEquals(manager.state, SystemManager.LOGGEDIN);

}

@Testpublicvoidlogout() {

manager.logout();

assertEquals(manager.state, SystemManager.LOGGEDOUT);

}

@Testpublicvoididle() {

manager.idle();

assertEquals(manager.state, SystemManager.IDLE);

}

}

运行测试代码->通过。

[1]

【责编:Chuan】

--------------------next---------------------

packagede.jingge.refactoring;importorg.junit.AfterClass;importorg.junit.BeforeClass;importorg.junit.Test;importstaticorg.junit.Assert.*;publicclassSystemManagerTest {privatestaticSystemManager manager;

@BeforeClasspublicstaticvoidsetUpClass()throwsException {

manager=newSystemManager();//add some service mock objects}

@AfterClasspublicstaticvoidtearDownClass()throwsException {

}

@Testpublicvoidlogin() {

manager.login();

assertEquals(manager.state, SystemManager.LOGGEDIN);

}

@Testpublicvoidlogout() {

manager.logout();

assertEquals(manager.state, SystemManager.LOGGEDOUT);

}

@Testpublicvoididle() {

manager.idle();

assertEquals(manager.state, SystemManager.IDLE);

}

}

--------------------next---------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值