布尔型(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 AELSE." path BENDIF." 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 APIsmo_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_dxfeld,或定义你自己的布尔类型数据元素

3 小结

本文介绍了布尔类型的两种典型“错误用法”,并以ABAP语言为例,介绍了布尔类型变量的一些最佳实践。

Functions are cheap, but bugs are not.

心怀敬畏,审慎地使用布尔类型,让程序更合理地存在。

本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞

你真的会使用“布尔类型(Boolean)”么?相关推荐

  1. 布尔类型(boolean/Boolean)自动生成的get方法需要注意的小细节

    idea会自动生成get/set方法的, 对于布尔类型,要非常注意生成的get方法,到底是is开头还是get开头. 先说结论: 1.Boolean类型,生成的get方法是get开头的(建议使用这个). ...

  2. Python基础教程:基本数据类型之布尔类型(Boolean)

    计算机的本质就是计算,在其内部是0和1的比特位的变化,对外表现就是数据的变化.那么,计算机都能处理什么数据呢?本质上,数据都是以字节(Byte)存储的,表现上看,它们就是整数.浮点数和字符串等.Pyt ...

  3. 布尔类型(boolean)在oracle存储过程中支持情况

    文章目录 1.布尔类型在oracle存储过程中支持情况 (1)布尔类型在过程.函数.包中的支持情况 (2)布尔类型与其他类型的兼容情况 (3)布尔类型作为cast函数参数情况 (4)存储过程case- ...

  4. 学习笔记(01):【中国PHP教育大牛高洛峰】亲授php教程-PHP布尔类型(boolean)...

    立即学习:https://edu.csdn.net/course/play/914/13355?utm_source=blogtoedu boolean false int 0 float 0.0 或 ...

  5. mysql boolean类型_mysql 布尔类型

    ...对象的原型创建的函数: var myvar = new Boolean(1); myvar.constructor; 结果输出: function Boolean() { [native cod ...

  6. Python学习day02_数字类型 与 布尔类型 短路逻辑和运算符优先级

    目录 一.数字类型 1.1 整数 integers 1.2 浮点数 floating point numbers 1.3 复数 complex numbers 1.5 数字运算 二.布尔类型 Bool ...

  7. 简自动类型提升,精度损失类型强制转换,常用转义字符,简单帮你回顾Java基本数据类型整形浮点型字符型布尔型Boolean及其运算规则

    文章目录 整形 浮点型 字符型 布尔型boolean 自动类型提升 强制类型转换 注意 整形 bit是计算机中的最小存储单位. byte是计算机中的基本存储单元. 1MB=1024KB--1KB=10 ...

  8. MySQL 中的boolean/bool/tinyint(1)表示布尔类型

    结论:boolean/bool/tinyint(1)都可以表示布尔类型,没有区别,使用1 和0 表示真和假 数据库设计的时候经常会用到只有真假两种情况的字段,在java中有boolean类型 在mys ...

  9. 布尔类型(boolean)常量与变量

    boolean类型有两个常量值,true和false,在内存中占一位(不是一个字节),不可以使用0或非0整数替代true或false.Boolean类型用于判断逻辑条件,一般用于程序流程控制. boo ...

最新文章

  1. 吐血,经过4个小时,终于发现这个可以解决虚拟机ubuntu不能联网的问题
  2. The Linux device model
  3. fluorinefx C# 版的开源rtmp服务器
  4. 互掐盗播风云再起 三大视频网站存和解可能
  5. 终于把Redis场景设计搞清楚了,需要掌握的都在这了
  6. Composer php 类库商店
  7. 查看exe代码_【安全风险通告】Windows Type 1字体解析远程代码执行漏洞安全风险通告...
  8. 一个自定义的C#数据库操作基础类 SqlHelper
  9. netbeans写登录界面java_NetBeans 界面美化与字体设置
  10. 灵雀云 CTO 陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
  11. html提示版本过低升级,IE8浏览器提示版本过低怎样升级呢?
  12. 最近抖音超火的60帧高清视频制作教程
  13. JAVA 循环结构while简单方法使用
  14. 学习笔记 - excel筛选分组
  15. oracle在运行存储的时候出现:同义词转换不再有效
  16. 2020 第一周工作总结:TAGE分支预测器算法
  17. Protobuf简单使用
  18. CSS HTML 实现虚线横线分隔线
  19. 如何使WooCommerce产品属性更加突出
  20. 谷歌Flan-T5诞生!1800种语言任务超大规模微调

热门文章

  1. 春夜宴诸从弟桃李园序 李白
  2. 分享 | 研发效能提升——敏捷需求篇
  3. 如何使用智能手机控制PlayStation 4
  4. pc二维码支付demo(支付宝/微信)
  5. 收藏 | 自然语言处理(NLP)数据集汇总(附下载链接)
  6. python开启摄像头以及深度学习实现目标检测
  7. 考研数学二-汤家凤中值定理
  8. 查找文献时找不到全文的解决方法
  9. 2019 中科院 JCR 推荐 期刊 列表 计算机部分
  10. tableau 超级市场仪表板