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. macos - mac下docker如何设置代理2. boot2docker无法启动3. nignx - docker内nginx 80端口被占用4. docker网络端口映射,没有方便点的操作方法么?5. docker - 如何修改运行中容器的配置6. docker - 各位电脑上有多少个容器啊?容器一多,自己都搞混了,咋办呢?7. 在mac下出现了两个docker环境8. dockerfile - 我用docker build的时候出现下边问题 麻烦帮我看一下9. docker不显示端口映射呢?10. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!