我怎么能减少圈复杂度? [英] how could I reduce the cyclomatic complexity?
问题描述
每当我提到我正在处理的一段代码时,我得到这个函数的圈复杂度太高了。 (7)
。但我对如何以这种方式重写它有点困惑,所以它有效。
Whenever I lint a piece of code I'm working on I get the This function's cyclomatic complexity is too high. (7)
. But I'm a bit confused on how I could rewrite it in such way so it works.
这将是不断抛出该消息的函数:
This would be the function that keeps throwing that message:
function () {
var duration = +new Date() - start.time,
isPastHalf = Number(duration) < 250 && Math.abs(delta.x) > 20 || Math.abs(delta.x) > viewport / 2,
direction = delta.x < 0;
if (!isScrolling) {
if (isPastHalf) {
if (direction) {
this.close();
} else {
if (this.content.getBoundingClientRect().left > viewport / 2 && pulled === true) {
this.close();
return;
}
this.open();
}
} else {
if (this.content.getBoundingClientRect().left > viewport / 2) {
if (this.isEmpty(delta) || delta.x > 0) {
this.close();
return;
}
this.open();
return;
}
this.close();
}
}
}
我想听一些关于如何以这种方式构建代码的建议,以避免这种情况。
I would like to hear some advice on how I could structure my code in such way so I avoid this kind of situations.
推荐答案
那么你只有两个动作在你的代码中,但条件太多了。在条件中使用单个if-else语句和布尔运算符。如果这是不可能的,你至少可以
Well you have only two actions in your code, but much too many conditions. Use a single if-else-statement, and boolean operators in the condition. If that was impossible, you could at least
- 删除空行以在一个屏幕页面上获得完整逻辑
- 添加一些关于分支机构正在做什么的评论(及其原因)
- 避免提前退货
这是你的函数简化:
var duration = +new Date() - start.time,
isPastHalf = Number(duration) < 250 && Math.abs(delta.x) > 20 || Math.abs(delta.x) > viewport / 2,
isFarRight = this.content.getBoundingClientRect().left > viewport / 2,
direction = delta.x < 0;
if (!isScrolling) {
if (isPastHalf) {
if (direction)
this.close();
else {
if (isFarRight && pulled)
this.close();
else
this.open();
}
} else {
if (isFarRight) {
// Looks like the opposite of `direction`, is it?
if (this.isEmpty(delta) || delta.x > 0)
this.close();
else
this.open();
} else
this.close();
}
}
并缩短:
var duration = +new Date() - start.time,
isPastHalf = Number(duration) < 250 && Math.abs(delta.x) > 20 || Math.abs(delta.x) > viewport / 2,
isFarRight = this.content.getBoundingClientRect().left > viewport / 2,
direction = delta.x < 0,
undirection = this.isEmpty(delta) || delta.x > 0;
if (!isScrolling) {
if ( isPastHalf && ! direction && !(isFarRight && pulled)
|| !isPastHalf && !undirection && isFarRight )
this.open();
else
this.close();
}
这篇关于我怎么能减少圈复杂度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!