最近有粉丝在后台给我留言,说新知识太多,“学不动了”。所谓温故而知新,今天我们就来重温下ABAP里的Code Inspector的用法。

2015年6月,我在SAP社区上写了一篇博客,介绍了ABAP Code Inspector里一些大家不常用的功能,在2016年SAP社区改版,所有文章阅读量清零之后,到现在仍然有17000多的点击量。

https://blogs.sap.com/2015/06/15/useful-tips-regarding-abap-code-inspector-that-you-may-not-know/

本文是Jerry英文博客翻译成中文的浓缩版,并且假定读者都知道如何使用SCI这个事务码。对ABAP Code Inspector还不熟悉的朋友,可以查阅我另一篇讲述其用法的博客:

A Small tip to get all transparent tables used in ABAP code

我们可以在ABAP Code Inspector的检查变体(Check Variant)里,根据自己的需要灵活地选择对ABAP代码进行哪种类型的扫描动作。

下图是一个例子,意思是对ABAP代码中所有对数据库表产生了读写访问之处,进行"Table Names from SELECT Statements"的扫描。该扫描的具体行为,可以点击蓝底白色的感叹号图片,以获得帮助文档。下图这个例子里勾取的选项,意思是检查被访问的数据库表,在SE11的ABAP字段里的Technical Settings是否正确被维护了,比如表的缓存类型是否设置正确。

Performance Check

Select-Statement can be transformed. X% of fields used - 检查内表字段的使用率

假设我们使用SELECT * 从一张表里读取数据到ABAP内表,然后在后续代码中只使用到了A个字段,而读取的表在SE11里总共有B个字段,那么A除以B的结果越小,说明读出来的内表字段使用率越低。

也就是说,你或许该考虑只SELECT真正需要的字段来替代SELECT *? 只需要在上图设置里维护一个最低阀值,当Code Inspector扫描代码时,一旦检测到使用率低于维护的阀值就会报错。上图的20意思是20%.

Search DB Operations in loops across modularization units

Jerry 2007年刚加入SAP开始学习ABAP编程时,前辈们就告诫过我,不要在LOOP里使用SELECT语句,这样会极大影响代码的性能。

上图是通过Code Inspector扫描出来的一个例子,在双重LOOP循环里使用SELECT读取数据库表CRMD_DPP_HI_BLCK.

Nested Loops - 嵌套循环的检测

尽管当应用代码里嵌套循环的循环次数不大时,对代码运行的绝对时间没有太大影响——然而编写具有至少指数级时间复杂度的代码,在任何上下文里都不是一个好的编程习惯。

这个设置能够帮助我们快速找到所有的嵌套循环。

Copy current table row for LOOP AT

找出所有LOOP AT … INTO之处,理论上这些地方都可以用LOOP AT … REFERENCE INTO或者ASSIGNING 替换。当内表的行结构体字段很多时,使用后两种方式可以获得一些性能的提升。

Low-Perform. Parameter Transfers - 检测所有参数传递使用"Pass by Value"之处

Jerry关注了很多技术公众号,发现参数传递的"传引用"和"传值"这两种方式的辨析,至今仍然是很多互联网公司的面试题之一。

这个选项可以让您指定针对何种类型的参数进行参数传递方式的扫描:

在ABAP里理论上采用引用传递的方式进行参数传递,性能上总是优于值传递,具体性能会提高多少,依赖于具体传递的参数类型,无法一概而论。

Security Check – Dynamic and Client-Specific accesses in SELECT - 动态SQL语句的检测

符合下列范式的动态SQL会被扫描出来:

Dynamic table accesses: SELECT * FROM (dbtab) WHERE …
Dynamic WHERE conditions: SELECT * FROM dbtab WHERE (where_cond)
Accesses to certain tables: SELECT * FROM dbtab WHERE …
Client-specific accesses: SELECT * FROM dbtab FROM WA … CLIENT SPECIFIED …

这个选项并不是禁止您使用动态SQL语句——事实上SAP应用的持久层里有大量的动态SQL语句的使用例子——而是提醒您别忘记了进行SQL注入的预防措施:一旦扫描出来,如果有用户输入参与了这些动态SQL语句的拼接,那就别忘记看看上下文有没有使用CL_ABAP_DYN_PRG对用户输入进行处理。

Search for APPEND and INSERT … INDEX in SORTED Tables

检测所有在有序内表上施加了APPEND操作的地方。有了这个扫描选项,能够帮助您避免下图第13行这种类型的运行时错误。

Check of SY-SUBRC Handing - ABAP关键字调用后系统变量sy-subrc的检测

Jerry至今仍清楚地记得,十多年前上研究生课程《UNIX环境高级编程》时,老师不断地强调在进行系统调用之后一定要检查返回值并进行相应的错误处理。在Jerry看来,错误检测和处理是每一位编程人员都应该具备的基本素养。

对应到ABAP里,就意味着每次调用ABAP的关键字完成某项操作后,都必须检查sy-subrc的值来确认这次操作是否成功。

当然也可以根据项目的实际情况,告诉Code Inspector只检查某些类型的ABAP关键字调用。比如上图意思就是只检查READ TABLE关键字调用后是否进行了sy-subrc的检查。

Missing table content check before calling SELECT … FOR ALL ENTRIES IN

在使用FOR ALL ENTRIES IN 之前,必须先检查内表itab是否为空。这个选项能扫描出没有按照这个规范来编写的代码。

Programming Conventions - Naming conventions

在这个界面里为ABAP里不同类型的变量设置好您团队里达成一致的命名规范,然后Code Inspector就能把代码里所有违反了这些命名规范的地方扫描出来。

Metrics and Statistics

这个检查类别下面的设置都是一些很有意思的统计信息。

还是举例说明。下图红色区域的设置,意思是如果一个类的方法内的可执行语句行数超过150行,Code Inspector就报一条警告消息。这是为了避免大家写出一个过于冗长的方法。

而蓝色区域的设置是如果每100行可执行代码的对应注释量小于10行,就报一条警告消息。这些阀值可以根据实际情况自行修改或关闭。

FAN-OUT Structural Metrics - 统计一个方法的扇出值

方法的扇入值和扇出值在模块化编程的上下文会经常被提及,这对概念不是编程界首创的,而是源自半导体行业里的逻辑电路设计:

逻辑门的扇出系数定义了该门能够驱动的数字信号输入的最大量,而一个代码模块的扇出值则代表了其直属下层的模块个数。

这个选项能够统计您方法的扇出系数。扇出系数太小,意味着该方法基本没有调用其他下层的函数,这有两种可能:

  1. 该方法的逻辑本身非常简单,只有两三行代码,比如类的setter/getter方法;
  2. 这个方法的模块化没有做好,存在优化的空间,比如某些直接写在方法内的语句,可以提炼成下层函数并在方法内调用。

Comment Language Metrics

这个选项可以统计代码中出现的德文注释的函数。

Jerry不太明白该选项有什么用处,给非德国ABAP开发人员吐槽用的么?

OO Size Metrics

这个选项也是为了防止您不经意间就创造出怪兽级的类(monster class)而生的:一旦您关注的类的属性超过设置的阀值,比如类的成员,类的公/私有方法等关注点超过选项里设置的值时,Code Inspector就会报警。

Program Complexity Test – cyclomatic complexity - 代码环复杂度(圈复杂度)的测试利器

这又是一个能帮助您写出Clean ABAP code的强大工具。

什么是代码的环复杂度?

根据维基百科的定义,我们把一段代码的执行流画成一张有向无环图,然后环复杂度可以通过下面的公式计算出来:

https://en.wikipedia.org/wiki/Cyclomatic_complexity

环复杂度 = 图的边数 - 图的节点数 + 2

这其实就是我们研究生专业课《图论》里学的欧拉定理。

看下面这个例子:

上面这8行ABAP代码,环复杂度为3,怎么计算出来的?

先把其对应的有向无环图画出来:

这张图的边数为3,即图中黑色,红色和绿色三条粗线。
这张图的顶点数为2,如图中两个菱形的蓝色图例所示。

最后环复杂度为3 – 2 + 2 = 3.

统计表明,代码的高环复杂度和高故障率之间存在很强的正相关性,这不难理解,代码的环复杂度越高,意味着里面嵌套的IF-ELSE,SWITCH等逻辑越多,无论是代码原来的开发人员,还是后来接手的维护人员,读起来都会觉得头昏脑胀。

因此大家可以多用ABAP Code Inspector的这个扫描选项,随时监控您代码的环复杂度。

Search DB Operations

把您关注的在代码中出现的SQL操作关键字全部罗列出来。

Search ABAP Statement Patterns

这个选项也很有用,能根据您指定的正则表达式扫描ABAP代码。

例如,您希望找出代码里所有出现了READ TABLE XXX WITH KEY X = X的地方,只需要在上图的输入框里填入对应的正则表达式,即用*代表任意字符串:
READ TABLE * WITH KEY * = *

然后ABAP Code Inspector就会按照我们期望的行为去扫描代码:

ABAP报表RS_ABAP_SOURCE_SCAN也能实现完全一致的功能:

ABAP Code Inspector的隐藏功能就介绍到这里,希望大家能够好好利用它们,提高您的工作效率和代码质量,感谢阅读。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

ABAP Code Inspector那些隐藏的功能,您都知道吗?相关推荐

  1. 如何使用ABAP code inspector找出所有在LOOP里访问database的操作

    Created by Jerry Wang on Jun 15, 2015 使用transaction code SCI创建一个新的inspection variant,enable关于perform ...

  2. 手机息屏后停止_手机息屏还能这样玩?华为这几个隐藏小功能快学起来

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 注:本文转载自网络,如有侵 ...

  3. 华为android怎样隐藏软件,华为怎么打开隐藏应用功能

    隐藏应用是没有密码的,隐藏应用的方法:在主桌面两指分开,进入隐藏应用界面,点击+(添加),然后点击要隐藏的应用,再点击确定即可.应用锁有密码,是机主设定的,如果设置了指纹访问应用,可以使用指纹解开,如 ...

  4. eclipse 隐藏项目_前5个有用的隐藏Eclipse功能

    eclipse 隐藏项目 Eclipse是野兽. 仅凭其力量才能超越其神秘感的设备. 有人将其称为连续体跨功能器 . 其他人则称它为透湿器 . 是的,它是如此之大,需要花费数年才能掌握. 然后,您的经 ...

  5. 前5个有用的隐藏Eclipse功能

    Eclipse是野兽. 仅凭其力量才能超越其神秘感的设备. 有人将其称为连续体跨功能器 . 其他人则称它为透湿器 . 是的,它是如此之大,需要花费数年才能掌握. 然后,您的经理出现并告诉您:我们正在使 ...

  6. 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)

    利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能) 参考文章: (1)利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功 ...

  7. 苹果手机怎么用计算机隐藏应用,iphone怎么隐藏应用功能 iphone隐藏应用功能方法【详解】...

    小编喜欢下载各种新鲜的APP来玩,但由于异性缘极好,老是被一些妹纸借手机去玩,小编生怕妹纸打开某些App,但又不好意思阻止--经过小编的不懈努力,终于找到方法在不越狱的情况下隐藏手机中的APP了!ip ...

  8. 原生video标签隐藏底部功能按钮

    原生video标签隐藏底部功能按钮 一.controlslist属性(只有3个配置项) 二.shadow DOM 1.查看shadow DOM(第一种) 2.查看shadow DOM(第二种) ①操作 ...

  9. android qq隐藏功能,90﹪的人都不知道--手机QQ这些隐藏的功能!

    90﹪的人都不知道--手机QQ这些隐藏的功能! 我们在平时玩手机的时候,最常用到微信,当然QQ也算是我们日常生活中使用频率最多的社交工具之一,它于1999年推出,随着不断的更新迭代,如今的QQ功能可以 ...

最新文章

  1. 寻找孪生素数(当p为素数时,p+2也为素数)
  2. 真香!如何用300行代码写完一个Spring基本框架?
  3. 详解MariaDB数据库的触发器
  4. 字符串截取,对数字,英文,汉字都可以
  5. [AX2012]发送广播邮件
  6. 顺序的分数 Ordered Fractions
  7. wxWidgets:创建其他框架
  8. linux期末作业设计,linux作业与项目设计
  9. 自动提示_EXCEL2013版突然打不开,自动修复提示1907错误
  10. 36 如何营造一种活跃的科研气氛/如何培养表达交流能力
  11. 【Qt教程】1.2 - Qt5 新建工程
  12. Nokia Imaging SDK滤镜使用入门
  13. 设计模式---003代理模式---【巷子】
  14. UDP实现简单的超时重传
  15. 小迪安全课程笔记--01基础入门
  16. pyhive ModuleNotFoundError: No module named ‘thrift‘
  17. 从致远OA-ajax.do未授权文件上传漏洞复现
  18. 自动驾驶最全基础知识、课程、论文、数据集、开源软件等资源整理分享
  19. access 报表隔行底纹_excel中如何隔行填充底纹
  20. Altium designer如何实现原理图和PCB交互式布局

热门文章

  1. 数据库简单的实际运用 ①
  2. ASP.NET Web API随记汇总
  3. delphichm博客于2013年10月16日申请成功了!
  4. 用aria2c下迅雷离线资源
  5. Linux 进程基础
  6. discuzX2.5 数据字典
  7. 关于CPU、指令集、架构、芯片概述
  8. 走近分形与混沌(part3)-引领任何科学发展的,从来都是伟大的思想而不是繁琐的公式
  9. R语言之离群点检验(part2)--局部离群点因子LOF检验
  10. 26 行 ABAP 代码使用 HTTP_GET 函数下载百度网站的首页数据