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

article/2025/6/9 0:29:11

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


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 stringiv_product_id  TYPE stringiv_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 stringiv_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.hkcw.cn/article/VuJWsaCaBY.shtml

相关文章

贪心算法应用:边着色问题详解

贪心算法应用:边着色问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。边着色问题是图论中的一个经典问题,贪心算法可以有效地解决它。下面我将从基础概念到具体实现,全…

基于 Amazon Q Developer CLI 和 Amazon Bedrock Knowledge Bases 实现智能问答系统

1. 引言 传统企业通常将常见问题(FAQ)发布在网站上,方便客户自助查找信息。然而,随着生成式 AI 技术的迅速发展与商业渗透,这些企业正积极探索构建智能问答系统的新途径。这类系统不仅能显著提升客户体验,…

ElasticStack对接kafka集群

背景 在当代数字化浪潮中,日志数据的高效处理对于企业运维监控和数据分析至关重要。本博文聚焦于ELK(Elasticsearch、Logstash、Kibana)技术栈与Kafka集群的深度对接,旨在探讨如何通过这一架构优化,实现高效、可靠且可…

【云计算】基础篇,含云测试

一、云计算中的底层原理 1.1 数学原理 云计算的高效运行依赖于多种数学原理的协同支撑,其核心数学原理: 1.1.1、分布式计算的数学基础 ​分治与并行模型​ ​MapReduce​:将大数据集分割为独立子任务(Map阶段),通过哈希函数分发到分布式节点并行处理,再聚合结果(Redu…

高效易用的 MAC 版 SVN 客户端:macSvn 使用体验

高效易用的 MAC 版 SVN 客户端:macSvn 使用体验 下载安装使用总结 最近有个项目要使用svn, 但是mac缺乏一款像 Windows 平台 TortoiseSVN 那样全面、高效且便捷的 SVN 客户端工具, 直到博主找到了该工具本文将结合实际使用体验,详细介绍 macSvn工具的核心…

从0到1认识EFK

一、ES集群部署 操作系统Ubuntu22.04LTS/主机名IP地址主机配置elk9110.0.0.91/244Core8GB100GB磁盘elk9210.0.0.92/244Core8GB100GB磁盘elk9310.0.0.93/244Core8GB100GB磁盘 1. 什么是ElasticStack? # 官网 https://www.elastic.co/ ElasticStack早期名称为elk。 elk分别…

TDengine 的 AI 应用实战——运维异常检测

作者: derekchen Demo数据集准备 我们使用公开的 NAB数据集 里亚马逊 AWS 东海岸数据中心一次 API 网关故障中,某个服务器上的 CPU 使用率数据。数据的频率为 5min,单位为占用率。由于 API 网关的故障,会导致服务器上的相关应用…

VMWare安装常见问题

如果之前安装过VMWare软件,只要是 15/16 版本的,可以正常使用的,不用卸载!!! 如果之前安装过,卸载了,一定要保证通过正常的渠道去卸载(通过控制面板卸载软件&#xff09…

MyBatis02——mybatis基础使用|缓存机制|sqlMapper文件|单参数和多参数传递|Statement和PreparedStatement

目录 一、搭建环境 二、核心配置文件 三、核心类 (测试类) 四、缓存机制 一级缓存 二级缓存 清理缓存 五、sqlMapper文件 六、单参数和多参数的传递 6.1取别名 6.2 测试新增返回自增主键 七、mybatis中Statement和PreparedStatement 作业 1…

Grafana-State timeline状态时间线

显示随时间推移的状态变化 状态区域:即状态时间线上的状态显示的条或带,区域长度表示状态持续时间或频率 数据格式要求(可视化效果最佳): 时间戳实体名称(即:正在监控的目标对应名称&#xf…

便捷高效能源服务触手可及,能耗监测系统赋能智能建筑与智慧城市

在建筑行业迈向智能化、精细化管理的进程中,传统建筑管理模式因信息割裂、数据利用不足等问题,逐渐难以满足现代建筑复杂的运营需求。楼宇自控系统实现了建筑设备的智能调控,BIM技术则构建了建筑的三维数字化模型,当两者相遇&…

论文阅读:CLIP:Learning Transferable Visual Models From Natural Language Supervision

从自然语言监督中学习可迁移的视觉模型 虽然有点data/gpu is all you need的味道,但是整体实验和谈论丰富度上还是很多的,也是一篇让我多次想放弃的文章,因为真的是非常长的原文和超级多的实验讨论,隔着屏幕感受到了实验的工作量之…

【连接器专题】案例:产品测试顺序表解读与应用

在查看SD卡座连接器的规格书,一些测试报告时,你可能会看到如下一张产品测试顺序表。为什么会出现一张测试顺序表呢? 测试顺序表的使用其实定义测试环节的验证的“路线图”和“游戏规则”,本文就以我人个经验带领大家一起看懂这张表并理解其设计逻辑。 测试顺序表结构 测试…

【MATLAB代码】制导方法介绍与例程——三点法|三维空间,动态目标导引(订阅专栏后可直接查看源代码)

三点法导引是一种导弹制导策略,通过计算导弹、目标和制导站之间的相对位置来确保导弹准确追踪移动目标。该方法利用三角定位和动态调整,实时更新导弹的飞行路径,以提高命中率,广泛应用于军事导弹和无人机等领域。文中有完整的matlab源代码,订阅专栏后即可查看 文章目录 代…

AUTOSAR CP——Can模块

Can模块的主要配置信息 其他相关模块 通讯框图 Can网络唤醒配置:当硬件支持的时候,可以通过Bus唤醒,见《TechnicalReference_Can_ Rscan》 P30 _5.5.1 Wakeup Functionality:RH850芯片时,在不使用SBC时,…

项目执行中缺乏灵活应对机制,如何增强适应性?

项目执行中缺乏灵活应对机制可以通过建立风险预警机制、培养团队快速响应能力、制定动态调整方案、加强团队沟通协作、引入敏捷管理理念来增强适应性。 其中,培养团队快速响应能力尤为重要。这种能力意味着当项目遇到突发状况时,团队能迅速评估问题、确定…

【无刷电机FOC进阶基础准备】【02 常用电磁名词】

目录 磁导率气隙磁感应强度磁通量磁链电感值感应电动势 本节介绍一些高频的电磁名词,大部分在高中阶段出现过,这部分内容不会很严谨,只介绍一些实用的概念。 磁导率 描述一个材料自身的磁性受外部磁场影响的能力,比如磁导率低的材…

接口自动化测试之pytest 运行方式及前置后置封装

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、Pytest 优点认知 1.可以结合所有的自动化测试工具 2.跳过失败用例以及失败重跑 3.结合allure生产美观报告 4.和Jenkins持续集成 5.很多强大的插件 pytest-htm…

PH热榜 | 2025-06-03

1. Knowledge 标语:像认识朋友一样去销售给潜在客户,因为你其实了解他们! 介绍:Knowledge 是一个针对个人的销售智能平台,它利用行为数据和心理测评来识别市场上的潜在买家,并指导销售团队以最真实、最有…

【Java】性能调优:利用 jstack 寻找 Java 程序卡顿的真相

前言 当 Java 程序出现给人感觉 “卡顿”、“响应慢”、CPU 风调高、系统给予调用总是延迟时,我们需要采用系统层和虚拟机层的合理工具来分析细节。 本文仅从 JVM 的角度来分析,研究如何利用 jstack 进行 Java 程序性能调优。 Java 程序卡顿的常规原因…