如何重构JS代码将认知复杂度从16降低至SonarQube要求的15?
重构方案
原代码认知复杂度超标的核心原因是存在两段完全重复的「非空判断+循环遍历+内部条件匹配」逻辑,重复的嵌套分支拉高了整体复杂度。我们可以通过抽离公共逻辑、简化语法的方式降低复杂度,优化后代码如下:
(function () { // 抽离公共的分类匹配逻辑 function getMatchedCategory(arr) { if (!arr) return null const matchedItem = arr.find(item => Utils.categoryMap[item.slug]) return matchedItem ? Utils.categoryMap[matchedItem.slug] : null } window.dm = window.dm || { AjaxData: [] }; window.dm.AjaxEvent = function (et, d, ssid, ad) { dm.AjaxData.push({ et, d, ssid, ad, }); window.DotMetricsObj && DotMetricsObj.onAjaxDataUpdate(); }; const d = document; const h = d.getElementsByTagName('head')[0]; const s = d.createElement('script'); let t = 'inews'; s.type = 'text/javascript'; s.async = true; // 优先匹配分类列表 const categoryMatch = getMatchedCategory(window.PageContext.categories) if (categoryMatch) { t = categoryMatch } else { // 分类列表无匹配时倒序匹配面包屑 const breadcrumbMatch = getMatchedCategory(window.PageContext.post?.breadcrumbs?.reverse()) if (breadcrumbMatch) t = breadcrumbMatch } }()); export default () => { };
核心优化点
- 抽离重复逻辑:将两处完全相同的遍历匹配逻辑封装为独立函数,主流程中仅需两次函数调用即可完成赋值,大幅减少嵌套层级和重复判断带来的复杂度增量
- 简化循环逻辑:用数组原生
find方法替代手动for循环+break的写法,语法更简洁,同时减少了循环内部分支带来的复杂度累加 - 简化非空判断:用可选链
?.替代多层级的&&非空判断,进一步降低逻辑复杂度
修改后代码逻辑和原有功能完全一致,认知复杂度可降至15以下,满足SonarQube检测要求。
内容的提问来源于stack exchange,提问作者user1941537
相关产品推荐
相关产品推荐

