这是Jerry 2021年的第 10 篇文章,也是汪子熙公众号总共第 281 篇原创文章。
明天是2021年1月17日,星期日,腊月初五。
Jerry之前收到CSDN社区赠送的新年礼物,一本台历:《了不起的程序员》,
其中1月16日,17日两天的篇幅,都在介绍托尼·霍尔(Tony Hoare), 计算机科学家,因程序设计语言定义与设计方面的杰出贡献取得1980年的图灵奖。疾速排序算法的发明者。
如果想查看用ABAP实现的8种排序算法的源代码,能够查看Jerry之前的文章:
Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
本文不会探讨霍尔创造的疾速排序算法,而是介绍另一个来自霍尔,现在依然被程序员在编程语言中宽泛应用的一个设计:null援用。
null援用被霍尔称为"十亿美元谬误",是霍尔1965年设计ALGOL W语言时提出的。
《Java实战》中提到,在Java程序开发中应用null会带来实践和实际操作上的种种问题:
- 它是谬误之源
- 会使你的代码收缩
- 本身毫无意义
- 毁坏了Java的哲学
- 在Java的类型零碎上开了口子
霍尔的名言:
我把它叫做我的“十亿美元谬误”,就是在1965年创造了空援用...... 我无奈抵御放进一个空援用的引诱,仅仅是因为实现起来非常容易。
引入了空援用的编程语言,在拜访援用之前,须要显式查看援用是否无效。
Java
下图第46行代码定义的print办法,输出参数是一个类型为Integer的援用。在调用援用之前,须要先判断其是否是空援用,否则程序执行时就会呈现运行时异样。
ABAP
应用CHECK X IS NOT INITIAL进行进攻,如果X为空援用,则不会执行CHECK语句的下一条语句。
谨严的德国人,在霍尔传授null援用的根底上,又设计出IS BOUND, IS NOT INITIAL和IS ASSIGNED这几种判断逻辑:
SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
JavaScript
第10行的print办法外部,用&&操作符的短路逻辑(short-circuit)个性来实现空援用的检测:如果传入的oPrinter是空援用,则不会执行&&前面的print调用。
而TypeScript提供的可选链(Optional Chaining),则能够在语言层面优雅地防止这个问题。
上面的TypeScript代码,应用问号结构了一个可选链。如果a为空,则表达式a?.b间接返回undefined给变量val,而不会试图去执行a.b
上图TypeScript代码,编译之后生成的JavaScript代码如下图所示,咱们能够把TypeScript的可选链看成JavaScript用三元表达式实现的语法糖。
为了加重Java程序员每次应用援用之前,显式进行非空查看的工作量,Java 8引入了一个新的工具类:Optional.
Optional仅仅是一个不含任何业务逻辑的包裹类,其value字段指向了真正的业务类。
下图是一个应用Optional工具类的例子,第11行的filter办法,传入的是一个通过Lambda Function实现的过滤条件。这行语句的语义是,对anotherName蕴含的字符串,进行过滤操作,查看another实例的value字段存储的援用,是否满足过滤条件(字符串长度小于6):
Optional.filter办法,无论过滤条件是否满足,返回的类型均为Optional,便于链式调用。
我第10行传入Optional对象的字符串,显然长度远远大于6,所以filter办法返回一个新的Optional对象,其value字段为null.
对于filter调用返回的Optional对象,咱们能够持续调用orElse,设置一个默认值。下图第14行用orElse实现的逻辑,语义是:如果shortName包裹的value字段为空,则返回orElse办法传入的默认值。
Java 8的Optional工具类并不像TypeScript的可选链一样,后者是语言层面提供的个性,而Optional仅仅是开发包里的一个工具类。
比方Optional的静态方法of,其实现仅仅是新建一个Optional对象,去包裹传入的value援用:
orElse办法,外部实现也是一个简略的三元表达式。
看这样一个极其的例子:
Outer类有一个字段nested,类型为Nested类。Nested类有一个字段inner,类型为Inner类。Inner类蕴含了字段foo,类型为String,值为Jerry:
如果想从Outer类的实例登程,写一段比拟强壮的代码,打印出深藏在Inner类里的foo字段,惯例的写法和应用Optional的写法别离位于下图test1和test2办法,大家能够比拟下,更喜爱哪一种?
值得一提的是,相似Java Optional.orElse办法,在ABAP里也存在基于语言层面的反对。
下图是ABAP 740的新语法:
下面的新语法,翻译成传统的ABAP代码如下:
由此可见,新的ABAP内表读取的语法比拟简洁,能少写3行代码。
然而新语法有一个缺点:如果it_data内表,不存在object_ext的值为cl_crm_prodil_bo_names=>gc_prod_root的记录,此时程序执行会被终止,抛出异样CX_SY_ITAB_LINE_NOT_FOUND:
当然针对这种状况,ABAP也有对应的解决方案。
下图测试代码第17行会抛出异样,而19行不会。从语义上容易了解:如果内表lt_data里不存在name为Spring2的记录,则返回开发者应用DEFAULT VALUE关键字指定的一个构造,作为默认值。
第19行执行结束后,构造ls3的name字段为SpringInvalid, value为999.
本文从霍尔传授1965年提出的null援用作为切入点,向大家分享了Jerry工作中同空援用打交道的一些经验,感激浏览。
ABAP专题
- Jerry的ABAP, Java和JavaScript乱炖
- ABAP开发人员将来应该学些什么
- Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
- Jerry的ABAP原创技术文章合集
- 300行ABAP代码实现一个最简略的区块链原型
- 应用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise零碎里的函数
- 在SAP云平台的CloudFoundry环境下生产ABAP On-Premise OData服务
- ABAP vs Java, 蛙泳 vs 自由泳
- 聊聊C语言和ABAP
- 入手应用ABAP Channel开发一些小工具,晋升日常工作效率
- 我用ABAP做过的那些无聊的事件
- 不喜爱SAP GUI?那试试用Eclipse进行ABAP开发吧
- 应用Visual Studio Code编写和激活ABAP代码
- 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
- 在SAP云平台ABAP编程环境上编写第一段ABAP程序
- SAP官网公布的ABAP编程标准
- ABAP Code Inspector那些暗藏的性能,您都晓得吗?
- 还在用ABAP进行SAP产品的二次开发?来理解下这种全新的二次开发理念吧
- ABAP Netweaver体内的那些寄生式编程语言
- 从SAP社区上的一篇博客开始,聊聊SAP产品命名背地的那份情怀
- 云端的ABAP Restful服务开发
- 如何在SAP云平台ABAP编程环境里把CDS view裸露成OData服务
- 应用abapGit在ABAP On-Premises零碎和SAP云平台ABAP环境之间进行代码传输
- 30分钟用Restful ABAP Programming模型开发一个反对增删改查的Fiori利用
- Jerry带您理解Restful ABAP Programming模型系列之二:Action和Validation的实现
- Jerry带您理解Restful ABAP Programming模型系列之三:云端ABAP利用调试
- SAP云平台上的ABAP编程环境里如何生产第三方服务
- ABAP开发者上云的时候到了 - 当初大家能够收费应用SAP云平台ABAP环境的试用版了
- 学而不思则罔 - SAP云平台ABAP编程环境的由来和实用场景
- SAP云平台里的三叉戟利用
- 如何基于Restful ABAP Programming模型开发并部署一个反对增删改查的Fiori利用
- SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?
- 有哪些ABAP关键字和语法,到了ABAP云环境上就没方法用了?
- ABAP开发环境终于反对以驼峰命名法主动格式化ABAP变量名了
- 利用ABAP 740的新关键字REDUCE实现一个理论工作工作
- 一段让人瑟瑟发抖的ABAP代码
- 昨日万圣节ABAP怪兽级代码谜团,颁布答案啦
- 介绍一种在ABAP内核态进行内表高效拷贝的办法
- 应用SAP Cloud Application Programming模型开发OData的一个理论例子
- 当ABAP遇见普罗米修斯
- 应用ABAP绘制可伸缩矢量图
- ABAP开发环境语法高亮的那些事儿
- SAP谬误音讯调试之七种武器:让所有的谬误音讯都能被定位
- 应用ABAP操作Excel的几种办法
- SAP GUI里的收藏夹事务码管理工具
- SAP GUI和Windows注册表
- 有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
- ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
- 实现ABAP条件断点的三种形式
- 应用SAT跟踪监控从浏览器关上的SAP利用的性能和调用栈
- 一个13年ABAP老兵的倡议:理解这些基础知识,对ABAP开发有百利而无一害
- SAP ABAP Netweaver容器化, 不可能实现的工作吗?
- SAP产品加强技术回顾
- SAP API开发方法大全
- 浅谈Java和SAP ABAP的动态代理和动静代理,以及ABAP面向切面编程的尝试
- SAP ABAP应用服务器的HTTP响应状态码(Status Code)
- SAP ABAP里存在Java List这种汇合工具类么?CL_OBJECT_COLLECTION理解一下
- ABAP面试题系列:写一组会呈现死锁(Deadlock)的ABAP程序
- SAP ABAP Netweaver服务器的规范登录形式解说
- SAP ABAP关键字语法图和ABAP代码主动生成工具Code Composer
- SAP ABAP SM50的另类用处 - ABAP工作过程对数据库表读取操作的检测
- 对于SAP ABAP字符变量和字符串变量字符个数的一个知识点,和一个血案
- SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
- SAP ABAP和Java里的弱援用(WeakReference)和软援用(SoftReference)
- SAP AMDP介绍 - ABAP托管的HANA数据库过程
- 给你的ABAP对象打上标签(Tag)
更多Jerry的原创文章,尽在:"汪子熙":