switch(clean code)
程序员文章站
2022-05-21 08:12:03
...
看了《clean code》 关于 switch ,很有感触,给大家分享分享
首先 有这样的例子:
Payroll 这个对象 需要 根据 员工的不同来计算他们的工资,所以有这样的一个方法,返回 Money 用switch来区别type 然后做不同处理,这样也无可厚非。但是仔细想 确实是有问题的,首先雇员的类别有可能增加,那么这个switch 需要修改,而且会有 诸如isPayday(Employee e, Date date), 或 deliverPay(Employee e, Money pay) 这样的结构出现。确实是很头痛的事情。
看看书上是怎样 解决的
使用工厂模式创建对象,创建不同对象,对于不同type的 区分,放到工厂下层,而不在上面体现,如此函数的 不同层级就很明确,而且使用Employee 抽象来完成 那几个动作。
设计 真的是体现了高手的 技术,层次,抽象,模型,这些虽然有时候仅仅没多少代码,但是都是精华,需要好好学习,像大师们学习。
首先 有这样的例子:
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 抽象来完成 那几个动作。
设计 真的是体现了高手的 技术,层次,抽象,模型,这些虽然有时候仅仅没多少代码,但是都是精华,需要好好学习,像大师们学习。
推荐阅读
-
JavaScript Switch 声明_基础知识
-
Mac开发-codesign_allocate: can't allocate code signature data
-
PHP 用switch return 返回值有关问题
-
hbase example code
-
遭遇 ORA-00600: internal error code, arguments: [4194] ORA-155
-
使用JavaScript switch case 另类写法_javascript技巧
-
Visual Studio Code快速删除空行及几个常用快捷键总结
-
php绘制图片失败,使用清除缓存ob_clean可以解决。
-
zookeeper入门 code
-
php:switch case 和 if else 的用法区别及运行效率详解