素材牛VIP会员
代码重复求改进方法
 岛***疤  分类:Java代码  人气:1179  回帖:8  发布于6年前 收藏
    @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来枚举,没写以减少无关代码

讨论这个帖子(8)垃圾回帖将一律封号处理……

Lv4 码徒
大***咒 JAVA开发工程师 6年前#1

楼上说的提取公共方法简单实用,一楼的答案太高深,需要好好琢磨一下

Lv6 码匠
无***圣 职业无 6年前#2

可以试试模板设计模式吧,将通用的算法提取到父类中,不同的地方交给子类重写。如果这样的地方少些,还是提取一个公共方法,比较省事。

Lv6 码匠
捂***功 移动开发工程师 6年前#3

网站上大牛就是多

Lv1 新人
非***扰 交互设计师 6年前#4

你的代码是要创建Option类,适合使用工厂方法重构。

//方法参数尽量少于3个,3个以上时建议使用组合对象
class OptionParam {
    private String type;
    private ReportType reportType;
    private Integer diviceId;
    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;
    }

}

@Component
class TrafficChartOptionFactory extends AbstractOptionFactory {


    @Override
    List<ChartData> getData(OptionParam optionParam) {
        return chartDao.getTrafficChartData(optionParam.getReportType(),
                optionParam.getDiviceId(),
                optionParam.getDirection());
    }

    @Override
    String getSubtitle(OptionParam optionParam) {
        return Titlehelper.gettrafficSubText(
                optionParam.getReportType().getReportTime(),
                optionParam.getDiviceId(),
                optionParam.getDirection());
    }
}

@Component
class AmmeterChartOptionFactory extends AbstractOptionFactory {

    @Override
    List<ChartData> getData(OptionParam optionParam) {
        return chartDao.getAmmeterDataChartData(optionParam.getReportType(), optionParam.getDiviceId());
    }

    @Override
    String getSubtitle(OptionParam optionParam) {
        return Titlehelper.gettrafficSubText(optionParam.getReportType().getReportTime(),
                optionParam.getDiviceId(),
                1);
    }
}

使用工厂方法的好处就不多说了,具体可以阅读我的博客

Lv7 码师
封***榜 职业无 6年前#5
  FlyObj.factory = function(type, option) {
    if(type){
      try{
        return new FlyObj[type](option);
      }catch(e){
        console.log(e);
        console.log( "无法找个----"+type+"----这个构造函数,请添加正确的构造函数——————(函数名错误)");
        return false;
      }
    }
  };
这样应该能缩短工厂函数
Lv3 码奴
te***es 产品经理 6年前#6
@Override
public Option getTrafficChartOption(String type, ReportType reportType, Integer deviceId, Integer direction) {        
    return buildOption(Titlehelper.getChartTitle(reportType), 
                       Titlehelper.getTrafficSubText(reportType.getReportTime(),deviceId,direction), 
                       chartDao.getTrafficChartData(reportType,deviceId,direction));
}

@Override
public Option getAmmeterChartOption(String type, ReportType reportType, Integer deviceId) {        
    return buildOption(Titlehelper.getChartTitle(reportType), 
                       Titlehelper.getTrafficSubText(reportType.getReportTime(),deviceId,1), 
                       chartDao.getAmmeterDataChartData(reportType,deviceId));
}

private Option buildOption(String title, String subtitle, List<ChartData> data) {
    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;        
}
Lv2 入门
th***as 职业无 6年前#7
        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;

这几行提取出来放在一个方法里调用不就行了

Lv1 新人
编***魔 职业无 6年前#8

楼上说的可行,提取公共部分封装成一个公共方法。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取