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

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


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.pswp.cn/diannao/85632.shtml

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

相关文章

Registry和docker有什么关系?

当遇到多个服务器需要同时传docker镜像的时候,一个一个的传效率会非常慢且压力完全在发送方的网络带宽;可以参考git hub,通常我们会用git push将代码传到git hub,如果谁需要代码用git pull就可以拉到自己的机器上,dock…

linux命令 systemctl 和 supervisord 区别及用法解读

目录 基础与背景服务管理范围配置文件和管理方式监控与日志依赖管理适用场景常用命令对照表实际应用场景举例优缺点对比小结参考链接 1. 基础与背景 systemctl 和 supervisord 都是用于管理和控制服务(进程)的工具,但它们在设计、使用场景和…

(11)java+ selenium->元素定位之By_tag_name

1.简介 继续WebDriver关于元素定位,这篇介绍By ClassName。tagName是DOM结构的一部分,其中页面上的每个元素都是通过输入标签,按钮标签或锚定标签等标签定义的。每个标签都具有多个属性,例如ID,名称,值类等。就其他定位符而言在Selenium中,我们使用了标签的这些属性值来…

2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告 | 珂学家

前言 题解 2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告。 模拟题为主,包含进制转换等等。 最后一题,是对向量/自定义类型,重定义小于操作符。 7-1 人工智能打招呼 分值: 15分 考察点: 分支判定&…

day42 简单CNN

目录 一、从图像分类任务谈起 二、CNN架构解剖实验室 2.1 卷积层:空间特征的魔法师 2.2 归一化层:加速收敛的隐形推手 2.3 激活函数:非线性的灵魂 三、工程实践避坑指南 3.1 数据增强工程 3.2 调度器工程实战 四、典型问题排查手册 …

Gitee Wiki:以知识管理赋能 DevSecOps,推动关键领域软件自主演进

关键领域软件研发中的知识管理困境 传统文档管理模式问题显著 关键领域软件研发领域,传统文档管理模式问题显著:文档存储无系统,查找困难,降低效率;更新不及时,与实际脱节,误导开发&#xff1…

清理 pycharm 无效解释器

1. 起因, 目的: 经常使用 pycharm 来调试深度学习项目,每次新建虚拟环境,都是显示一堆不存在的名称,删也删不掉。 总觉得很烦,是个痛点。决定深入研究一下。 2. 先看效果 效果是能行,而且清爽多了。 3. …

【ConvLSTM第二期】模拟视频帧的时序建模(Python代码实现)

目录 1 准备工作:python库包安装1.1 安装必要库 案例说明:模拟视频帧的时序建模ConvLSTM概述损失函数说明(python全代码) 参考 ConvLSTM的原理说明可参见另一博客-【ConvLSTM第一期】ConvLSTM原理。 1 准备工作:pytho…

MySQL DDL操作全解析:从入门到精通,包含索引视图分区表等全操作解析

目录 一、DDL 基础概述 1.1 DDL 定义与作用 1.2 DDL 语句分类 1.3 数据类型与存储引擎 1.3.1 数据类型 1.3.2 存储引擎差异 二、基础 DDL 语句详解 2.1 创建数据库与表 2.1.1 创建数据库 2.1.2 创建表 2.2 修改表结构 2.2.1 添加列 2.2.2 修改列属性 2.2.3 删除列…

设计模式——抽象工厂设计模式(创建型)

摘要 抽象工厂设计模式是一种创建型设计模式,旨在提供一个接口,用于创建一系列相关或依赖的对象,无需指定具体类。它通过抽象工厂、具体工厂、抽象产品和具体产品等组件构建,相比工厂方法模式,能创建一个产品族。该模…

Express教程【006】:使用Express写接口

文章目录 8、使用Express写接口8.1 创建API路由模块8.2 编写GET接口8.3 编写POST接口 8、使用Express写接口 8.1 创建API路由模块 1️⃣新建routes/apiRouter.js路由模块: /*** 路由模块*/ // 1-导入express const express require(express); // 2-创建路由对象…

【iOS(swift)笔记-14】App版本不升级时本地数据库sqlite更新逻辑二

App版本不升级时,又想即时更新本地数据库怎么办? 办法二:从服务器下载最新的sqlite数据替换掉本地的数据(注意是数据不是文件) 稍加调整, // !!!注意!&…

Mac电脑_钥匙串操作选项变灰的情况下如何删除?

Mac电脑_钥匙串操作选项变灰的情况下如何删除? 这时候 可以使用相关的终端命令进行操作。 下面附加文章《Mac电脑_钥匙串操作的终端命令》。 《Mac电脑_钥匙串操作的终端命令》 (来源:百度~百度AI 发布时间:2025-06)…

对接系统外部服务组件技术方案

概述 当前系统需与多个外部系统对接,然而外部系统稳定性存在不确定性。对接过程中若出现异常,需依靠双方的日志信息来定位问题,但若日志信息不够完整,会极大降低问题定位效率。此外,问题发生后,很大程度上依赖第三方的重试机制,若第三方缺乏完善的重试机制,就需要手动…

WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验

一、WAF绕过文件上传漏洞 win7:10.0.0.168 思路:要想要绕过WAF,第一步是要根据上传的内容找出来被拦截的原因。对于文件上传有三个可以考虑的点:文件后缀名,文件内容,文件类型。 第二步是根据找出来的拦截原…

一文学会c++中的内存管理知识点

文章目录 c/c内存管理c语言动态内存管理c动态内存管理new/delete自定义类型妙用operator new和operator delete malloc/new,free/delete区别 c/c内存管理 int globalVar 1;static int staticGlobalVar 1;void Test(){static int staticVar 1;int localVar 1;in…

深入解析Linux死锁:原理、原因及解决方案

Linux死锁是系统资源管理的致命陷阱,平均每年导致全球数据中心约​​3.7亿小时​​的服务中断。本文深度剖析死锁形成的​​四个必要条件​​和六种典型死锁场景,结合Linux内核源码层级的资源管理机制,揭示文件系统锁、内存分配、多线程同步等…

SKUA-GOCAD入门教程-第八节 线的创建与编辑2

8.1.3根据线创建曲线 (1)从线生成线 这个命令可以将一组曲线合并为一条曲线。每个输入曲线都会成为新曲线内的一个部分。 1、选择 Curve commands > New > Curves 打开对话框。 图1 根据曲线创建曲线 在“name”框中

『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)

目录 预览效果思路分析downloadTxt 方法readTxt 方法 完整代码总结 欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新中 预览效果 思路分析 downloadTxt 方法 该方法主要完成两个任务: 下载 txt 文件:通…

攻防世界-unseping

进入环境 在获得的场景中发现PHP代码并进行分析 编写PHP编码 得到 Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czozOiJwd2QiO319 将其传入 想执行ls,但是发现被过滤掉了 使用环境变量进行绕过 $a new…