java - 带有声纳的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,但我不知道我必须做什么,因为我什么都不能删除。你能建议点什么吗?谢谢
解决方案
您不需要删除任何内容,您可以在方法中提取“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
或者更好的是,你自己的类)
推荐阅读
- arduino - 为arduino重写SdFat中的行
- concurrency - 线性化和静态一致性有什么区别?
- configuration - 如何更改 zpool 的默认 zfs 选项?
- javascript - TypeScript:使用动态导入的工厂模式不允许构造对象的新实例以进行组合
- vue.js - 在 vuejs 中使用 axios 方法处理错误
- arrays - 反应我如何多映射值以提高效率
- google-cloud-platform - Terraform - 创建 Google Cloud SQL 实例不起作用
- python - Python 3.7.0 - 结构 calcsize、错误或功能?
- android - 如何在同一时间线android中播放多个视频?
- html - 我们可以从 Angular 应用程序中排除 tsconfig.spec.json