水人叹曰:
吾在家要打扫祭坛,出门要练怪抗血,现在又要我做研究编程序。连写带调一整天,bug总是不见少。老大,写程序这活真不是召唤物干的 AM曰:编程有那么难吗? 水人叹曰: 逻辑复杂兮,看得头大; 吾无魔法兮,理解不了; 召唤时间快到兮,吾要消失 AM曰: 前日教汝好函数之“一屏一函数”法则,今日再传你好函数标准2 水人追问:标准二为何? AM答曰:好函数代码复杂度低 水人又又问曰:何为代码复杂度? AM答曰:一段代码有几个执行路径,代码复杂度就是几 水人又又又问曰:可举例否? AM答曰:试问下面代码有几个执行路径 if (a=0) { printf("hi"); } 水人笑曰:两个执行路径。执行路径1打印“hi”,执行路径2啥也不作 AM答曰:是故该段代码的复杂度为2 水人又问曰:其他语句的代码如何计算复杂度? AM答曰:吾传汝代码复杂度心法,附耳上来 法则1: 代码没有任何条件语句、分支语句或循环语句,则复杂度=1 法则2: 代码中每遇到一个条件语句(if、elseif),复杂度+1,因为一个条件语句要么执行,要么不执行,故有两个执行路径 法则3: 代码中每遇到一个循环语句(for、while、repeat),复杂度+1,因为循环体内语句要么一次也不执行,要么至少执行一次,故有两个执行路径 法则4: 代码中每遇到一个分支语句(switch..case),有n个case,复杂度+n,因为分支语句的每个case都可能执行,故有n个执行路径 水人问曰:一函数复杂度多少为宜? AM答曰:必不能大于10,否则难于理解何调试 水人笑曰:AM谬矣!吾有一算法,功能要求众多,逻辑结构复杂,如何能保证复杂度<10。 AM答曰:须功能分解,提取子函数,将原来一个高复杂度函数实现的复杂功能分散到到若干低复杂度子函数中实现。各子函数实现的都是简单逻辑,函数组合共同实现复杂功能。 水人曰:善哉,“低复杂度函数”之目的实际是提醒程序员主动提取子函数,进行功能分解,从而实现功能模块化。 AM曰:孺子可教 |