问题描述
ESLint 报告了令人难以忍受的高复杂性。我想知道为什么它太复杂了?如果我只是将它拆分为多个功能会发生什么 - 性能好吗?据我所知,我们总是必须编写缩小的代码,所以如果我们将其拆分为多个函数,它将消耗更多空间(位)和更多执行时间?
以及处理此代码段的最佳做法是什么。
const getWeekType = (f,d,e) => {
const y = moment(),a = moment(f),i = moment(d);
if (d && f && i.diff(a,'days') <= 8 && y.diff(a,'days') < 8 && y.diff(a,'days') >= 0) {
return { weekNum: 0,dayNum: y.diff(a,'days') };
}
if (f && y.diff(a,'days') >= 0 && y.diff(a,'days') < 8 && (!d || i.diff(a,'days') > 8)) {
return { weekNum: 1,'days') };
}
if (d && !f && i.diff(y,'days') >= 0 && i.diff(y,'days') < 8) {
return { weekNum: 2,dayNum: 6 - i.diff(y,'days') };
}
if ((!f || y.diff(a,'days') > 8) && (!d || i.diff(y,'days') > 8)) {
let d = y.diff(f ? a : moment(e),'days');
for (; d > 7; ) d -= 7;
return { weekNum: 3,dayNum: d };
}
};
解决方法
两个问题:
- 变量名毫无意义
- 多次调用
diff
重复
我真的不知道代码应该做什么,但这里是它可能是什么样子的草图:
const getWeekType = (start,end,alternative) => {
const now = moment(),startMoment = moment(start),endMoment = moment(end),days = endMoment.diff(startMoment,'days'),daysPast = now.diff(startMoment,daysFuture = endMoment.diff(now,'days');
if (end && start && days <= 8 && daysPast >= 0 && daysPast < 8) {
return { weekNum: 0,dayNum: daysPast };
}
if (start && daysPast >= 0 && daysPast < 8 && (!end || days > 8)) {
return { weekNum: 1,dayNum: daysPast };
}
if (end && !start && daysFuture >= 0 && daysFuture < 8) {
return { weekNum: 2,dayNum: 6 - daysFuture };
}
if ((!start || daysPast > 8) && (!end || daysFuture > 8)) {
let dayNum = start ? daysPast : now.diff(moment(alternative),'days');
return { weekNum: 3,dayNum: dayNum % 7 };
}
};