.
  • 最新新闻
  • 安卓手机app开发用什么软件_app开发_大鱼科技
    搅局者来了,他叫小程序(微信、支付宝),也叫直达服务(小米)。江湖的玩法变了。 右下角的墨迹天气,是工具类App里的老炮,用户每天开一次、每次瞅一眼的打开方式,让他很头疼。「这怎么卖广告?」 为了挣钱,他在【天气】下面放了一坨新闻,还搞了个【时景】的UGC体系,提升停留时长。又在【我】的页面放了一堆广告入口。
  • 制作手机app大概费用多少钱_app开发_大鱼科技
    有时为了突出名称的意义,可能会跟品牌不一致,但网民搜索又可能搜索不到,这时关键字优化就很重要了,核心优化点在于:内容描述中必须包含核心关键字,并获得较好排名,如搜索『简历』,你的简历相关的小程序是否比较靠前。
  • 开发一个app需要多少钱费用_app开发_大鱼科技
    微信的表情雨让中国人的社交充满了人情味儿。当你在对话框输入“么么哒”或者“想你了”,聊天页面会掉下相应的表情雨,成为大多情侣互传情愫的标准动作。中国传统情人节日“七夕节”已至,情侣们在微信“秀恩爱”的方式又多了一种——黄金红包。
  • 什么是小程序_小程序开发需要多少钱_app开发_大鱼科技
    什么是小程序:小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不关心是否安装太多应用的问题。应用将无处不在,随时随地可用,但又无需安装卸载。
  • 看牌器 透视在哪里买_app开发_大鱼科技
    这个微信小程序的创意始于2012年,当时仅仅开发了Win平台桌面应用,随着移动互联网发展,开发技术栈难度降低
  • 做一个平台app需要多少钱_app开发_大鱼科技
    访问次数:昨日访问小程序内所有页面总次数,多个页面之间的跳转、同一页面的重复访问计为多次访问。 访问人数:昨日访问小程序内所有页面的总用户数,同一用户多次访问不重复计。 新访问用户数:首次访问小程序页面的用户数,同一用户多次访问不重复计。
  • 一天能赚2万的黑方法_app开发_大鱼科技
    没深思小程序最近一个月内更新7次背后是微信内部前所未有的力度在支持小程序(公众号都不曾有此殊遇),特别是微信刚公布2017年Q1月活账号破9.38亿。面对如此巨大的流量洼地,我们如何借助小程序来低成本/0成本获取用户?
  • 网赌破解器哪里下载_app开发_大鱼科技
    小程序定位 对于公司而言,小程序究竟是一个什么产品定位?以目前的大环境而言,无非就是几个关键点: 蹭一波热点,吸引眼球,做小程序这件事情本身就是一个吸引眼球的事情; 延伸产品线,对已有产品线做一个开辟,确保整个线的完整性; 借助小程序,赶上这趟车,营销导流;
  • 定制一款app大概需要多少钱_app开发_大鱼科技
    很多人不禁要对此举的意义发问:以微信的算法而出的搜索结果,岂不是严重遏制了新生小程序的后来者居上?这样即使定义了关键词,对推广而言并没有实质性的意义?微信官方自然也想到了与之相辅相成的策略,我们甚至可以认为后来的这步棋才是微信的本来目的。那就是于6月中旬首次出现于人们视野中的「搜索关键词广告」
  • 软件外包公司_app开发_大鱼科技
    代码的复杂度是评估一个项目的重要标准之一。较低的复杂度既能减少项目的维护成本,又能避免一些不可控问题的出现。然而在日常的开发中却没有一个明确的标准去衡量代码结构的复杂程度,大家只能凭着经验去评估代码结构的复杂程度,比如,代码的程度、结构分支的多寡等等。当前代码的复杂度到底是个什么水平?什么时候就需要我们去优化代码结构、降低复杂度?这些问题我们不得而知。 因此,我们需要一个明确的标准去衡量代码的复杂度。
  • 热门新闻
软件外包公司_app开发_大鱼科技
时间:2021-01-30 08:57:23
软件外包公司_app开发_大鱼科技

背景代码的复杂度是评估一个项目的重要标准之一。较低的复杂度既能减少项目的维护成本,又能避免一些不可控问题的出现。然而在日常的开发中却没有一个明确的标准去衡量代码结构的复杂程度,大家只能凭着经验去评估代 ...

 

 

 

背景

代码的复杂度是评估一个项目的重要标准之一。较低的复杂度既能减少项目的维护成本,又能避免一些不可控问题的出现。然而在日常的开发中却没有一个明确的标准去衡量代码结构的复杂程度,大家只能凭着经验去评估代码结构的复杂程度,比如,代码的程度、结构分支的多寡等等。当前代码的复杂度到底是个什么水平?什么时候就需要我们去优化代码结构、降低复杂度?这些问题我们不得而知。

因此,我们需要一个明确的标准去衡量代码的复杂度。

衡量标准

Litmus 是我们团队建设的一个代码质量检测系统,目前包括代码的风格检查、重复率检查以及复杂度检查。litmus 采用代码的 Maintainability(可维护性)来衡量一个代码的复杂度,并且通过以下三个方面来定义一段代码的 Maintainability 的值:

  • Halstead Volume(代码容量)

  • Cyclomatic Complexity(圈复杂度)

  • Lines of Code(代码行数)

根据这三个参数计算出 Maintainability,也就是代码的可维护性,公式如下:

Maintainability Index = MAX(0,(171 - 5.2 * ln(Halstead Volume) - 0.23 * (Cyclomatic Complexity) - 16.2 * ln(Lines of Code))*100 / 171)

代码行数不做赘述,下面我们具体介绍代码容量、圈复杂的含义以及它们的计算原理

Halstead Volume(代码容量)

代码的容量关注的是代码的词汇数,有以下几个基本概念

参数

含义

n1

Number of unique operators,不同的操作元(运算子)的数量

n2

Number of unique operands,不同的操作数(算子)的数量

N1

Number of total occurrence of operators,为所有操作元(运算子)合计出现的次数

N2

Number of total occurrence of operands,为所有操作数(算子)合计出现的次数

Vocabulary

n1 + n2,词汇数

length

N1 + N2,长度

Volume

length * Log2 Vocabulary,容量

一个例子

function tFunc(opt) {

let result = opt + 1;

return result;

}

// n1:functionlet,=,+,return

// n2:tFunc,opt,result,1

// N1: functionlet,=,+,return

// N2:tFunc,opt,result,opt,1,result

// Vocabulary = n1 + n2 = 9

// length = N1 + N2 = 11

// Volume = length * Log2 Vocabulary = 34.869

Cyclomatic Complexity(圈复杂度)

概念

圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准。由托马斯·J·麦凯布(Thomas J. McCabe, Sr.)于1976年提出,用来表示程序的复杂度,其符号为VG或是M。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和 维护。程序的可能错误和高的圈复杂度有着很大关系。

如何计算

 


如果在控制流图中增加了一条从终点到起点的路径,整个流图形成了一个闭环。圈复杂度其实就是在这个闭环中线性独立回路的个数。

 

 


如图,线性独立回路有:

 

  • e1→ e2 → e

  • e1 → e3 → e

所以复杂度为2

对于简单的图,我们还可以数一数,但是对于复杂的图,这种方法就不是明智的选择了。

计算公式

V(G) = e – n + 2 * p

  • e:控制流图中边的数量(对应代码中顺序结构的部分)

  • n:代表在控制流图中的判定节点数量,包括起点和终点(对应代码中的分支语句)

    • ps:所有终点只计算一次,即使有多个 return 或者 throw

  • p:独立组件的个数

几种常见的语句控制流图

 

 

一个例子

code

function test(index, string) {

let returnString;

if (index == 1) {

if (string.length < 2) {

return '分支1';

}

returnString = "returnString1";

} else if (index == 2) {

if (string.length < 5) {

return '分支2';

}

returnString = "returnString2";

} else {

return '分支3'

}

return returnString;

}

flow-chart

flow-chart


flow-graph

flow-graph


计算

 

e(边):9

n(判定节点):6

p:1

V = e - n + 2 * p = 5

如何优化

主要针对圈复杂度

大方向:减少判断分支和循环的使用

(下面某些例子可能举的不太恰当,仅用以说明这么一种方法)

提炼函数

// 优化前,圈复杂度4

function a (type) {

if (type === 'name') {

return `name:${type}`;

} else if (type === 'age') {

return `age:${type}`;

} else if (type === 'sex') {

return `sex:${type}`;

}

}

// 优化后,圈复杂度1

function getName () {

return `name:${type}`;

}

function getAge () {

return `age:${type}`;

}

function getSex () {

return `sex:${type}`;

}

表驱动

// 优化前,圈复杂度4

function a (type) {

if (type === 'name') {

return 'Ann';

} else if (type === 'age') {

return 11;

} else if (type === 'sex') {

return 'female';

}

}

// 优化后,圈复杂度1

function a (type) {

let obj = {

'name': 'Ann',

'age': 11,

'sex': 'female'

};

return obj[type];

}

简化条件表达式

// 优化前,圈复杂度4

function a (num) {

if (num === 0) {

return 0;

} else if (num === 1) {

return 1;

} else if (num === 2) {

return 2;

} else {

return 3;

}

}

// 优化后,圈复杂度2

function a (num) {

if ([0,1,2].indexOf(num) > -1) {

return num;

} else {

return 3;

}

}

简化函数

// 优化前,圈复杂度4

function a () {

let str = '';

for (let i = 0; i < 10; i++) {

str += 'a' + i;

}

return str

}

function b () {

let str = '';

for (let i = 0; i < 10; i++) {

str += 'b' + i;

}

return str

}

function c () {

let str = '';

for (let i = 0; i < 10; i++) {

str += 'c' + i;

}

return str

}

// 优化后,圈复杂度2

function a (type) {

let str = '';

for (let i = 0; i < 10; i++) {

str += type + i;

}

return str

}

检测工具

  1. 本地检测:es6-plato

    npm install --save es6-plato

    es6-plato -r -d report ./

  2. litmus 质量检测中心

    该系统由我们团队开发,目前仅限美团点评公司内部使用,系统部分截图如下

 

首页

首页

 

 

首页项目总览

首页项目总览

 

 

详情页-总览

详情页-总览

 

 

详情页-代码复杂度检测详情

详情页-代码复杂度检测详情

 

 

详情页-代码复杂度检测详情

详情页-代码复杂度检测详情

 

 

详情页-代码复杂度检测详情

详情页-代码复杂度检测详情