我正在使用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)