首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

复建之switch惊悚现身

2013-11-15 
重构之switch惊悚现身??未重构之前的代码?public class Employee{private int _typestatic final int ENG

重构之switch惊悚现身

?

?

未重构之前的代码

?

public class Employee

{

private int _type;

static final int ENGINEER = 0;

static final int SALESMAN = 1;

static final int MANAGER = 2

Employee(int type)

{

_type = type;

}

?

int payAmout()

{

switch (_type){

? case ENGINEER:

? return 1;

? case SALESMAN:

? return 2;

? case MANAGER:

? return 3;

? default:

? throw new RuntimeException("error");

}

}

?

?

}

?

第一步,我们进行自封装字段,代码变为:

?

public class Employee

{

private int _type;

static final int ENGINEER = 0;

static final int SALESMAN = 1;

static final int MANAGER = 2;

?

Employee(int type)

{

setType(type);

}

?

int payAmout()

{

switch (getType()){

? case ENGINEER:

? return 1;

? case SALESMAN:

? return 2;

? case MANAGER:

? return 3;

? default:

? throw new RuntimeException("error");

}

}

void setType(int type)

{

_type = type;

}

int getType()

{

return _type;

}

?

?

}

?

第二步,我们增加间接层

public abstract class EmployeeType {

abstract int getTypeCode();

?

}

?

第三部,创建间接层子类

?

public class Engineer extends EmployeeType {

?

int getTypeCode(){

return Employee.ENGINEER;

}

?

}

?

?

public class Manager extends EmployeeType {

?

int getTypeCode() {

return Employee.MANAGER;

}

?

?

}

?

public class SalesMan extends EmployeeType

{

? ? ? ?int getTypeCode()

? ? ? ?{

? ? ? ? ? return Employee.SALESMAN;

? ? ? ?}

?

}

?

?

第四步,用声明的间接层去替换Employee中的类型码成员变量

?

public class Employee

{

EmployeeType _type;

static final int ENGINEER = 0;

static final int SALESMAN = 1;

static final int MANAGER = 2;

?

Employee(int arg)

{

setType(arg);

}

?

int payAmout(int arg)

{

switch (arg){

? case ENGINEER:

? return 1;

? case SALESMAN:

? return 2;

? case MANAGER:

? return 3;

? default:

? throw new RuntimeException("error");

}

}

void setType(int arg)

{

switch(arg){

?

case ENGINEER:

_type = new Engineer();

break;

case MANAGER:

_type = new Manager();

break;

case SALESMAN:

_type = new SalesMan();

break;

default:

throw new RuntimeException("code error");

?

}

}

int getType()

{

return _type.getTypeCode();

}

?

?

}

?

第五步,建立一个工厂函数,来生产EmployeeType实例

public abstract class EmployeeType {

abstract int getTypeCode();

?

static final int ENGINEER = 0;

static final int SALESMAN = 1;

static final int MANAGER = 2;

static EmployeeType newType(int code)

{

switch(code){

case ENGINEER:

? ?return new Engineer();

case SALESMAN:

return new SalesMan();

case MANAGER:

return new Manager();

default:

throw new RuntimeException("wrongcode");

}

}

?

}

?

第六步,去掉Employee当中的类型码

?

?

public class Employee

{

EmployeeType _type;

?

Employee(int arg)

{

setType(arg);

}

?

int payAmout()

{

switch (getType()){

? case EmployeeType.ENGINEER:

? return 1;

? case EmployeeType.MANAGER:

? return 2;

? case EmployeeType.SALESMAN:

? return 3;

? default:

? throw new RuntimeException("error");

}

}

void setType(int arg)

{

_type = EmployeeType.newType(arg);

}

int getType()

{

return _type.getTypeCode();

}

?

}

?

第七步,将payAmout函数提到它应该在的地方

?

?

public abstract class EmployeeType {

abstract int getTypeCode();

?

static final int ENGINEER = 0;

static final int SALESMAN = 1;

static final int MANAGER = 2;

static EmployeeType newType(int code)

{

switch(code){

case ENGINEER:

? ?return new Engineer();

case SALESMAN:

return new SalesMan();

case MANAGER:

return new Manager();

default:

throw new RuntimeException("wrongcode");

}

}

?

int payAmout()

{

switch (getTypeCode()){

? case ENGINEER:

? return 1;

? case MANAGER:

? return 2;

? case SALESMAN:

? return 3;

? default:

? throw new RuntimeException("error");

}

}

?

}

?

第八步,将payAccout声明为abstract,然后各子类分别实现这个方法

public class Engineer extends EmployeeType {

?

int getTypeCode(){

return ENGINEER;

}

int payAccount(){

return 2;

}

}

?

?

?

public class Manager extends EmployeeType {

?

int getTypeCode() {

return MANAGER;

}

int payAccount()

{

return 3;

}

?

}

?

?

?

public class SalesMan extends EmployeeType {

?

int getTypeCode() {

return SALESMAN;

}

int payAccount()

{

return 1;

}

}

?

第九步,修改Employee的payAccount函数

?

?

public class Employee

{

EmployeeType _type;

?

Employee(int arg)

{

setType(arg);

}

?

int payAmout()

{

return _type.payAccount();

}

void setType(int arg)

{

_type = EmployeeType.newType(arg);

}

int getType()

{

return _type.getTypeCode();

}

?

}

?

?

?

?

?

?

热点排行