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

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

为什么要分层


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


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

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


相关文章
|
6天前
|
负载均衡 关系型数据库 应用服务中间件
高可用系列文章之二 - 传统分层架构技术方案
高可用系列文章之二 - 传统分层架构技术方案
|
6月前
|
设计模式 编译器 Go
掌握Go类型内嵌:设计模式与架构的新视角2
掌握Go类型内嵌:设计模式与架构的新视角
33 0
|
6月前
|
设计模式 Cloud Native JavaScript
掌握Go类型内嵌:设计模式与架构的新视角1
掌握Go类型内嵌:设计模式与架构的新视角
43 0
|
6天前
|
API 持续交付 开发者
构建高效微服务架构:后端开发的新视角
【5月更文挑战第8天】 随着现代软件开发的演变,微服务架构已经成为了企业追求敏捷、可扩展和灵活部署的重要解决方案。本文将深入探讨如何构建一个高效的微服务架构,包括关键的设计原则、技术栈选择以及持续集成与部署的最佳实践。我们还将讨论微服务带来的挑战,如数据一致性、服务发现和网络延迟,并提出相应的解决策略。通过本文,后端开发者将获得构建和维护微服务系统所需的深度知识,并了解如何在不断变化的技术环境中保持系统的健壮性和可维护性。
44 8
|
6天前
|
消息中间件 Java 持续交付
构建高效微服务架构:后端开发的新视角
【5月更文挑战第15天】在现代软件开发的浪潮中,微服务架构已成为推动技术创新和服务灵活性的关键因素。本文将探讨如何构建一个高效的微服务架构,包括关键的设计原则、技术栈选择以及持续集成与部署的最佳实践。通过分析微服务的优势和挑战,我们将为后端开发人员提供一个全面的指导,帮助他们在构建可扩展、容错且易于维护的系统时做出明智的决策。
|
6天前
|
负载均衡 JavaScript Java
构建高效微服务架构:后端开发的新视角
【5月更文挑战第13天】在现代软件开发中,微服务架构已经成为一种流行趋势。它通过将应用程序拆分为一组小型、独立的服务来提高可扩展性、弹性和可维护性。本文将探讨如何构建一个高效的微服务架构,包括选择合适的技术栈、设计良好的服务接口、确保数据一致性以及实现有效的服务发现和负载均衡。
|
6天前
|
人工智能 安全 大数据
SDN(软件定义网络)——重塑网络架构的新视角
SDN(软件定义网络)是网络架构革新的关键,通过分离控制与数据平面,实现网络的灵活、高效管理。未来,SDN将更广泛应用于各行业,与云计算、大数据、AI融合,推动数字化转型。开放与标准化的趋势将促进SDN生态发展,提供以业务需求为导向、智能化自动化管理及增强网络安全的新视角。SDN将在更多领域扮演重要角色,支持网络技术的创新与进步。
|
6天前
|
监控 数据管理 API
构建高效微服务架构:后端开发的新视角
【4月更文挑战第12天】在当今快速演变的技术景观中,微服务架构已成为实现灵活、可扩展和容错性高的企业级应用的关键。本文深入探讨了构建高效微服务架构的先进策略和技术实践,旨在为后端开发者提供一种创新的视角来设计和部署可维护且性能卓越的分布式系统。通过分析微服务设计原则、容器化技术、API网关以及持续集成与持续部署(CI/CD)流程,文章揭示了如何优化服务拆分、数据管理、安全性和监控机制,以支撑动态的业务需求和不断变化的市场环境。
|
6天前
|
消息中间件 安全 数据管理
构建高效微服务架构:后端开发的新视角
【4月更文挑战第12天】在现代软件开发领域,微服务架构已成为一种主流设计模式,它通过将应用程序拆分为一系列小型、独立的服务来提高系统的可维护性、扩展性和技术灵活性。本文深入探讨了构建高效微服务架构的关键要素,包括服务划分原则、通信机制、数据管理以及安全性考量。我们将从后端开发的角度出发,分析如何利用最新的技术栈和最佳实践来构建一个既健壮又灵活的微服务系统。
20 2
|
6天前
|
分布式计算 API 数据处理
Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
【2月更文挑战第15天】Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
75 1