`

重构之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();

}

 

}

 

 

 

 

 

 

分享到:
评论

相关推荐

    代码到底该如何重构?.doc

    **switch惊悚现身**:大量的switch语句可能表明需要使用多态来替换,以提高代码的灵活性。 ### 4. 重构策略 - 使用单元测试作为安全网,确保重构过程中不破坏现有功能。 - 遵循小步快跑的原则,每次重构一小部分,...

    重构-改善既有代码的设计

    3.10 Switch Statements(switch惊悚现身) 82 3.11 Parallel InheritanceHierarchies(平行继承体系) 83 3.12 Lazy Class(冗赘类) 83 3.13 Speculative Generality(夸夸其谈未来性) 83 3.14 ...

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

    3.10 Switch Statements(switch惊悚现身) 3.11 Parallel InheritanceHierarchies(平行继承体系) 3.12 Lazy Class(冗赘类) 3.13 Speculative Generality(夸夸其谈未来性) 3.14 Temporary Field(令人迷惑的暂时...

    9-重构1

    Switch Statements(switch 惊悚现身)可能导致大量条件分支,可以利用策略或工厂模式简化。Parallel Inheritance Hierarchies(平衡继承体系)指的是两个或更多类层次结构的平行关系,可以考虑合并。Lazy Class...

    重构:改善既有代码的设计(中文版).

    3.10 SwitchStatements(switch惊悚现身)82 3.11 ParallelInheritanceHierarchies(平行继承体系)83 3.12 LazyClass(冗赘类)83 3.13 SpeculativeGenerality(夸夸其谈未来性)83 3.14 TemporaryField(令人迷惑...

    重构:改善既有代码的设计(中文高清版)

    3.10 SwitchStatements(switch惊悚现身)82 3.11 ParallelInheritanceHierarchies(平行继承体系)83 3.12 LazyClass(冗赘类)83 3.13 SpeculativeGenerality(夸夸其谈未来性)83 3.14 TemporaryField(令人迷惑...

    重构-改善既有代码的设计 中文版

    3.10 Switch Statements(switch惊悚现身) 3.11 Parallel Inheritance Hierarchies(平行继承体系) 3.12 Lazy Class(冗赘类) 3.13 Speculative Generality(夸夸其谈未来性) 3.14 Temporary Field(令人迷惑的...

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

    3.10 SwitchStatements(switch惊悚现身)82 3.11 ParallelInheritanceHierarchies(平行继承体系)83 3.12 LazyClass(冗赘类)83 3.13 SpeculativeGenerality(夸夸其谈未来性)83 3.14 TemporaryField(令人迷惑...

    重构_改善既有代码的设计

     3.10 SwitchStatements(switch惊悚现身)82  3.11 ParallelInheritanceHierarchies(平行继承体系)83  3.12 LazyClass(冗赘类)83  3.13 SpeculativeGenerality(夸夸其谈未来性)83  3.14 TemporaryField...

    重建——改善既有代码的设计

    3.10 SwitchStatements(switch惊悚现身)82 3.11 ParallelInheritanceHierarchies(平行继承体系)83 3.12 LazyClass(冗赘类)83 3.13 SpeculativeGenerality(夸夸其谈未来性)83 3.14 TemporaryField(令人迷惑...

Global site tag (gtag.js) - Google Analytics