ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”

news2025/7/21 5:42:15

“高内聚、低耦合”是面向对象编程中非常重要的设计原则,它有助于提高代码的可维护性、扩展性和复用性。


1. 初衷:为什么会有这个原则?

在软件开发中,随着业务需求的复杂化,代码难免会变得越来越庞大。如果开发者将一大堆功能塞进一个方法或类中,代码会变得难以理解、难以维护。而且假如这些功能彼此之间密切依赖,甚至代码中充满硬编码的调用关系,那么代码的复用性和灵活性就会大幅降低。

为了解决这些问题,人们总结出了 “高内聚、低耦合”的原则。


2. 目的:这个原则想要解决什么问题?

  • 高内聚的目标是让每个模块或类内部专注于一个单一的职责(SRP:单一职责原则),这样模块实现的功能是清晰且明确的。例如,一个类只负责处理和客户相关的业务,而不应该处理订单、支付的逻辑。高内聚让代码易于理解和测试。
  • 低耦合的目标是减少模块或类之间不必要的依赖,避免类之间紧密地绑在一起。低耦合降低了修改代码时产生的连锁反应,增强了模块的可独立开发、独立使用的能力。

简单来说,高内聚强调“做好一件事”,低耦合强调“减少过分依赖”。也即模块内高内聚,模块间低耦合,这个原则与关注点隔离SoC以及单一职责SRP原则是内涵相通的,在软件设计时,应融会贯通地使用.


3. 实际中如何应用:

  • 高内聚:确保类或方法只负责一个职责。例如,一个类可以是“订单处理器”,另一个类可以是“库存管理器”;它们不应该 “混在一起”。方法也应该短小精悍,每个方法只做一件事,避免“重复劳动”。

  • 低耦合:两个模块之间应该通过清晰的接口进行交互,而不是直接依赖对方的实现细节。例如,模块 A 应该通过抽象的接口来调用模块 B,而不应该直接访问 B 内部的实现逻辑。如果需要改变模块 B 的实现,模块 A 不需要做任何修改。

注意:高内聚和低耦合的实现,与软件架构的设计密切相关,要明确软件分层的理念,在代码层,要特别避免A类调用B类,同时B类又调用A类的出现。类之间的依赖关系,要尽量单一和简单。

在这里插入图片描述


4. ABAP 示例

我们用一个简单的业务场景来说明——“客户的订单系统”。假设有一个功能需要创建订单并扣减库存,同时还要生成一份日志。我们将遵循高内聚低耦合的设计理念来实现。

不遵循高内聚低耦合的代码(反例):
CLASS zcl_order DEFINITION.
  PUBLIC SECTION.
    METHODS: create_order IMPORTING iv_customer_id TYPE string,
                                       iv_product_id  TYPE string,
                                       iv_quantity    TYPE i.
ENDCLASS.

CLASS zcl_order IMPLEMENTATION.
  METHOD create_order.
    " 处理订单逻辑
    WRITE: / 'Creating order for customer:', iv_customer_id.
    WRITE: / 'Product:', iv_product_id, 'Quantity:', iv_quantity.

    " 减库存逻辑
    WRITE: / 'Reducing stock for product:', iv_product_id.

    " 生成日志
    WRITE: / 'Logging order creation.'.
  ENDMETHOD.
ENDCLASS.

问题:

  1. create_order 方法同时包含了“创建订单”“减库存”“生成日志”三种逻辑,职责不单一,内聚性很低。
  2. 如果某一部分逻辑(如库存管理或者日志格式)需要修改,会影响整个方法,耦合度很高。

遵循高内聚低耦合的代码(改进):

我们将不同的职责拆分成多个类,每个类专注于自己的职责,并通过接口或方法交互。

" 订单类:只负责创建订单,不涉及库存或日志
CLASS zcl_order DEFINITION.
  PUBLIC SECTION.
    METHODS: create IMPORTING iv_customer_id TYPE string
                              iv_product_id  TYPE string
                              iv_quantity    TYPE i.
ENDCLASS.

CLASS zcl_order IMPLEMENTATION.
  METHOD create.
    WRITE: / 'Order created: Customer ID:', iv_customer_id.
    WRITE: / 'Product:', iv_product_id, 'Quantity:', iv_quantity.
  ENDMETHOD.
ENDCLASS.


" 库存类:负责处理库存相关逻辑
CLASS zcl_stock_manager DEFINITION.
  PUBLIC SECTION.
    METHODS: reduce_stock IMPORTING iv_product_id TYPE string
                                       iv_quantity    TYPE i.
ENDCLASS.

CLASS zcl_stock_manager IMPLEMENTATION.
  METHOD reduce_stock.
    WRITE: / 'Stock reduced: Product:', iv_product_id, 'Quantity:', iv_quantity.
  ENDMETHOD.
ENDCLASS.


" 日志类:负责记录日志
CLASS zcl_logger DEFINITION.
  PUBLIC SECTION.
    METHODS: log IMPORTING iv_message TYPE string.
ENDCLASS.

CLASS zcl_logger IMPLEMENTATION.
  METHOD log.
    WRITE: / 'Log:', iv_message.
  ENDMETHOD.
ENDCLASS.


" 主程序:通过低耦合调用不同类完成订单逻辑
START-OF-SELECTION.
  DATA(lo_order)         = NEW zcl_order( ).
  DATA(lo_stock_manager) = NEW zcl_stock_manager( ).
  DATA(lo_logger)        = NEW zcl_logger( ).

  " 创建订单
  lo_order->create( iv_customer_id = 'C001'
                    iv_product_id  = 'P001'
                    iv_quantity    = 5 ).

  " 扣减库存
  lo_stock_manager->reduce_stock( iv_product_id = 'P001'
                                  iv_quantity   = 5 ).

  " 记录日志
  lo_logger->log( iv_message = 'Order created and stock reduced successfully.' ).

5. 分析改进的代码:

  1. 高内聚

    • zcl_order 只专注于订单创建的相关逻辑。
    • zcl_stock_manager 只负责库存的逻辑。
    • zcl_logger 专门负责日志记录。
      每个类专注于自己的职责,内聚性高,逻辑更加清晰。
  2. 低耦合

    • 主程序中,订单、库存、日志模块是独立的,职责明确。如果以后需要改变日志记录的方法(如写入数据库而不是打印),只需要修改 zcl_logger 类,不影响其他模块。
  3. 可扩展性
    新增需求时比如“添加支付处理逻辑”,可以通过新增独立类实现,而不会影响现有代码。


在公司组织架构中的借鉴意义

高内聚低耦合虽然是软件设计领域的一个设计原则,但这一理念同样可以在公司管理和组织架构设计中有启发和借鉴意义。

  1. 高内聚:

    • 明确职能: 在组织架构中,每个部门或团队应有明确的职能和专注点。这类似于一个软件模块的高内聚,将相关任务或功能集中在一起,减少跨部门的混淆和冗余。
    • 专业性提升: 专注于特定功能的团队更能提高专业性和效率,因为他们能够深入探索特定领域,并积累专业知识。
  2. 低耦合:

    • 灵活性: 部门之间的低耦合意味着各个团队可以自主运作而不依赖于其他团队的输入。这提升了灵活性,使得组织能够快速响应变化。
    • 减少沟通成本: 通过减少部门之间的过度依赖关系,可以降低沟通成本和复杂性,提高决策速度。

实例

示例1:科技公司产品开发

一家科技公司可以通过高内聚低耦合的理念构建其产品开发团队。产品经理、设计师、开发人员和测试人员组成一个高度内聚的产品开发小组,专注于产品的设计、开发和测试。与此同时,这些小组与市场营销、客户支持等其他部门保持低耦合,使得开发团队能够快速响应市场需求,迭代和完善产品,而不被其他部门的流程所束缚。

示例2:地区分支机构管理

在一个国际企业中,各地区的分支机构可以实现高内聚,通过专注于区域市场的需求和特点来提升整体运营效率。同时,总部和各分支机构之间保持低耦合,使得各分支机构能够根据当地市场条件自主制定和调整策略,而不是依赖总部的统一指令。这种架构允许公司快速适应不同地区的市场变化。

总体而言,高内聚低耦合的理念在组织管理中鼓励明确分工和主动权的下放,帮助企业在快速变化的环境中保持适应性和创新能力。

总结:

本文总结了“高内聚、低耦合”的概念,总的来说“高内聚、低耦合”就是构建独立、单一职责模块的艺术,目的是让它们更容易维护和扩展。在实际开发中,拆分类和职责时掌握适度的平衡非常重要,既不要过度拆分(导致代码碎片化),也不要过度集中化(导致臃肿)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2398098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RagFlow优化代码解析(一)

引子 前文写到RagFlow的环境搭建&推理测试,感兴趣的童鞋可以移步(RagFlow环境搭建&推理测试-CSDN博客)。前文也写过RagFLow参数配置&测试的文档,详见()。很少写关于具体代码的blog&#xff0c…

【python与生活】用 Python 从视频中提取音轨:一个实用脚本的开发与应用

在当今数字化的时代,视频内容无处不在。无论是学习教程、会议记录、在线讲座还是娱乐视频,我们每天都会接触到大量的视频资源。有时候,我们可能只对视频中的音频部分感兴趣,比如提取讲座的音频用于后续收听,或者从电影…

深度强化学习赋能城市消防优化,中科院团队提出DRL新方法破解设施配置难题

在城市建设与发展中,地理空间优化至关重要。从工业园区选址,到公共服务设施布局,它都发挥着关键作用。但传统求解方法存在诸多局限,如今,深度学习技术为其带来了新的转机。 近日,在中国地理学会地理模型与…

008房屋租赁系统技术揭秘:构建智能租赁服务生态

房屋租赁系统技术揭秘:构建智能租赁服务生态 在房地产租赁市场日益活跃的当下,房屋租赁系统成为连接房东与租客的重要数字化桥梁。该系统集成用户管理、房屋信息等多个核心模块,面向管理员、房东和用户三类角色,通过前台展示与后…

spring-boot-admin实现对微服务监控

spring-boot-admin可以对微服务的状态进行监控&#xff0c;步骤如下&#xff1a; 1、添加spring-boot-admin和nacos依赖 <!-- nacos注册中心 --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-n…

Mycat的监控

参考资料&#xff1a; 参考视频 参考博客 Mysql分库分表&#xff08;基于Mycat&#xff09;的基本部署 MySQL垂直分库&#xff08;基于MyCat&#xff09; Mysql水平分表&#xff08;基于Mycat&#xff09;及常用分片规则 视频参考资料及安装包&#xff1a; https://pan.b…

Glide源码解析

前言 Glide是一款专为Android设计的开源图片加载库。有以下特点&#xff1a;1.支持高效加载网络、本地及资源图片&#xff1b;2.具备良好的缓存策略及生命周期管理策略&#xff1b;3.提供了简易的API和强大的功能。本文将对其源码进行剖析。 基本使用 dependencies {compile …

7.RV1126-OPENCV cvtColor 和 putText

一.cvtColor 1.作用 cvtColor 是 OPENCV 里面颜色转换的转换函数。能够实现 RGB 图像转换成灰度图、灰度图转换成 RGB 图像、RGB 转换成 HSV 等等 2.API CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0 ); 第一个参数&#xff1a;…

Redisson单机模式

redisson调用unlock的过程 Redisson 是一个基于 Redis 的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;框架&#xff0c;提供了分布式和可扩展的数据结构和服务。Redisson 的 unlock 方法用于释放锁。下面是 unlock 方法的调用过程&#xff1a; 获取锁的状…

数据结构第6章 图(竟成)

第 6 章 图 【考纲内容】 1.图的基本概念 2.图的存储及基本操作&#xff1a;(1) 邻接矩阵法&#xff1b;(2) 邻接表法&#xff1b;(3) 邻接多重表、十字链表 3.图的遍历&#xff1a;(1) 深度优先搜索&#xff1b;(2) 广度优先搜索 4.图的基本应用&#xff1a;(1) 最小 (代价) 生…

机器人现可完全破解验证码:未来安全技术何去何从?

引言 随着计算机视觉技术的飞速发展&#xff0c;机器学习模型现已能够100%可靠地解决Google的视觉reCAPTCHAv2验证码。这标志着一个时代的结束——自2000年代初以来&#xff0c;CAPTCHA&#xff08;"全自动区分计算机与人类的图灵测试"的缩写&#xff09;一直是区分…

CppCon 2014 学习:(Costless)Software Abstractions for Parallel Architectures

硬件和科学计算的演变关系&#xff1a; 几十年来的硬件进步&#xff1a;计算机硬件不断快速发展&#xff0c;从提升单核速度&#xff0c;到多核并行。科学计算的驱动力&#xff1a;科学计算需求推动硬件创新&#xff0c;比如需要更多计算能力、更高性能。当前的解决方案是并行…

网络爬虫 - App爬虫及代理的使用(十一)

App爬虫及代理的使用 一、App抓包1. App爬虫原理2. reqable的安装与配置1. reqable安装教程2. reqable的配置3. 模拟器的安装与配置1. 夜神模拟器的安装2. 夜神模拟器的配置4. 内联调试及注意事项1. 软件启动顺序2. 开启抓包功能3. reqable面板功能4. 夜神模拟器设置项5. 注意事…

群晖 NAS 如何帮助培训学校解决文件管理难题

在现代教育环境中&#xff0c;数据管理和协同办公的效率直接影响到教学质量和工作流畅性。某培训学校通过引入群晖 NAS&#xff0c;显著提升了部门的协同办公效率。借助群晖的在线协作、自动备份和快照功能&#xff0c;该校不仅解决了数据散乱和丢失的问题&#xff0c;还大幅节…

NLP学习路线图(十八):Word2Vec (CBOW Skip-gram)

自然语言处理&#xff08;NLP&#xff09;的核心挑战在于让机器“理解”人类语言。传统方法依赖独热编码&#xff08;One-hot Encoding&#xff09; 表示单词&#xff0c;但它存在严重缺陷&#xff1a;每个单词被视为孤立的符号&#xff0c;无法捕捉词义关联&#xff08;如“国…

嵌入式学习笔记 - 新版Keil软件模拟时钟Xtal灰色不可更改的问题

在新版Keil软件中&#xff0c;模拟时钟无法修改XTAL频率&#xff0c;默认只能使用12MHz时钟。‌这是因为Keil MDK从5.36版本开始&#xff0c;参数配置界面不再支持修改系统XTAL频率&#xff0c;XTAL选项变为灰色&#xff0c;无法修改。这会导致在软件仿真时出现时间错误的问题&…

黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+)

一. 算法复杂度分析 1.1 时间复杂度 时间复杂度分析&#xff1a;来评估代码的执行耗时的 常见的复杂度表示形式 常见复杂度 1.2 空间复杂度 空间复杂度全称是渐进空间复杂度&#xff0c;表示算法占用的额外存储空间与数据规模之间的增长关系 二. 数组 数组&#xff08;Array&a…

Nginx+Tomcat负载均衡

目录 Tomcat简介 Tomcat 的核心功能 Tomcat架构 Tomcat 的特点 Tomact配置 关闭防火墙及系统内核 Tomcar 主要文件信息 配置文件说明 案例一&#xff1a;Java的Web站点 案例二&#xff1a;NginxTomcat负载均衡、动静分离 Tomcat简介 Tomcat 是由 Apache 软件基金会&am…

【论文解读】ReAct:从思考脱离行动, 到行动反馈思考

认识从实践开始&#xff0c;经过实践得到了理论的认识&#xff0c;还须再回到实践去。 ——《实践论》,毛泽东 1st author: About – Shunyu Yao – 姚顺雨 paper [2210.03629] ReAct: Synergizing Reasoning and Acting in Language ModelsReAct: Synergizing Reasoning and…

简单配置RHEL9.X

切换默认运行级别 将系统默认启动模式从多用户的图形界面调整为多用户的文本界面&#xff0c;适用于优化系统资源占用或进行远程服务器管理的场景。 注意&#xff1a;安装选择“带GUI的服务器”部分常用命令默认安装&#xff1b;如果选择“最小安装”时&#xff0c;部分常用命…