本文緊接
使用重構移除丑陋的if else代碼(1)。
使用Enum替換int常量
這一步比較簡單,先創建一個enum類:
package de.jingge.refactoring;
public enum SystemState {
LOGGEDIN,
LOGGEDOUT,
IDLE;
}
然后開始重構SystemManager, 使用SystemState代替SystemManager里的int狀態:
1. 添加 import static de.jingge.refactoring.SystemState.*;
2. 刪除所有的integer常量
3. 將變量state的類型改為SystemState.
代碼如下:
package de.jingge.refactoring;
import static de.jingge.refactoring.SystemState.*;
public class SystemManager {
SystemState state;
public void login() {
// call service#login()
updateState(LOGGEDIN);
}
public void logout() {
// call service#logout()
updateState(LOGGEDOUT);
}
public void idle() {
// call some other services
updateState(IDLE);
}
public void updateState(SystemState state) {
if (state == LOGGEDIN) {
// do something after logging in is successful,
// for example: show welcome dialog, open the last edit document, etc.
} else if (state == LOGGEDOUT) {
// do something after logging out is successful,
// for example: free used resource, dispose GUI components, etc.
} else if (state == IDLE) {
// do something after the user is idle,
// for example: save the application state temporarily, lock the application, etc.
} else {
throw new IllegalArgumentException("unknown state");
}
this.state = state;
}
}
然后重構測試類:
1. 添加import static de.jingge.refactoring.SystemState.*;
2. 刪除所有常量前引用的SystemManager.
package de.jingge.refactoring;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import static de.jingge.refactoring.SystemState.*;
public class SystemManagerTest {
private static SystemManager manager;
@BeforeClass
public static void setUpClass() throws Exception {
manager = new SystemManager();
// add some service mock objects
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Test
public void login() {
manager.login();
assertEquals(manager.state, LOGGEDIN);
}
@Test
public void logout() {
manager.logout();
assertEquals(manager.state, LOGGEDOUT);
}
@Test
public void idle() {
manager.idle();
assertEquals(manager.state, IDLE);
}
}
運行這個測試類->通過
下一篇文章
使用重構移除丑陋的if else代碼(3)開始處理if else hell
聲明:本文版權歸作者所有,如需轉載請注明出處。