布尔型(Boolean)是一种数据的类型,这种类型只有两种值,即"真"与"假"。但你真的会使用么?
本文列举了布尔型的常见错误用法,以及在ABAP语言中使用布尔型的一些最佳实践。
1. 典型的误区
1.1 用布尔型声明状态
要点1: 布尔类型不是一种“类型代码”。布尔型是“逻辑运算”的结果类型。
在编程中,我们会直觉地将一些变量声明成布尔型,例如男性/女性, 国内/国外, 看起来这些状态有且仅有2个状态。
data(is_male) = abap_ture.
这是一个典型的误区, 因为使用布尔类型指示状态经常被一些特殊场景打脸(如下例),迫使我们不得不改用其它类型,例如枚举类型。
lv_gender = gs_gender=>male.
lv_gender = gs_gender=>female.
lv_gender = gs_gender=>unkonwn.
lv_gender = gs_gender=>not_applicable.
lv_gender = gs_gender=>answer_refused.
解决上述尴尬场景的方法很简单,使用状态变量标识“状态”,让布尔型回归“逻辑运算”,使用is_male( ), is_female( )等方法来返回逻辑运算结果。
METHOD is_male.
IF mv_state = gs_gender=>male.
rv_yes = abap_true.
ELSE.
rv_yes = abap_false.
ENDIF.
ENDMETHOD.
1.2 在API中使用布尔型控制行为
要点2:遵循“单一职责”原则,一个API仅负责一个职责。
有时为了功能的扩展,我们经常尝试使用一些布尔类型的变量来控制一个API的行为,如下例:
METHOD dosomething.
" setup
" ...
" algorithm
IF iv_flag = abap_true.
" path A
ELSE.
" path B
ENDIF.
" cleanup
" ...
ENDMETHOD.
然而,这样的API设计会直接降低代码的可读性,同时强化了不同逻辑间的耦合关系。
调用方在使用API时,不得不去了解这个布尔型变量的含义,同时运维的同事在阅读代码时,也不得不去猜测这个布尔型变量的含义。
" what's the difference ?
mo_document->create_file(filename, filecontent, true);
mo_document->create_file(filename, filecontent, false);
如果一个API有两种职责,那么应当拆分成两个不同的API, 方法名称要有明确的含义.
" split to different APIs
mo_document->create_file(filename, filecontent);
mo_document->create_temp_file(filename, filecontent);
2. ABAP语言中,布尔类型的使用规范
2.1 使用ABAP_BOOL声明布尔变量
对于布尔类型的运行变量,不要使用generic的类型,而是要明确地使用abap_bool。
" bad
DATA lv_has_entries TYPE CHAR1.
" good
DATA lv_has_entries type abap_bool.
2.2 使用ABAP_TRUE和ABAP_FALSE
逻辑表达式中,不要使用’X’ , ’ ', space来进行比较,而是更直接地使用ABAP_TRUE和ABAP_FALSE。
" bad
lv_has_entries = 'X'.
IF lv_has_entries = ''.
ENDIF.
" good
lv_has_entries = abap_true.
IF has_entries = abap_false.
ENDIF.
2.3使用XSDBOOL来赋值布尔类型
XSDBOOL( log_exp )会判断一个逻辑表达式,并直接返回一个type XSDBOOLEAN 类型的变量,无任何歧义, 并且更加简洁。
" bad
IF lt_lines IS INITIAL.
lv_has_entries = abap_false.
ELSE.
lv_has_entries = abap_true.
ENDIF.
" good
DATA(has_entries) = xsdbool( lt_lines IS NOT INITIAL ).
2.4 数据元素BOOLE_D和XFELD
如果是数据字典中需要使用到布尔类型,我们可遵循下面的原则:
- 如果xml/json转换为xsd时需要布尔类型,此时可用数据元素xsdboolean (data element)或xsdboolean (domain)
- 其他情况,在数据字典中则可直接使用数据元素boole_d或xfeld,或定义你自己的布尔类型数据元素
3 小结
本文介绍了布尔类型的两种典型“错误用法”,并以ABAP语言为例,介绍了布尔类型变量的一些最佳实践。
Functions are cheap, but bugs are not.
心怀敬畏,审慎地使用布尔类型,让程序更合理地存在。
本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞👍、转发📣!