【发布时间】:2010-01-16 21:25:00
【问题描述】:
如果您在一个团队中,并且程序员为您提供了一个包含创建、读取、更新和删除方法的接口,您如何避免类型切换?
引用干净代码敏捷软件工艺手册:
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);
}
}
这个函数有几个问题。首先,它很大,而且是新的 添加员工类型,它会增长。其次,它非常清楚地做了不止一件事。 第三,它违反了单一职责原则 7 (SRP),因为改变的原因不止一个。第四,它违反了开放封闭原则8 (OCP),因为它必须在添加新类型时发生变化。但这可能是最糟糕的问题 功能是有无限数量的其他功能将具有相同的 结构体。例如我们可以有
isPayday(Employee e, Date date),
或
deliverPay(Employee e, Money pay),
或其他许多人。所有这些都具有相同的有害结构。
这本书告诉我使用工厂模式,但它让我觉得我不应该真正使用它。
再次引用这本书:
解决这个问题的方法(见清单 3-5)是将 switch 语句埋在 ABSTRACT FACTORY 的地下室,9 永远不要让任何人看到它。
switch语句丑吗?
【问题讨论】:
-
您可能想接受答案。
标签: switch-statement