Maison  >  Questions et réponses  >  le corps du texte

java - Duplication de code et recherche de moyens de l'améliorer

    @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;
    }

La structure du code est très similaire, sauf que la couche dao récupère les données différemment. De plus, y a-t-il place à l'amélioration dans ce commutateur. Je sais qu'eumn est utilisé pour énumérer, mais je ne l'ai pas écrit pour réduire le code non pertinent

.
PHPzPHPz2712 Il y a quelques jours836

répondre à tous(5)je répondrai

  • 怪我咯

    怪我咯2017-05-17 10:06:56

    Votre code consiste à créer la classe Option, qui convient à la refactorisation à l'aide de méthodes d'usine.

    //方法参数尽量少于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;
        }
    
    }
    
    @Component
    class 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());
        }
    }
    
    @Component
    class 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);
        }
    }

    Je n'entrerai pas dans les détails sur les avantages de l'utilisation des méthodes d'usine. Vous pouvez lire mon blog pour plus de détails

    .

    répondre
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-17 10:06:56

            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;

    Extrayez simplement ces lignes et appelez-les dans une méthode

    répondre
    0
  • 迷茫

    迷茫2017-05-17 10:06:56

    Vous pouvez essayer le modèle de conception de modèle, qui extrait les algorithmes communs dans la classe parent et laisse différentes parties à la sous-classe pour la réécriture. S'il y a moins de tels endroits, il est plus facile d'extraire une méthode publique.

    répondre
    0
  • 高洛峰

    高洛峰2017-05-17 10:06:56

    Ce qui a été dit ci-dessus est réalisable, extrayez la partie publique et encapsulez-la dans une méthode publique.

    répondre
    0
  • ringa_lee

    ringa_lee2017-05-17 10:06:56

    La méthode d'extraction publique mentionnée ci-dessus est simple et pratique, mais la réponse au premier étage est trop profonde et doit être réfléchie attentivement

    répondre
    0
  • Annulerrépondre