首页 > 解决方案 > 带有声纳的Java:降低方法的复杂性

问题描述

public Meteo getMeteoTorneo() {
    
    Meteo meteo = new Meteo(cittaString);
    
    Document doc = null;
    try {
        doc = Jsoup.connect("https://www.ilmeteo.it/meteo/" + torneo.getCitta()).get();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Elements newsHeadlines = doc.getElementsByTag("li");
    for (Element headline : newsHeadlines) {
        if (headline.text().split(" ").length > 2) {
            String tmax = headline.getElementsByClass("tmax").text();
            String tmin = headline.getElementsByClass("tmin").text();
            String giorno = headline.getElementsByTag("span").first() != null ? headline.getElementsByTag("span").first().text() : "";
            boolean rain  = headline.getElementsByClass("s flag_pioggia").isEmpty();
            boolean nuvoloso  = headline.getElementsByClass("s ss3").isEmpty();
            boolean sole  = headline.getElementsByClass("s ss1").isEmpty();
            if(controllaTemp(tmin, tmax))
                continue;

            if((controllaData() && (giorno.split(" ")[1].equals(""+torneo.getData().getDayOfMonth())))){
                    if(!rain)
                        meteo.setT("1");
                    else if(!nuvoloso)
                        meteo.setT("2");
                    else if(!sole)
                        meteo.setT("3");
                    meteo.settMin(tmin);
                    meteo.settMax(tmax);
                    
                }
            
        }
    }
    return meteo;

}

你好,这个方法有问题。Sonar 告诉我将其认知复杂度从 21 减少到允许的 15,但我不知道我必须做什么,因为我什么都不能删除。你能建议点什么吗?谢谢

标签: java

解决方案


您不需要删除任何内容,您可以在方法中提取“for”内部的信息,如下所示:

public Meteo getMeteoTorneo() {

    Meteo meteo = new Meteo(cittaString);

    Document doc = null;
    try {
        doc = Jsoup.connect("https://www.ilmeteo.it/meteo/" + torneo.getCitta()).get();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Elements newsHeadlines = doc.getElementsByTag("li");
    for (Element headline : newsHeadlines) {
        if (headline.text().split(" ").length > 2) {
            updateMeteo(headline, meteo)
        }
    }
    return meteo;
}

private void updateMeteo(Element headline, Meteo meteo) {
    String tmax = headline.getElementsByClass("tmax").text();
    String tmin = headline.getElementsByClass("tmin").text();
    String giorno = headline.getElementsByTag("span").first() != null ? headline.getElementsByTag("span").first().text() : "";
    boolean rain  = headline.getElementsByClass("s flag_pioggia").isEmpty();
    boolean nuvoloso  = headline.getElementsByClass("s ss3").isEmpty();
    boolean sole  = headline.getElementsByClass("s ss1").isEmpty();
    if(controllaTemp(tmin, tmax))
        return;

    if((controllaData() && (giorno.split(" ")[1].equals(""+torneo.getData().getDayOfMonth())))){
        if(!rain)
            meteo.setT("1");
        else if(!nuvoloso)
            meteo.setT("2");
        else if(!sole)
            meteo.setT("3");
            meteo.settMin(tmin);
            meteo.settMax(tmax);          
    }
}

现在,如果您查看它,该meteo对象将始终设置相同的变量(T、Min 和 Max)。所以可能更好地获取这三个元素并将它们设置在最后(使用一个Tuple3或者更好的是,你自己的类)


推荐阅读