架构视角-到底如何做好分层

简介: 在进行程序开发和设计时我们常常提到分层的概念,但是怎么样的分层才是好的分层呢,这篇谈谈在如何分层这个问题上的一些体会,和大家探讨一下

为什么要分层


  系统要分层主要我觉得主要是有两个原因:


  • 存在着不同的利益相关者,有着不同的关注点
  • 软件中的不同的部分,有不同的变化频率

image.png

上图是一个常用的三层架构,其中,用户界面层面向用户,变化频率高;


业务界面层面向业务,变化频率相对较低;数据库访问层面向基础设施,变化频率低。


这样的分层带来有效地隔离了业务逻辑与数据访问逻辑,使得这两个不同关注点能够相对自由和独立地演化


怎样才是好的分层设计


分层能降低软件设计和开发复杂度,但是不恰当的分层却会导致软件的复杂度的提升,

那不好的分层有一个基本的特征就是:相邻的分层间在功能上很相似,增加的层次没有系统带来明显的能力,


常常表现为方法透传,及新增加的层次仅仅做了很少的事情,及将相关请求发送到了下层去进行处理,


如下面的代码所示:

image.png

这种分层方式在我们的日常编码中经常遇到,服务层仅仅是将用户界面的调用传递给数据库访问层,


仅仅是方法和参数的透传,这种透传带来的最大的问题就是这种分层没有为软件带来任何的价值,


如果这个层次中都充斥着这样的代码,这个层次与其相邻的层次很相似,

一般会把这个分层认为是一种架构的坏味道


如何做到好的分层设计


  说到分层,我们一般都会提到iso网络的七层模型,如下图:

image.png

从上图中大家可以看到这七层模型中,每一层都其特定的功能,可以说是功能和其提供的价值都是极为明确的,所以如何能做好分层,就是要使每分离出来的层次都有明确的功能和价值


做好分层需要避免方法的透传


  方法的透传在大多数场景下,都有一种没有增加价值,反而增加了坏复杂性的坏味道,除了向dispatch这种分发的场景,往往我们可以通过如下方法来解决方法的透传调用:


  • 直接调用方法的最终提供者,这个有时会破坏层次之间的划分,需要综合考虑


  • 将涉及的函数功能做重新的分布,对此功能所处的层次就行重新的考虑


  • 进行层次的合并,考虑是否层次的划分出现的问题



在java中,I/O 处理的这套的架构体系遭到的批判是很多的,在I/O 处理中,java使用的装饰模式,
实现了方法的透传调用,虽然在每个装饰层次中也提供了一些能力,如:buffer、Data等,
但是提供的功能相对较少,并且在IO中,提供buffer的能力应该是绝大部分场景都需要的,
所以我们对其进行功能的合并,而不是单独的将其功能实现在不同的层次中,增加了整个系统的复杂性

image.png

做好分层需要避免调用参数的透传


  调用参数在各个层次的透传,会导致一些层次的接口需要了解不是其层次应该处理的知识,这样就会导致增加系统不必要的复杂性,一般来说们可以通过如下方法来解决函数的透传:


  • 使用全局变量,这样每个层次都可以访问到这些参数,避免了参数在各个层次的透传


  • 使用context来传递参数,context通过参数在各个层次中传递,每个层次只需要访问自己所需要的,不会引入不必要的复杂性


总结


  做好分层,我们需要思考各个层次的功能和价值,就像 Robert C.Martin提出的尖叫架构一样,我们也需要尖叫的分层。


目录
相关文章
|
资源调度 前端开发 算法
鸿蒙OS架构设计探秘:从分层设计到多端部署
本文深入探讨了鸿蒙OS的架构设计,从独特的“1+8+N”分层架构到模块化设计,再到智慧分发和多端部署能力。分层架构让系统更灵活,模块化设计通过Ability机制实现跨设备一致性,智慧分发优化资源调度,多端部署提升开发效率。作者结合实际代码示例,分享了开发中的实践经验,并指出生态建设是未来的关键挑战。作为国产操作系统的代表,鸿蒙的发展值得每一位开发者关注与支持。
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
625 0
|
人工智能 Cloud Native Java
从云原生视角看 AI 原生应用架构的实践
本文核心观点: • 基于大模型的 AI 原生应用将越来越多,容器和微服务为代表的云原生技术将加速渗透传统业务。 • API 是 AI 原生应用的一等公民,并引入了更多流量,催生企业新的生命力和想象空间。 • AI 原生应用对网关的需求超越了传统的路由和负载均衡功能,承载了更大的 AI 工程化使命。 • AI Infra 的一致性架构至关重要,API 网关、消息队列、可观测是 AI Infra 的重要组成。
54410 134
|
Serverless 决策智能 UED
构建全天候自动化智能导购助手:从部署者的视角审视Multi-Agent架构解决方案
在构建基于多代理系统(Multi-Agent System, MAS)的智能导购助手过程中,作为部署者,我体验到了从初步接触到深入理解再到实际应用的一系列步骤。整个部署过程得到了充分的引导和支持,文档详尽全面,使得部署顺利完成,未遇到明显的报错或异常情况。尽管初次尝试时对某些复杂配置环节需反复确认,但整体流程顺畅。
333 3
|
数据库
分层架构
表现层(Presentation Layer):处理用户界面和用户交互逻辑。 业务逻辑层(Business Logic Layer):处理业务相关的逻辑和规则。 数据访问层(Data Access Layer):负责与数据库或其他数据源进行 [Something went wrong, please try again later.]。
|
监控 网络协议 安全
DNS服务器故障不容小觑,从应急视角谈DNS架构
DNS服务器故障不容小觑,从应急视角谈DNS架构
399 4
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
1924 10
|
设计模式 测试技术 持续交付
架构视角下的NHibernate:设计模式与企业级应用考量
【10月更文挑战第13天】随着软件开发向更复杂、更大规模的应用转变,数据访问层的设计变得尤为重要。NHibernate作为一个成熟的对象关系映射(ORM)框架,为企业级.NET应用程序提供了强大的支持。本文旨在为有一定经验的开发者提供一个全面的指南,介绍如何在架构层面有效地使用NHibernate,并结合领域驱动设计(DDD)原则来构建既强大又易于维护的数据层。
223 2
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
481 3
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构