欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

switch(clean code)

程序员文章站 2022-05-21 08:12:03
...
看了《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 抽象来完成 那几个动作。
设计 真的是体现了高手的 技术,层次,抽象,模型,这些虽然有时候仅仅没多少代码,但是都是精华,需要好好学习,像大师们学习。