ABAP 封装

ABAP 封装

📖 简介

封装(Encapsulation)是一种面向对象编程(OOP)核心概念,它将数据和功能绑定在一起,操作数据,并保持两者免受外部干扰和误用。

🔄 封装的核心概念

  • 数据封装:将数据和相关功能打包在一起
  • 数据隐藏:保护内部数据不被外部直接访问
  • 接口暴露:只对外暴露必要的接口
  • 实现隔离:隐藏内部实现细节

💡 重要提示 - 数据封装导致了数据隐藏的重要OOP概念。封装是捆绑数据和使用它们的函数的机制,数据抽象是一种仅暴露接口并向用户隐藏实现细节的机制。

🔒 访问控制

ABAP中的访问修饰符

修饰符 访问级别 描述
PRIVATE 私有 仅在类内部可见
PROTECTED 受保护 在类及其子类中可见
PUBLIC 公共 外部可访问

默认行为

ABAP默认规则

  • 类中定义的所有项目默认都是私有的
  • 这种设计强制良好的封装实践


graph TB
    A[类内部] -->|可访问| B[Private成员]
    A -->|可访问| C[Protected成员]
    A -->|可访问| D[Public成员]
    E[外部访问] -->|不可访问| B
    E -->|不可访问| C
    E -->|可访问| D

📝 接口封装示例

封装实际上意味着一个属性和方法可以在不同的类中修改。因此,数据和方法可以具有不同的形式和逻辑,可以隐藏以分离类。

🔗 接口封装原理

当我们需要在不同的类中创建具有不同功能的一个方法时,使用接口。这里方法的名称不需要改变。相同的方法必须在不同的类实现中实现。

📊 示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
REPORT zencap1.

INTERFACE inter_1.
DATA text1 TYPE char35.
METHODS method1.
ENDINTERFACE.

CLASS class1 DEFINITION.
PUBLIC SECTION.
INTERFACES inter_1.
ENDCLASS.

CLASS class2 DEFINITION.
PUBLIC SECTION.
INTERFACES inter_1.
ENDCLASS.

CLASS class1 IMPLEMENTATION.
METHOD inter_1~method1.
inter_1~text1 = 'Class 1 Interface method'.
WRITE / inter_1~text1.
ENDMETHOD.
ENDCLASS.

CLASS class2 IMPLEMENTATION.
METHOD inter_1~method1.
inter_1~text1 = 'Class 2 Interface method'.
WRITE / inter_1~text1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA:
object1 TYPE REF TO class1,
object2 TYPE REF TO class2.

CREATE OBJECT:
object1,
object2.
CALL METHOD:
object1->inter_1~method1,
object2->inter_1~method1.

📝 输出结果

1
2
Class 1 Interface method
Class 2 Interface method

🔍 代码解析



graph LR
    A[接口inter_1] --> B[Class1]
    A --> C[Class2]
    B --> D[实现method1]
    C --> D

  1. 接口定义:声明了公共的接口契约
  2. 类实现:两个类都实现了相同接口
  3. 不同实现:相同的方法名,不同的实现逻辑
  4. 统一调用:通过相同的接口引用调用不同实现

🏗️ 封装的优势

📈 降低耦合度

封装的类对外界没有很多依赖。此外,他们与外部客户端的交互通过稳定的公共接口进行控制。也就是说,封装类及其客户端松散耦合。

🔧 提高可重用性

在大多数情况下,具有定义良好的接口的类可以插入到另一个上下文中。当设计正确时,封装类成为可重用的软件资产。

🛡️ 增强可维护性

  • 内部修改:内部实现可以随时修改而不影响外部调用者
  • 接口稳定:对外暴露的接口保持稳定
  • 减少副作用:内部变化不会影响外部代码

💡 设计策略

最佳实践

  1. 默认私有化

    1
    2
    3
    4
    5
    6
    7
    8
    CLASS my_class DEFINITION.
    PRIVATE SECTION.
    DATA: internal_data TYPE string.
    PROTECTED SECTION.
    METHODS: internal_method.
    PUBLIC SECTION.
    METHODS: public_method.
    ENDCLASS.
  2. 最小暴露原则

    • 只暴露必要的接口
    • 避免暴露内部实现细节
    • 限制外部访问权限
  3. 接口设计

    • 设计稳定且易于理解的接口
    • 保持接口的向后兼容性
    • 避免频繁变更公共接口

📋 设计检查清单

设计原则 实践方式
数据隐藏 使用private修饰符保护数据
接口稳定 避免频繁修改公共接口
功能内聚 相关功能放在同一类中
低耦合 最小化类之间的依赖关系

🎯 应用场景

1. 数据保护

1
2
3
4
5
6
7
8
CLASS bank_account DEFINITION.
PRIVATE SECTION.
DATA: balance TYPE p decimals 2.
METHODS: validate_amount IMPORTING amount TYPE p decimals 2.
PUBLIC SECTION.
METHODS: deposit IMPORTING amount TYPE p decimals 2,
get_balance RETURNING VALUE(result) TYPE p decimals 2.
ENDCLASS.

2. 业务逻辑封装

1
2
3
4
5
6
7
8
9
10
CLASS order_processor DEFINITION.
PRIVATE SECTION.
DATA: order_data TYPE order_struct.
METHODS: validate_order,
calculate_tax,
process_payment.
PUBLIC SECTION.
METHODS: create_order IMPORTING order_data_in TYPE any,
get_order_status RETURNING VALUE(status) TYPE string.
ENDCLASS.

3. 工厂模式实现

1
2
3
4
5
6
7
8
CLASS factory DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: create_object IMPORTING obj_type TYPE string
RETURNING VALUE(obj) TYPE ref to any.
PRIVATE SECTION.
CLASS-METHODS: create_specific_object IMPORTING obj_type TYPE string
RETURNING VALUE(obj) TYPE ref to any.
ENDCLASS.