OO编程模型 练习

OO编程模型 练习

#practice #oo-basics

📌核心模式
关键词 答案
封装 将数据和操作数据的方法捆绑在一起,隐藏内部实现细节
函数组 vs 类 函数组仅支持单一实例,类支持多实例化和完整的封装
过程式 vs OO 过程式以功能为中心,OO以数据/对象为中心

题目1 - [记忆] 封装的定义

请解释面向对象编程中”封装(Encapsulation)”的概念及其主要目的。

📌查看答案
封装是将数据(属性)和操作这些数据的方法捆绑在一个单元(类)中的机制。其主要目的是:
  1. 隐藏内部实现细节:外部代码无需了解对象内部如何工作
  2. 保护数据完整性:通过定义可见性(public、protected、private)控制外部对内部数据的访问
  3. 降低耦合度:内部实现的变化不会影响外部调用者

在ABAP中,类的公有区域(PUBLIC SECTION)定义外部接口,私有区域(PRIVATE SECTION)隐藏实现细节。


题目2 - [记忆] 函数组与类的区别

请列举函数组(Function Group)和类(Class)之间的三个主要区别。

📌查看答案
特性 函数组
实例化 仅支持单一实例(隐式全局数据) 支持多个独立实例
封装程度 函数组内的全局数据对所有函数模块可见,但封装机制较弱 提供严格的可见性控制(public/protected/private)
扩展性 不支持继承和多态 支持继承、多态和接口
状态管理 全局数据在函数组加载时初始化,仅一份 每个对象实例拥有独立的状态

题目3 - [记忆] 过程式编程模型的特点

请描述过程式编程模型的三个核心特征。

📌查看答案
过程式编程模型的核心特征:
  1. 以功能为中心:程序由一系列按顺序执行的功能/过程组成,数据在功能之间传递
  2. 数据与功能分离:数据结构独立定义,函数操作外部传入的数据
  3. 自顶向下的设计:复杂问题被分解为逐步细化的子程序调用层次

在ABAP中,过程式编程通过报表程序、函数模块和子程序实现。


题目4 - [记忆] 多实例化的含义

在面向对象编程中,”多实例化(Multiple Instantiation)”是什么意思?为什么它比函数组的单一实例更有优势?

📌查看答案
多实例化是指可以从同一个类创建多个独立的对象实例,每个实例拥有各自的属性值(状态)。

优势:

  • 独立状态:不同对象互不干扰,例如可以同时存在多个”订单”对象,各有不同的金额和状态
  • 内存管理:对象可按需创建和释放,通过垃圾回收机制自动管理
  • 灵活性:同一类型的多个实例可以同时存在于程序中,各自执行不同的操作

对比函数组:函数组只有一份全局数据,无法同时维护多个独立的状态。


题目5 - [记忆] 面向对象编程的四大特性

请列出面向对象编程的四大核心特性(也称为四大支柱),并简要说明每一个。

📌查看答案
  1. 封装(Encapsulation):将数据和操作数据的方法组合在一个单元中,通过可见性控制保护数据
  2. 继承(Inheritance):子类可以继承父类的属性和方法,并可以扩展或重定义它们,实现代码复用
  3. 多态(Polymorphism):同一操作作用于不同的对象时可以有不同的行为,通过方法重定义和接口实现
  4. 抽象(Abstraction):通过类和接口定义对象的抽象模型,隐藏复杂的实现细节,只暴露必要的接口

题目6 - [应用] 选择编程模型

公司需要开发一个库存管理系统,需要同时处理多个仓库的数据,每个仓库有独立的库存清单和操作日志。使用过程式编程(函数组)还是面向对象编程(类)更合适?请说明理由。

📌查看答案
面向对象编程(类)更合适。

理由:

  1. 多实例需求:系统需要同时管理多个仓库,每个仓库是独立的对象,拥有各自的库存清单和日志。类的多实例化天然支持这种需求
  2. 封装需求:每个仓库的库存数据和操作方法应封装在一起,防止外部直接修改数据,确保数据一致性
  3. 扩展性:未来可能需要添加新类型的仓库(如冷链仓库),可以通过继承实现扩展
  4. 维护性:对象之间的交互关系清晰,代码更易于维护和测试

如果使用函数组,则需要手动管理多个仓库的状态(例如使用内表存储),增加了复杂性且容易出错。


题目7 - [应用] 识别封装违规

以下ABAP代码片段中,类的封装是否被正确使用?请分析并指出问题。

1
2
3
4
5
CLASS lcl_bank_account DEFINITION.
PUBLIC SECTION.
DATA: balance TYPE p DECIMALS 2.
METHODS: deposit IMPORTING iv_amount TYPE p.
ENDCLASS.

假设外部代码直接修改 balance 字段。

📌查看答案
封装被违反。

问题分析:

  1. balance 属性被定义在 PUBLIC SECTION 中,这意味着外部代码可以直接读写该属性
  2. 外部代码可能绕过 deposit 方法直接修改余额,导致:
    • 无法验证金额的有效性(如负数存款)
    • 无法记录交易日志
    • 数据完整性无法保证

修正方案:

1
2
3
4
5
6
7
CLASS lcl_bank_account DEFINITION.
PUBLIC SECTION.
METHODS: deposit IMPORTING iv_amount TYPE p,
get_balance RETURNING VALUE(rv_balance) TYPE p.
PRIVATE SECTION.
DATA: balance TYPE p DECIMALS 2.
ENDCLASS.

balance 移至 PRIVATE SECTION,通过公共方法提供受控的访问。


题目8 - [分析] 编程范式对比分析

请从以下五个维度对比分析过程式编程和面向对象编程,并讨论在ABAP项目中何时应选择哪种范式。

📌查看答案
维度 过程式编程 面向对象编程
设计重心 以功能/过程为中心,数据在过程间流动 以数据/对象为中心,功能封装在对象内
数据管理 全局数据或通过参数传递 封装在对象内部,通过方法访问
复用机制 子程序和函数模块的调用 继承、组合、接口实现
扩展方式 修改现有代码或添加新函数 通过继承和重定义扩展,符合开闭原则
可维护性 大型项目中代码耦合度高,维护困难 职责清晰,耦合度低,易于维护和测试

选择建议:

  • 使用过程式的场景:简单的数据转换程序、一次性报表、批量数据处理脚本
  • 使用面向对象的场景:复杂的业务逻辑、需要多实例管理的系统、需要长期维护和扩展的应用、与设计模式结合的架构设计
  • 实际项目中:ABAP支持两种范式混合使用,但新开发应优先采用面向对象方式,以获得更好的可维护性和扩展性

📌模式总结
关键词 答案
封装 数据 + 方法捆绑,隐藏内部细节,通过可见性保护数据
函数组限制 单一实例,弱封装,无继承/多态
多实例化 同一类创建多个独立对象,各自维护状态
四大支柱 封装、继承、多态、抽象
过程式特征 以功能为中心,数据与功能分离,自顶向下
封装违规 属性放在公有区域,外部可直接修改,破坏数据完整性
范式选择 简单任务用过程式,复杂业务逻辑用OO,新开发优先OO