学习笔记三

手写代码时,我们往往会遵照一些比较成熟的代码指标标准来约束代码(比如:圈复杂度,参数个数,嵌套层次等),以提高质量(可参见本公众号文章:谈代码指标)。在模型开发时,是否有对应的约束呢?分享一篇国内模型开发大佬老胡的文章:


多年来,一直建议软件开发的时候做到KISS(Keep It Simple, Stupid),但好像多数工程师对KISS没啥兴趣,经常做出来非常复杂的模型,圈复杂度300多的模型我见过,圈复杂度600多的模型我也见过,圈复杂度800多的模型我还见过。这篇公众号文章我有意选择了一个或许能激发KISS愿望的图片,期待能给大家带来一点改变。

不得不说,ISO 26262的发布,让越来越多的工程师开始关注模型的圈复杂度了,这是好事,利国利民的好事!ISO 26262中有关代码和建模标准中有一条,叫做“Enforcement of low complexity”。正是这条规则让汽车行业的模型开发工程师们开始关注圈复杂度这个指标了。

于是,我们开始被问到:

——怎么计算模型的圈复杂度?

——模型的圈复杂度多大合适?

——如何降低模型的圈复杂度?等等。

好,下面我来大概说说这些问题。

圈复杂度的概念

圈复杂度用于衡量一个模块判定结构的复杂程度,数量上表现为独立线性路径的条数。圈复杂度的数据等于满足判定全覆盖所需要的测试用例的个数。


图片发自简书App


以上面这段控制流图为例,有一种非常简单的计算圈复杂度的方法,就是数出图中节点间的连线把整个平面划分为多少个区域,这段控制流图我们数下来整个平面被分成了7个部分,那么它的圈复杂度就是7。

我们再看,如果我们在测试的时候,要做到判定全覆盖,则需要如下测试用例:

1) N1-N2-N3-N6-N9

2) N1-N2-N5-N6-N9

3) N1-N2-N5-N8-N9

4) N1-N4-N5-N6-N9

或者N1-N4-N5-N8-N9

5) N1-N4-N8-N9

6) N1-N4-N7-N8-N9

7) N1-N7-N8-N9

注:假设1号节点用N1表示,2号节点用N2表示,….。

以上7个测试用例,可以满足圈复杂度为7的模块判定全覆盖。

圈复杂度对开发活动的影响

复杂度对于开发活动的影响是多方面的,我试着来说一下看,有不完善的地方,也希望朋友们补充。

首先看可测性,圈复杂度提出的初衷主要是为了评价软件的可测性。从上述图例我们也可以看到,如果我们在测试过程中要求做到判定覆盖率100%覆盖,那么我们需要的测试用例个数就是圈复杂度的数值。如果圈复杂度过高,无疑会给单元测试带来很大麻烦,且不说写这么多测试用例本身就是一件非常繁杂的事情,这么多的测试用例对于后期的维护和管理也非常困难。

再看设计难度,高复杂度模块的可设计性也会大打折扣,但有一点,算法的不同描述方式,我们能够应对的复杂程度应该是不同的。比如,同样是复杂度为50的模块,如果分别使用汇编语言、C语言、图形化语言来描述,开发难度可想而知。图形化设计可以应对更高的复杂度,但不是说可以无限制的提高复杂度,至于什么样的复杂度合适,我认为这是一个经验值,适合你开发团队的才是最好的。需要强调一点,选择不同的描述形式,对于模块单元测试的可测性没有改变。

再就是高复杂度对于可维护性的影响,我们开发产品,不可能做到“一次发布再无变更”,更多情况下,我们会面临非常频繁的变更,过于复杂的模型,我们很难应对各种变更,“牵一发而动全身”的尴尬可能很多人已经深有体会。

高复杂度的这些害处不难理解,如何降低复杂度这是越来越多的开发者正在关心的问题,降低复杂系统的复杂度没有捷径,模块化,将复杂的系统分解为若干个模块,保证分解后的模块都不复杂即可,而模块化的原则我们都非常熟悉:高内聚、低耦合。

方法和原则非常简单,但实施这个过程却并不简单,这需要基于足够深入的需求分析,这需要足够长的时间去完成,而目前很多公司的开发过程中,需求分析过程花费的时间实在太少。没有足够深入的需求分析,就难以对复杂系统做出合理的划分,后续的工作只会越来越麻烦,甚至有公司因为模型过于复杂而被迫重新设计。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 性能测试概念 a)响应时间 是用户提交一个请求,系统从开始呈现到将所有信息都呈现到客户端所需要的时间。 以一个we...
    sammy911阅读 688评论 0 1
  • 1.软件开发概述 软件生命周期软件生命周期:软件的产生到报废的整个过程软件生命周期内有:问题定义,可行性分析,总体...
    寒桥阅读 593评论 0 0
  • 五、Deep Learning的基本思想 假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,...
    dma_master阅读 1,616评论 1 2
  • 此系列文章均整理、精简自pluto-y大神的博客,感谢大神~ 一、随便聊聊年前到现在大部分时间都在整理和抽象之前项...
    Azen阅读 497评论 3 1
  • 朋友圈是什么。 它是微信上的一个社交功能,用户可以通过朋友圈发表文字和图片,也可以通过其它软件将文章或者音乐分享到...
    小G微思维阅读 326评论 0 0