SonarQube显示认知复杂性错误,即使只有7个循环



我正在使用SonarQube检查我的代码。我收到以下问题。

重构此方法,将其认知复杂度从21降低到允许的15。

但是我的方法只包含7个循环。随信附上代码。

private void LayoutTouch(int touchType, int index) {
if (touchType != -1) { //+1
try {
ViewConfiguration vc = ViewConfiguration.get(ctContext);
mSlop = vc.getScaledTouchSlop();
parentLayout[index]
.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v,
MotionEvent event) {
if(!isValidEvent()){ //+2
return false;
}
if(checkTouchIndex(index)){ //+3
try{

// Code here
if (animationStarted) { //+4
return false;
}
final ViewConfiguration vc = ViewConfiguration
.get(getContext());
final int deltaX = (int) (event.getX() + 0.5f)
- mGestureCurrentX;

initiateVelocityTracker();
mVelocityTracker.addMovement(event);
mVelocityTracker
.computeCurrentVelocity(1000);
if(!doSwitchAndNeedToReturn(v, event, index, vc, deltaX)) // +5
return false;
}catch(Exception e){ //+6
setTouchProgressIndex(-1);
}finally{
setTouchProgressIndex(-1);
}
}
return false;
}
});
} catch (Exception e) { //+7
Log.e("Testing","Exception "+ e);
}
}
}

为什么我得到这个问题。请帮我一下。

我同意SonarQube的观点,认为代码过于复杂。

简化:

  • 组合if语句
  • 使用lambda
  • (这里没有这样做)为lambda代码使用额外的方法

:

private void LayoutTouch(int touchType, int index) {
if (touchType != -1) { //+1
try {
ViewConfiguration vc = ViewConfiguration.get(ctContext);
mSlop = vc.getScaledTouchSlop();
parentLayout[index]
.setOnTouchListener((v, event) -> {
if (isValidEvent() && checkTouchIndex(index)) {
try{

// Code here
if (animationStarted) { //+4
return false;
}
final ViewConfiguration vc = ViewConfiguration
.get(getContext());
final int deltaX = (int) (event.getX() + 0.5f)
- mGestureCurrentX;

initiateVelocityTracker();
mVelocityTracker.addMovement(event);
mVelocityTracker
.computeCurrentVelocity(1000);
if (!doSwitchAndNeedToReturn(v, event, index, vc, deltaX)) // +5
return false;
} catch(Exception e) { //+6
setTouchProgressIndex(-1);
} finally {
setTouchProgressIndex(-1);
}
}
return false;
});
} catch (Exception e) { //+7
Log.e("Testing","Exception "+ e);
}
}
}

额外的方法:

.setOnTouchListener(this::onTouch);
private boolean onTouch(View v,  MotionEvent event) {
...
}

检查异常处理非常不具体。如果没有特定的异常可以发生,可能会删除它(在最后)。

使用以前缀m命名的成员变量在java中是不习惯的。这些变量看起来确实很多,但对于鼠标,触摸等等,这可能是有意义的。我之所以提到这一点,是因为这些计算似乎是可重构的。

但是我的方法只包含7个循环

Sonar告诉你这个方法很难理解(认知复杂性)。我同意这些标准。复杂性不是线性增长的,这就是为什么它是+1,+2,+3,+4 +5 +6 +7 = 28>21 .

作为一名开发人员,我真的希望这段代码被清理干净。以下是一些建议:

  • 将OnTouchListener提取到一个类中(无论是否是内部的)

  • 将初始检查更改为守卫条件,并提前返回

  • 检查为什么你在finally和exception中做同样的事情。setTouchProgressIndex(-1)

相关内容

  • 没有找到相关文章

最新更新