java - 代码重复求改进方法
问题描述
@Override public Option getTrafficChartOption(String type, ReportType reportType, Integer deviceId, Integer direction) {Integer device = deviceId + 1010000;List<ChartData> data = chartDao.getTrafficChartData(reportType,device,direction);String title = Titlehelper.getChartTitle(reportType);String subtitle = Titlehelper.gettrafficSubText(reportType.getReportTime(),deviceId,direction);Option option = new Option();switch (type){ case 'bar':option = BarOption.BarOptionBuiler(title, subtitle, data);break; case 'line':option = LineOption.OptionBuilerhelp(title, subtitle, data);break; case 'pie':option = PieOption.PieOptionbuilder(title, subtitle, data);break;}return option; } @Override public Option getAmmeterChartOption(String type, ReportType reportType, Integer deviceId) {List<ChartData> data = chartDao.getAmmeterDataChartData(reportType,deviceId);String title = Titlehelper.getChartTitle(reportType);String subtitle = Titlehelper.gettrafficSubText(reportType.getReportTime(),deviceId,1);Option option = new Option();switch (type){ case 'bar':option = BarOption.BarOptionBuiler(title, subtitle, data);break; case 'line':option = LineOption.OptionBuilerhelp(title, subtitle, data);break; case 'pie':option = PieOption.PieOptionbuilder(title, subtitle, data);break;}return option; }
代码结构非常相似,只是dao层取数据不一样,另外这个switch有没有改进空间,我知道使用eumn来枚举,没写以减少无关代码
问题解答
回答1:你的代码是要创建Option类,适合使用工厂方法重构。
//方法参数尽量少于3个,3个以上时建议使用组合对象class OptionParam { private String type; private ReportType reportType; private Integer piceId; private Integer direction; //getter and setter}//Option抽象工厂,每个具体工厂都必须继承自抽象工厂public abstract class AbstractOptionFactory { @Autowired ChartDao chartDao; //希望具体工厂实现的方法,交于具体工厂实现 abstract List<ChartData> getData(OptionParam optionParam); abstract String getSubtitle(OptionParam optionParam); //公共逻辑代码,创建对象调用该方法 public Option create(OptionParam optionParam) {assert optionParam != null;assert optionParam.getReportType() != null;String type = optionParam.getType();List<ChartData> data = getData(optionParam);String title = Titlehelper.getChartTitle(optionParam.getReportType());String subtitle = getSubtitle(optionParam);Option option = new Option();switch (type) { case 'bar':option = BarOption.BarOptionBuiler(title, subtitle, data);break; case 'line':option = LineOption.OptionBuilerhelp(title, subtitle, data);break; case 'pie':option = PieOption.PieOptionbuilder(title, subtitle, data);break;}return option; }}@Componentclass TrafficChartOptionFactory extends AbstractOptionFactory { @Override List<ChartData> getData(OptionParam optionParam) {return chartDao.getTrafficChartData(optionParam.getReportType(),optionParam.getpiceId(),optionParam.getDirection()); } @Override String getSubtitle(OptionParam optionParam) {return Titlehelper.gettrafficSubText(optionParam.getReportType().getReportTime(),optionParam.getpiceId(),optionParam.getDirection()); }}@Componentclass AmmeterChartOptionFactory extends AbstractOptionFactory { @Override List<ChartData> getData(OptionParam optionParam) {return chartDao.getAmmeterDataChartData(optionParam.getReportType(), optionParam.getpiceId()); } @Override String getSubtitle(OptionParam optionParam) {return Titlehelper.gettrafficSubText(optionParam.getReportType().getReportTime(),optionParam.getpiceId(),1); }}
使用工厂方法的好处就不多说了,具体可以阅读我的博客
回答2:String title = Titlehelper.getChartTitle(reportType);String subtitle = Titlehelper.gettrafficSubText(reportType.getReportTime(),deviceId,1);Option option = new Option();switch (type){ case 'bar':option = BarOption.BarOptionBuiler(title, subtitle, data);break; case 'line':option = LineOption.OptionBuilerhelp(title, subtitle, data);break; case 'pie':option = PieOption.PieOptionbuilder(title, subtitle, data);break;}return option;
这几行提取出来放在一个方法里调用不就行了
回答3:可以试试模板设计模式吧,将通用的算法提取到父类中,不同的地方交给子类重写。如果这样的地方少些,还是提取一个公共方法,比较省事。
回答4:楼上说的可行,提取公共部分封装成一个公共方法。
回答5:楼上说的提取公共方法简单实用,一楼的答案太高深,需要好好琢磨一下
相关文章:
1. mysql - 数据库多表联合查询插入其他库2. 这是什么情况???3. node.js - JavaScript的一个不能理解的地方4. javascript - vue 2.0 @click.self 不触发5. html - [front-end]iOS 10下 viewport中user-scalable=no 无效,无法禁止用户缩放页面6. phpstudy v8打开数据库就出错,而phpstudy 2018不会7. angular.js - 在终端中用yeoman启用angular-generator报错,求解?8. 更新mysql中被别人锁定的行, 能不能快速失败直接报错, 而不是一直等待9. python - numpy.matrix如何进行单个数字的运算?10. php+mysql 根据ID 循环下载数据 每次下一笔
![html - [front-end]iOS 10下 viewport中user-scalable=no 无效,无法禁止用户缩放页面](http://www.haobala.com/attached/image/4.jpg)