首页 > 编程语言 >【进阶编程】结合横向设计和纵向设计来分离业务领域类

【进阶编程】结合横向设计和纵向设计来分离业务领域类

时间:2024-09-28 09:52:12浏览次数:10  
标签:库存 进阶 编程 领域 订单 模块 支付 纵向设计

        结合横向设计和纵向设计来分离业务领域类是一个常见的设计方法,特别是在复杂的企业级系统中。这个方法可以让系统在保持模块化解耦的同时,充分利用不同设计模式的优势,从而实现更高的灵活性、可扩展性和可维护性。

1.横向设计和纵向设计的结合

  • 横向设计:关注分层架构,将系统划分为不同的层次(如UI层、业务逻辑层、数据访问层),每层关注不同的职责。
  • 纵向设计:从上到下覆盖整个功能路径,将业务功能模块化,每个模块独立且具备完整的功能堆栈,从UI到数据层。

在分离业务领域类时,可以通过横向分层设计来明确不同的职责和领域逻辑,同时通过纵向设计来确保每个功能模块是独立的、完整的。

2.结合分离业务领域类的策略

在软件设计中,特别是涉及**领域驱动设计(DDD)**时,将横向设计和纵向设计结合起来进行业务领域类的分离,可以帮助设计一个灵活、可维护的系统。以下是这种结合设计的步骤和策略。

(1)确定核心领域和子领域(纵向设计)

  • 通过领域驱动设计(DDD)来划分系统中的核心领域子领域
  • 每个子领域通常会对应一个独立的业务模块,这些业务模块应该是相对独立的,可以根据业务需求单独扩展、更新或维护。
  • 这些模块通常代表了业务上的逻辑单元,比如在电商系统中,可以划分为订单管理、库存管理、支付管理等。

示例

  • 订单服务:负责订单创建、状态管理和订单查询。
  • 支付服务:处理支付相关的业务逻辑,包括支付接口、支付记录等。
  • 库存服务:处理库存的增加、减少以及库存状态检查。

(2)每个子领域内部进行分层(横向设计)

  • 在每个子领域内部,使用横向分层的设计模式,将业务逻辑进一步细分为不同的层次,如表现层、应用层、领域层和数据访问层。
  • 表现层:负责与用户界面或前端交互,处理用户请求。
  • 应用层:定义应用程序的用例,协调领域对象的操作,但不包含领域逻辑。
  • 领域层:包含领域对象、聚合根和业务逻辑,是系统的核心层。
  • 数据访问层:处理数据库的交互,负责数据的持久化。

示例

  • 在订单服务中,订单领域类放置在领域层,UI层则只负责与前端交互。订单的数据访问层负责存取订单数据,而业务逻辑层处理订单的验证、支付和状态更新。

(3)聚合根和领域对象的管理(纵向设计)

  • 聚合根是领域驱动设计中的一个重要概念,它是一个领域内负责维护业务规则和约束的对象。在纵向设计的思路下,每个子领域中的聚合根负责整个业务流程的协调。
  • 纵向设计允许将聚合根和相关的领域对象进行高度整合,确保一个功能模块可以独立于其他模块运行。

示例

  • 在订单服务中,Order类可以作为聚合根,处理订单的创建、修改、支付等操作。它可以依赖库存模块和支付模块的接口来完成整个业务流程。

(4)跨模块交互使用接口或事件(低耦合)

  • 在各个业务模块之间的交互,避免直接依赖其他模块的内部实现,可以使用接口事件驱动设计来实现跨模块的松耦合。
  • 通过**依赖注入(DI)**来注入其他模块的服务接口,使模块之间保持低耦合性,避免模块之间直接调用。

示例

  • 订单模块可以通过支付模块的接口来发起支付,而不依赖于支付模块的具体实现。库存模块也可以通过接口或消息队列与订单模块进行交互。

(5)领域服务与应用服务分离(横向设计)

  • 在横向设计中,领域服务和应用服务是需要明确分离的。
  • 领域服务:聚焦于领域逻辑,提供纯粹的业务服务。
  • 应用服务:负责领域对象的协调和组合调用。它处理的是应用层面的逻辑,比如处理用户请求,管理事务等。

示例

  • 支付模块中的领域服务只负责支付相关的业务逻辑,如支付校验、记录支付信息等;而应用服务则负责将支付请求从用户接口传递给支付领域服务进行处理。

(6)领域模型的复用与共享(横向设计)

  • 虽然在纵向设计中,各个模块是相对独立的,但通过横向设计,可以让不同领域模块之间共享某些公共的领域模型或基础服务(如日志、认证服务等)。
  • 通过共享库或者服务的形式,将公共领域类或工具方法进行横向复用,避免重复实现。

示例

  • 用户模块中的用户身份验证逻辑可以作为一个公共服务,供订单模块、支付模块和库存模块调用。

3.分离业务领域类的结合实例

电商系统设计示例:

假设一个电商系统有三个主要的业务领域:订单管理、支付处理、库存管理。

  • 纵向设计
    • 每个领域(订单、支付、库存)都可以作为一个独立的模块或微服务。
    • 订单模块聚合了订单的创建、订单状态管理、订单查询等功能。
    • 支付模块聚合了支付的验证、支付渠道接口调用和支付记录管理。
    • 库存模块负责商品库存的管理,包括库存查询和库存预留等。
  • 横向设计
    • 每个模块内部按照分层架构设计,分为表现层、应用层、领域层和数据层。
    • 订单模块的表现层处理用户的订单创建请求,应用层调用领域层的Order聚合根来执行业务逻辑,最后通过数据层将订单持久化到数据库。
    • 库存模块的表现层接收库存查询请求,领域层处理库存相关的业务逻辑,数据层访问数据库中的库存信息。
  • 跨模块交互
    • 订单模块通过支付模块的接口来完成支付请求,支付模块则通过库存模块接口来查询或预留商品库存。
    • 系统内部通过事件机制来通知模块之间的状态变化,例如订单创建成功后,触发库存模块更新库存。

4.总结

通过结合横向设计和纵向设计,可以实现业务领域类的有效分离和管理:

  • 纵向设计 确保每个业务功能模块独立,便于模块化开发和维护,适合微服务架构和DDD中的聚合管理。
  • 横向设计 帮助模块内部进行合理的职责分层,确保代码复用性和可维护性,适合复杂的分层系统架构。

两者的结合可以有效分离业务领域类,既保持系统的模块化和独立性,又增强了各模块内部的结构清晰度。

标签:库存,进阶,编程,领域,订单,模块,支付,纵向设计
From: https://blog.csdn.net/u013136510/article/details/142610404

相关文章

  • 没有网络编程就拿不下小美
    一入Java情几许?大家好,我是深山夕照深秋雨。网络编程和我们的生活息息相关。它可以让设备中的程序与网络上其他设备中的程序进行数据交互。你与小美在微信上的聊天,就要依赖网络编程来实现。基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)——WeChat 、BS架构(B......
  • 三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关
    文章目录IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点进程线程创建线程的三种方式网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码XMLXML的作用是什么?xml特点注解什么是注解?注解的使用注解的重要性注解的使用实例M......
  • 网络编程Day01
    网络编程概述地球村信件计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统网络编程的目的:无线电台---传播交流信息,数据交换......
  • 【蓝桥杯】“萌新首秀”全国高校新生编程排位赛2
    1.世上有10种人题目世上有10种人 代码#includeusingnamespacestd;intmain(){cout<<2;return0;}2.01切换题目01切换 题目分析直接判断字符串最后一个字符是0还是1就好了代码#includeusingnamespacestd;intmain(){stringstr;cin>>st......
  • 数据飞轮:解构数据技术的进阶之旅
    数据飞轮:解构数据技术的进阶之旅在这个数据驱动的时代,数据技术的演变改变了我们理解世界的方式。从数据仓库、数据中台到数据飞轮,每一次跳跃都不仅仅是技术的刷新,更是业务思维和战略执行的彻底革命。今天,我们将解构这一进化史,并结合具体的业务场景,探讨数据飞轮如何赋能产品优化和......
  • Vivado进阶-时序分析之时钟偏移
    FPGA中绝大多数电路都是同步时序电路,基本模型为“寄存器+组合逻辑+寄存器”。同步就意味着时序路径上的所有寄存器都是在时钟信号的驱动下步调一致的运行。这就要求时钟信号要在同一时间点到达所有寄存器的时钟端口。为了尽量达到这个目的,在FPGA内部提供了专用的时钟布线资......
  • 【C++进阶】AVL树的介绍及实现
    【C++进阶】AVL树的介绍及实现......
  • java+vue计算机毕设编程类题目在线评测系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和在线教育的普及,编程教育已成为培养未来科技人才的重要基石。然而,传统的编程教学模式往往受限于时间和空间的限制,难以高效、......
  • 数据结构编程实践20讲(Python版)—02链表
    本文目录02链表linked-listS1说明S2示例单向链表双向链表循环链表S3问题:反转单向链表求解思路Python3程序S4问题:双向链表实现历史浏览网页求解思路Python3程序S5问题:基于循环链表的玩家出牌顺序求解思路Python3程序往期链接01数组02链表linked-lis......
  • 防御性编程:让系统坚不可摧
    1.引言面对复杂多变的运行环境、不可预测的用户输入以及潜在的编程错误,如何确保软件在遭遇异常情况时依然能够稳定运行,是每位开发者必须面对的挑战。防御性编程(DefensiveProgramming)正是为解决这一问题而生的一种编程范式,它强调在编程过程中预见并防范潜在的错误和异常情况,从......