OO编程模型 练习
OO编程模型 练习
#practice #oo-basics
Related Concepts
📌核心模式
| 关键词 | 答案 |
|---|---|
| 封装 | 将数据和操作数据的方法捆绑在一起,隐藏内部实现细节 |
| 函数组 vs 类 | 函数组仅支持单一实例,类支持多实例化和完整的封装 |
| 过程式 vs OO | 过程式以功能为中心,OO以数据/对象为中心 |
题目1 - [记忆] 封装的定义
请解释面向对象编程中”封装(Encapsulation)”的概念及其主要目的。
📌查看答案
封装是将数据(属性)和操作这些数据的方法捆绑在一个单元(类)中的机制。其主要目的是:
- 隐藏内部实现细节:外部代码无需了解对象内部如何工作
- 保护数据完整性:通过定义可见性(public、protected、private)控制外部对内部数据的访问
- 降低耦合度:内部实现的变化不会影响外部调用者
在ABAP中,类的公有区域(PUBLIC SECTION)定义外部接口,私有区域(PRIVATE SECTION)隐藏实现细节。
题目2 - [记忆] 函数组与类的区别
请列举函数组(Function Group)和类(Class)之间的三个主要区别。
📌查看答案
| 特性 | 函数组 | 类 |
|---|---|---|
| 实例化 | 仅支持单一实例(隐式全局数据) | 支持多个独立实例 |
| 封装程度 | 函数组内的全局数据对所有函数模块可见,但封装机制较弱 | 提供严格的可见性控制(public/protected/private) |
| 扩展性 | 不支持继承和多态 | 支持继承、多态和接口 |
| 状态管理 | 全局数据在函数组加载时初始化,仅一份 | 每个对象实例拥有独立的状态 |
题目3 - [记忆] 过程式编程模型的特点
请描述过程式编程模型的三个核心特征。
📌查看答案
过程式编程模型的核心特征:
- 以功能为中心:程序由一系列按顺序执行的功能/过程组成,数据在功能之间传递
- 数据与功能分离:数据结构独立定义,函数操作外部传入的数据
- 自顶向下的设计:复杂问题被分解为逐步细化的子程序调用层次
在ABAP中,过程式编程通过报表程序、函数模块和子程序实现。
题目4 - [记忆] 多实例化的含义
在面向对象编程中,”多实例化(Multiple Instantiation)”是什么意思?为什么它比函数组的单一实例更有优势?
📌查看答案
多实例化是指可以从同一个类创建多个独立的对象实例,每个实例拥有各自的属性值(状态)。
优势:
- 独立状态:不同对象互不干扰,例如可以同时存在多个”订单”对象,各有不同的金额和状态
- 内存管理:对象可按需创建和释放,通过垃圾回收机制自动管理
- 灵活性:同一类型的多个实例可以同时存在于程序中,各自执行不同的操作
对比函数组:函数组只有一份全局数据,无法同时维护多个独立的状态。
题目5 - [记忆] 面向对象编程的四大特性
请列出面向对象编程的四大核心特性(也称为四大支柱),并简要说明每一个。
📌查看答案
- 封装(Encapsulation):将数据和操作数据的方法组合在一个单元中,通过可见性控制保护数据
- 继承(Inheritance):子类可以继承父类的属性和方法,并可以扩展或重定义它们,实现代码复用
- 多态(Polymorphism):同一操作作用于不同的对象时可以有不同的行为,通过方法重定义和接口实现
- 抽象(Abstraction):通过类和接口定义对象的抽象模型,隐藏复杂的实现细节,只暴露必要的接口
题目6 - [应用] 选择编程模型
公司需要开发一个库存管理系统,需要同时处理多个仓库的数据,每个仓库有独立的库存清单和操作日志。使用过程式编程(函数组)还是面向对象编程(类)更合适?请说明理由。
📌查看答案
面向对象编程(类)更合适。
理由:
- 多实例需求:系统需要同时管理多个仓库,每个仓库是独立的对象,拥有各自的库存清单和日志。类的多实例化天然支持这种需求
- 封装需求:每个仓库的库存数据和操作方法应封装在一起,防止外部直接修改数据,确保数据一致性
- 扩展性:未来可能需要添加新类型的仓库(如冷链仓库),可以通过继承实现扩展
- 维护性:对象之间的交互关系清晰,代码更易于维护和测试
如果使用函数组,则需要手动管理多个仓库的状态(例如使用内表存储),增加了复杂性且容易出错。
题目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字段。
📌查看答案
封装被违反。
问题分析:
balance属性被定义在PUBLIC SECTION中,这意味着外部代码可以直接读写该属性- 外部代码可能绕过
deposit方法直接修改余额,导致:- 无法验证金额的有效性(如负数存款)
- 无法记录交易日志
- 数据完整性无法保证
修正方案:
1 | CLASS lcl_bank_account DEFINITION. |
将 balance 移至 PRIVATE SECTION,通过公共方法提供受控的访问。
题目8 - [分析] 编程范式对比分析
请从以下五个维度对比分析过程式编程和面向对象编程,并讨论在ABAP项目中何时应选择哪种范式。
📌查看答案
| 维度 | 过程式编程 | 面向对象编程 |
|---|---|---|
| 设计重心 | 以功能/过程为中心,数据在过程间流动 | 以数据/对象为中心,功能封装在对象内 |
| 数据管理 | 全局数据或通过参数传递 | 封装在对象内部,通过方法访问 |
| 复用机制 | 子程序和函数模块的调用 | 继承、组合、接口实现 |
| 扩展方式 | 修改现有代码或添加新函数 | 通过继承和重定义扩展,符合开闭原则 |
| 可维护性 | 大型项目中代码耦合度高,维护困难 | 职责清晰,耦合度低,易于维护和测试 |
选择建议:
- 使用过程式的场景:简单的数据转换程序、一次性报表、批量数据处理脚本
- 使用面向对象的场景:复杂的业务逻辑、需要多实例管理的系统、需要长期维护和扩展的应用、与设计模式结合的架构设计
- 实际项目中:ABAP支持两种范式混合使用,但新开发应优先采用面向对象方式,以获得更好的可维护性和扩展性
📌模式总结
| 关键词 | 答案 |
|---|---|
| 封装 | 数据 + 方法捆绑,隐藏内部细节,通过可见性保护数据 |
| 函数组限制 | 单一实例,弱封装,无继承/多态 |
| 多实例化 | 同一类创建多个独立对象,各自维护状态 |
| 四大支柱 | 封装、继承、多态、抽象 |
| 过程式特征 | 以功能为中心,数据与功能分离,自顶向下 |
| 封装违规 | 属性放在公有区域,外部可直接修改,破坏数据完整性 |
| 范式选择 | 简单任务用过程式,复杂业务逻辑用OO,新开发优先OO |