ABAP 整洁之道之命名规范

300 阅读5分钟

使用描述性名称

使用可以传达事物内容和含义的名称。

CONSTANTS max_wait_time_in_seconds TYPE i ...
DATA customizing_entries TYPE STANDARD TABLE ...
METHODS read_user_preferences ...
CLASS /clean/user_preference_reader ...

不要只把注意力放在数据类型和技术编码上。它们对理解代码几乎没什么贡献。

" anti-pattern
CONSTANTS sysubrc_04 TYPE sysubrc ...
DATA iso3166tab TYPE STANDARD TABLE ...
METHODS read_t005 ...
CLASS /dirty/t005_reader ...

不要试图通过注释来弥补坏的名称。

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Use Intention-Revealing Names

首选解决方案域和问题域术语

在解决方案域(即计算机科学术语,如 "queue" 或 "tree")和问题域(即业务领域术语,如 "account" 或 "ledger")中搜索好的名称。

按问题域命名时,业务层的命名最好听。对于采用域驱动设计而设计的组件(如 API 和业务对象)尤为如此。

按解决方案域命名时,提供大多数技术功能(如工厂类和抽象算法)层的命名最好听。

在任何情况下都不要试图加进自己的语言。需能够在开发人员、产品负责人、合作伙伴和客户之间交换信息,因此要选择所有人不用查定制词典就能理解的名称。

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Use Solution Domain Names and [...]: > Use Problem Domain Names

使用复数形式

在 SAP 有一种传统习惯,那就是用单数形式命名事物的表,例如,country 表示“国家表”。外界普遍倾向于使用复数形式表示事物的列表。因此,建议最好改用 countries

这条建议主要针对诸如变量和属性等事物。> 对于开发对象,可能存在同样> 也有意义的模式,例如,有一种广泛使用的规范,> 以单数形式命名数据库表(“透明表”)。

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Use Intention-Revealing Names

使用能读出来的名称

关于对象会有很多思考和讨论,因此要使用能读出来的名称,例如,detection_object_types 优于诸如 dobjt 这种晦涩的名称。

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Use Pronounceable Names

避免缩写

如果有足够空间,那就完整地写出名称。仅当超过长度限制时才使用缩写。

如果不得不缩写,首先考虑_不重要_的词。

采用缩写,可能第一眼看起来很高效,但很快就会变得含糊不清。例如,cust 中的 "cust" 究竟是指 "customizing"、"customer" 还是 "custom"?三者在 SAP 应用程序中都很常见。

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Make Meaningful Distinctions

在各处使用相同缩写

人们会搜索关键字来查找相关代码。为此,应对相同事物使用相同缩写。例如,始终将 "detection object type" 缩写为 "dobjt",而不是混合使用 "dot"、"dotype"、"detobjtype" 等等。

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Use Searchable Names

用名词表示类而用动词表示方法

使用名词或名词词组命名类、接口和对象:

CLASS /clean/account
CLASS /clean/user_preferences
INTERFACE /clean/customizing_reader

使用动词或动词词组命名方法:

METHODS withdraw
METHODS add_message
METHODS read_entries

用诸如 is_has_ 之类的动词作为布尔方法的开头,读起来会很流畅:

IF is_empty( table ).

建议也像方法一样给函数命名:

FUNCTION /clean/read_alerts

避免干扰词,如 "data"、"info"、"object"

省略干扰词

account  " instead of account_data
alert    " instead of alert_object

或将其替换为某些确实更有价值的特定字眼

user_preferences          " instead of user_info
response_time_in_seconds  " instead of response_time_variable

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Make Meaningful Distinctions

每个概念选取一个词

METHODS read_this.
METHODS read_that.
METHODS read_those.

为一个概念选择一个术语并坚持使用;不要混合使用其他同义词。同义词会使读者浪费时间查找本不存在的差异。

" anti-pattern
METHODS read_this.
METHODS retrieve_that.
METHODS query_those.

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Pick One Word per Concept

仅在本意如此时使用模式名称

不要对类和接口使用软件设计模式的名称,除非本意真的如此。例如,不要将类称为 file_factory,除非它的确实施了工厂设计模式。最常见的模式包括:singletonfactoryfacadecompositedecoratoriteratorobserverstrategy

更多信息参阅 [Robert C. Martin 所著的 Clean Code] 中的 Chapter 2: Meaningful Names: Avoid Disinformation

避免编码,特别是匈牙利表示法和前缀

鼓励丢掉_所有_编码前缀。

METHOD add_two_numbers.
  result = a + b.
ENDMETHOD.

而不是毫无必要地加长

METHOD add_two_numbers.
  rv_result = iv_a + iv_b.
ENDMETHOD.

Avoid Encodings > 深入介绍了这样做的理由。

命名规范

通用前缀

通用前缀是标识代码用途的重要手段,通常在项目中会以项目名作为一种通用的前缀;在SAP系统中也是类似的,例如使用FI,MM等模块作为通用前缀。

  • SAP前缀举例:FI_xxx
  • 项目前缀举例:ABC_xxx

通用前缀在下文将使用<general prefix><prefix>表示。

注:对于客户定制的代码,对象的命名空间为Y或Z。

类的命名

全局类(Global Class)

NameClass
CL_<prefix>_Standard Class
CF_<prefix>_Factory Class
CX_<prefix>_Exception Class
IF_<prefix>_Interface
TC_<prefix>_Global Test Class
TD_<prefix>_Global Test Double
TH_<prefix>_Global Test Helper Class

局部类(Local Class)

NameClass
LCL_General local class
LTC_ABAPUnit: Test class
LTD_ABAPUnit: Test Double
LTH_ABAPUnit: Helper Class

方法命名(Methods)

属性命名和变量命名

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情