读clean code有感,加上自己的一些心得,作此笔记。
写出只做一件事的switch语句很难,Switch天生要做N件事,不行我们总无法避免使用switch语句,不过还是能够确保每个switch都埋藏在较低的抽象层级,而且永远都不会重复。当然,我们利用多态来实现这一点。
请看下面的代码,它呈现了可能依赖于雇员类型的仅仅一种操作。
代码, Payroll.java:
public Money calculatePay(Employee e) thorws 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);
}
}
该函数有好几个问题,首先,太长,当出现新的雇员时,它还会更长,其次,明显做了不止一件事。第三,违反了单一权责原则,因为有好几个修改它的理由。第四,违反了开-关原则,因为每当添加新的类型时,就必须修改它。不过,该函数最麻烦的可能是到处皆有类似结构的函数。例如,可能会有:
isPayday(Employ e, Date date)
deliverPay(Employee e, Money pay)
该问题的解决方案是将switch语句埋到抽象工厂底下,不让任何人看到。该工厂使用switch语句为Employee的派生类创建适当的实体,而不同的函数,如calculatePay、isPayday和deliverPay等,则有Employee接口动态的接受派遣。
代码, Employee和工厂
public interface Employee{
public boolean isPayday();
public Money calculatePay();
public 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 SalariedEmployee(r);
default:
throw new InvalidEmployeeType(r.type);
}
}
}
这样,每当新增加一种职员的时候,就不用像清单一种去修改客CalculatePay()方法,同时添加新的"重复性的"实例方法,只需要新生成一个Employee的子类,并在工厂EmployeeFactoryImpl中添加一条新的返回类型就行,大大减少了耦合性。当然,这些都是视情况决定的。
分享到:
相关推荐
maven-clean-plugin-3.1.0.jar
Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project
--svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrupted”。 解决此问题所需文件 2. 为了方便命令行执行,将sqlite3.exe放到svn 项目的主目录下,和.svn目录同级...
java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 ...能够让JAR包里面的文件依赖于统一版本的类文件。...
目录结构--clean: 清洗框架主目录 ---rules: 存放各级别的规则函数 ---tool_data: 存放黑名单词典,每行一个词 ---run_dist.py: 主运行文件,构造dataloader, 加载黑名单 ---single_filter.py: run_dist.py所调用的...
如果您喜欢clean-code-dotnet项目或对您有帮助, clean-code-dotnet星号 :white_medium_star: 该存储库。 这不仅有助于增强我们的.NET社区,而且可以提高全球.NET开发人员的原始代码技能。 非常感谢你 :thumbs_up: ...
maven-clean-plugin-2.5.jar
maven-clean-plugin-2.4.1.jar maven-clean-plugin-2.4.1.jar maven-clean-plugin-2.4.1.jar
这些只是准则,仅此而已,但它们是由Clean Code的作者在多年的集体经验中整理而成的。 我们的软件工程技术只有50多年的历史了,我们仍然学到很多东西。 当软件体系结构与体系结构本身一样古老时,也许我们将要遵循...
npm install -g less-plugin-clean-css 然后在命令行上 lessc file.less --clean-css="--s1 --advanced --compatibility=ie8" 见的可用命令选项-唯一的区别是advanced和rebase ,我们默认为false,因为它并不总是...
clean-css是针对平台和的快速高效CSS优化。 根据它是最好的之一。 目录Node.js版本支持clean-css需要Node.js 6.0+(在Linux,OS X和Windows上测试)安装npm install --save-dev clean-css利用var CleanCSS = require...
Clean Code - A Handbook of Agile Software Craftsmanship 一书的注释 指数 小事很重要。 上帝在细节中。 我们所做的 80% 或更多的事情被古怪地称为“维护”:行为或修理。 他们向我们介绍了 Total Productive ...
在"clean-code-main"这个压缩包中,我们可以期待找到一系列按照书中的章节结构编排的.md文件,每个文件可能对应书中的一节或一个主题。以下是对《干净的代码》中关键知识点的详细解释: 1. **命名约定**:好的命名...
gulp-clean-css 插件,使用缩小CSS 关于问题 这只是一个简单的插件,这意味着它只不过是clean-css的薄包装。 如果您遇到CSS相关问题,请联系 。 仅在看起来插件本身有问题时才创建一个新问题。 安装 npm install ...
在这个名为"Everything-about-Clean-Code"的存储库中,我们可以期待找到与这本书相关的各种资源和讨论,帮助我们深入理解和实践Clean Code的原则。 首先,让我们来看看Clean Code的核心概念: 1. **命名的艺术**:...
然后更新博客的主要_config.yml ,将主题设置为clean-blog : # Extensions ## Plugins: http://hexo.io/plugins/ ## Themes: http://hexo.io/themes/ theme: clean-blog 配置 菜单 菜单在主题的_config.yml配置。...
eslint-plugin-clean-regex 一个ESLint插件,用于编写更好的正则表达式。关于这是一个插件,用于对JavaScript正则表达式进行。 它的目的是通过指出错误并提出改进建议,帮助初学者和专家编写更好的正则表达式。 该...
这迫使开发者写出更简洁、更明确的代码,并确保代码的正确性。 六、代码审查 定期进行代码审查,团队成员互相检查代码,可以发现潜在的问题,提升整体代码质量。 七、持续集成/持续部署(CI/CD) 通过自动化流程...
Clean Code 作者多年经验的结晶。 我们的软件工程行业只有短短的 50 年, 依然有很多要我们去学习。 当软件架构与建筑架构一样古老时, 也许我们将会有硬性的规则去遵守。 而现在, 让这些指南做为你和你的团队生产...
gem "bulma-clean-theme" 并将此行添加到您的Jekyll网站的_config.yml : theme : bulma-clean-theme 然后执行: $ bundle 或自己安装为: $ gem install bulma-clean-theme 用法 页数 将页面创建为单独的降价...