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

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

为什么要分层


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


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

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提出的尖叫架构一样,我们也需要尖叫的分层。


目录
相关文章
|
28天前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
28天前
|
监控 网络协议 安全
DNS服务器故障不容小觑,从应急视角谈DNS架构
DNS服务器故障不容小觑,从应急视角谈DNS架构
49 4
|
1月前
|
设计模式 测试技术 持续交付
架构视角下的NHibernate:设计模式与企业级应用考量
【10月更文挑战第13天】随着软件开发向更复杂、更大规模的应用转变,数据访问层的设计变得尤为重要。NHibernate作为一个成熟的对象关系映射(ORM)框架,为企业级.NET应用程序提供了强大的支持。本文旨在为有一定经验的开发者提供一个全面的指南,介绍如何在架构层面有效地使用NHibernate,并结合领域驱动设计(DDD)原则来构建既强大又易于维护的数据层。
38 2
|
1月前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
52 3
|
1月前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
6月前
|
API 持续交付 开发者
构建高效微服务架构:后端开发的新视角
【5月更文挑战第8天】 随着现代软件开发的演变,微服务架构已经成为了企业追求敏捷、可扩展和灵活部署的重要解决方案。本文将深入探讨如何构建一个高效的微服务架构,包括关键的设计原则、技术栈选择以及持续集成与部署的最佳实践。我们还将讨论微服务带来的挑战,如数据一致性、服务发现和网络延迟,并提出相应的解决策略。通过本文,后端开发者将获得构建和维护微服务系统所需的深度知识,并了解如何在不断变化的技术环境中保持系统的健壮性和可维护性。
76 8
|
5月前
|
人工智能 Cloud Native Java
从云原生视角看 AI 原生应用架构的实践
本文核心观点: • 基于大模型的 AI 原生应用将越来越多,容器和微服务为代表的云原生技术将加速渗透传统业务。 • API 是 AI 原生应用的一等公民,并引入了更多流量,催生企业新的生命力和想象空间。 • AI 原生应用对网关的需求超越了传统的路由和负载均衡功能,承载了更大的 AI 工程化使命。 • AI Infra 的一致性架构至关重要,API 网关、消息队列、可观测是 AI Infra 的重要组成。
51201 24
|
3月前
|
存储 消息中间件 JSON
|
5月前
|
消息中间件 Java 开发者
微服务架构设计与实现:Java开发者视角
微服务架构设计与实现:Java开发者视角
|
4月前
|
运维 Java Docker
业务系统架构实践问题之在某些情况下,将能力代码和业务逻辑严格分层可能是一个挑战问题如何解决
业务系统架构实践问题之在某些情况下,将能力代码和业务逻辑严格分层可能是一个挑战问题如何解决
下一篇
无影云桌面