switch(clean code)

阅读更多
看了《clean code》 关于 switch ,很有感触,给大家分享分享
首先 有这样的例子:
public Money calculatePay(Employee e)   throws InvalidEmployeeType {  
 switch (e.type) {     
  case COMMISSIONED:       
    return calculateCommissionedPay(e);     
  case HOURLY:        
    return calculateHourlyPay(e);     
  case SALARIED:        
    return calculateSalariedPay(e);      
  default:        
    throw new InvalidEmployeeType(e.type);  
  }  
} 

Payroll  这个对象 需要 根据 员工的不同来计算他们的工资,所以有这样的一个方法,返回 Money  用switch来区别type 然后做不同处理,这样也无可厚非。但是仔细想 确实是有问题的,首先雇员的类别有可能增加,那么这个switch 需要修改,而且会有 诸如isPayday(Employee e, Date date), 或 deliverPay(Employee e, Money pay)   这样的结构出现。确实是很头痛的事情。

看看书上是怎样 解决的
public abstract class Employee { 
   public abstract boolean isPayday();  
   public abstract Money calculatePay();  
   public abstract void deliverPay(Money pay); 
 }
  
 public interface EmployeeFactory {   
 public Employee makeEmployee(EmployeeRecord r) throws   InvalidEmployeeType;  
} 

public class EmployeeFactoryImpl implements EmployeeFactory{         

  public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {    
   switch (r.type) {        
     case COMMISSIONED:          
       return new CommissionedEmployee(r) ;       
     case HOURLY:         
       return new HourlyEmployee(r);      
     case SALARIED:     
        return new SalariedEmploye(r);   
      default:         
         throw new InvalidEmployeeType(r.type);      
    }  } 
 }  
} 


使用工厂模式创建对象,创建不同对象,对于不同type的 区分,放到工厂下层,而不在上面体现,如此函数的 不同层级就很明确,而且使用Employee 抽象来完成 那几个动作。
设计 真的是体现了高手的 技术,层次,抽象,模型,这些虽然有时候仅仅没多少代码,但是都是精华,需要好好学习,像大师们学习。

你可能感兴趣的:(employee,calculatepay,switch,clean,code)