【发布时间】:2015-10-22 15:09:09
【问题描述】:
我有以下方法:
private void setClientAdditionalInfo(Map map, Client client, User user) {
Map additionalInfo = (Map) map.get("additionalInfo");
if (checkMapProperty(additionalInfo, "gender")) {
client.setGender(additionalInfo.get("gender").toString());
}
if (checkMapProperty(additionalInfo, "race")) {
client.setRace(additionalInfo.get("race").toString());
}
if (checkMapProperty(additionalInfo, "ethnicity")) {
client.setEthnicity(additionalInfo.get("ethnicity").toString());
}
.....
还有 12 个 if 语句以类似的方式使用。唯一的区别是不同的 setter 方法名称和不同的参数。 现在,由于相同的模式一次又一次地重复,有没有办法降低代码复杂度?
【问题讨论】:
-
您可以创建一个映射
{"race": Client::setRace, ...}或使用反射来为字符串列表找到合适的设置器。不确定这是否会降低复杂性,但可能会减少重复。我想我会保持这种状态。最好想想“为什么要重复 15 次?”而不是想“这段代码到底在做什么?” -
一个可能值得问的问题:为什么您的信息会出现在地图中?难道您之前没有将您的信息存储在
Client中吗?通常答案是“不”,您必须硬着头皮,但有时您可以避免完全从地图中填充对象。 -
你的意思是“圈复杂度”还是“更少的代码行”?对 N 个事物的 for 循环可以增加 2^N 的圈复杂度,即使它可能看起来更好。对于如何改进不改变圈复杂度的代码,您会得到很多答案。
-
@djechlin 我需要先降低圈复杂度。但如果那不可能,我真的不想至少重复同样的事情。
-
@djechlin 你能把圈复杂度降低到低于输入的复杂度吗?如果你有 N 个独立属性的集合,这些属性要么存在要么不存在,这会给你
2^N不同的输入。
标签: java if-statement sonarqube cyclomatic-complexity