您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

如何判断架构设计的优劣?

时间:2024-02-20 13:51:28  来源:微信公众号  作者:二进制跳动

架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:

简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统之前,首先要正确理解系统需求,然后才进行设计。要避免过度设计,除非有人能承担复杂性的成本。这里的“简单”强调易实施性和易理解性。接口应该自然地表达语义,让人一看方法名就能理解其功能。

模块化(Modularity):模块化强调的是将系统分解成互相独立的模块。从架构设计的角度来看,模块的接口比实现更为重要。我们应该专注于模块而不是框架,因为框架是易变的,而模块是更加稳定和可复用的。设计模块时,应忽略框架的存在,专注于模块的接口设计,并确保接口足够通用。

可测试性(Testable):设计应该以可测试性为第一目标。可测试性通常意味着低耦合,因为低耦合的模块更容易进行单元测试。模块测试的第一步是创建环境模拟,即模拟模块所依赖的其他模块。测试能够帮助我们发现架构调整的潜在问题,并且在代码重构时尤其重要。

正交分解(Orthogonal Decomposition):正交分解是指对系统进行独立且相互无关的分解过程。这个原则强调的是乘法而不是加法,即组合而不是继承。通过组合相互独立、没有相关性的模块,可以构建出我们所需的业务场景,而不是通过继承叠加能力来改造模块。

核心系统的伤害值

正交分解首先涉及确定核心系统和周边子系统。核心系统是业务的最小功能集,而周边子系统则通过逐步增加新功能来扩展系统的功能。对核心系统的变更必须谨慎对待。如果某个新功能在早期未被规划,后来又被确定为核心功能,我们必须认真评估其对现有架构的影响。周边功能方面,我们关注的是如何降低添加新功能对核心系统的影响。无论情况如何,系统都会因功能增加而变得复杂。为了减少新功能的负面影响,相关代码应尽可能地内聚,即使不写入独立的模块中,也要放在独立的文件中。这些代码被视为周边系统的功能实现代码,而不是核心系统的一部分。我们关注的是周边功能对核心系统的影响。为了添加某个功能,核心系统需要添加相关代码。根据经验,核心系统为新功能添加的代码量越少,该功能与核心系统的耦合度就越低。是否可能添加功能而不修改核心系统的代码?这是可能的,但需要核心系统提供插件机制。

我们将在后续讨论这个话题,现在暂且搁置。让我们把话题转回到架构设计质量的评估上。虽然我们已经讨论了一些架构设计的基本准则,但尚未涉及质量评估的方法。质量评估可以是定性的或定量的。定性评估方法有一定的数据支持,但可能有些主观。例如,“从某个角度来看,我感觉这个更好”。定量评估方法更理想,但目前我个人尚未听说过任何用于确定架构设计优劣的定量评估方法。今天我会介绍一些我个人想出的判断公式。这些公式都是经验性的,并没有经过严格的数学证明。假设一个架构设计方案将系统分成了n个模块,表示为:[M1, M2, ..., Mn]。其中M1是核心系统,其他模块是周边子系统。为简化起见,假设周边子系统之间是正交的,相互没有耦合。

模块的耦合度测量

我们第二个关注的问题是每个模块自身的质量,包括模块接口的质量和模块实现的质量。首先,我们来看模块接口的质量,这是模块级别最重要的部分。模块接口的质量取决于以下两个方面:

接口与业务的匹配性:接口应尽可能自然地反映业务需求。然而,从机器判断的角度来看,这一点是无法计算的,完全取决于个人主观判断。我们将在下一讲“少谈框架,多谈业务”中继续探讨这个话题。

接口的外部依赖:即模块接口对外部环境的耦合程度。下面我们将介绍模块的“耦合度测量公式”,它同时适用于模块实现和模块接口的耦合度测量。

假设我们的模块实现(或模块接口)依赖了模块A,那么我们的模块实现(或模块里的“符号”是指被引用的类型,包括typedef(类型别名)、class或struct,以及被引用的全局变量、全局函数或成员函数。

接下来,我们看模块实现(或模块接口)的所有外部依赖,即该模块的总耦合度公式为其中,耦合度A表示该模块与依赖模块A的耦合程度,如前文所述。而不成熟度系数A则表示依赖模块A的不成熟度程度。若依赖模块A完全成熟,不再发生变化,则为0;若发生非常剧烈的变动,规格甚至无法确定,则为1。

通过该耦合度测量公式,我们鼓励依赖外部成熟模块。理论上,完全成熟的模块可能仅限于语言内置的数据类型(如int、string等)。其他模块则多多少少会受到一些变化的影响,因此我们应尽量减少外部依赖。

需要注意的是,将模块接口引用的类型A改为object或interface{}类型并不能降低耦合度。换句话说,如果某参数为interface,那么这个interface的耦合度取决于实际使用时存在的各种可能类型,都会计算在依赖中。

关于耦合度测量公式,需要强调的是,它是一种经验公式,仅代表某种价值主张。在实际应用中,计算得到的具体耦合度值并没有物理意义,只能用于比较两个相同功能的系统(或模块)的架构设计方案。对于两个功能完全不同的系统(或模块)A、B,其计算结果不能用于评判彼此的好坏。

首先,我们讨论了架构设计的基本准则,它们为我们提供了一个方向。虽然这些准则不能明确指出何为好与不好,但它们指明了我们设计架构的方向。接着,我们开始对架构的优劣进行定性甚至定量的分析。考虑到核心系统的重要性,我们引入了一个伤害值来评估其纯洁度。

最后,我们针对模块自身的接口或实现,给出了耦合度测量公式。通过这些公式,我们明确了我们的架构设计的价值主张。然而,需要意识到的是,这些并不是全部。判断模块间的耦合度是复杂的。我们的公式在某种程度上只考虑了静态依赖关系,而没有考虑动态依赖。举例来说,考虑两个网络模块A和B,一个显而易见的耦合度判断是:A调用B的网络接口数量越多,说明它们之间的依赖越大;而A调用B的网络接口的次数越多,也意味着它们之间的依赖越大。



Tags:架构设计   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
京东小程序数据中心架构设计与最佳实践
一、京东小程序是什么京东小程序平台能够提供开放、安全的产品,成为品牌开发者链接京东内部核心产品的桥梁,致力于服务每一个信任我们的外部开发者,为不同开发能力的品牌商家提...【详细内容】
2024-03-27  Search: 架构设计  点击:(9)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13  Search: 架构设计  点击:(5)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  Search: 架构设计  点击:(36)  评论:(0)  加入收藏
听说你会架构设计?
一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。1. 引言当我那天拿着手机,正在和朋友们的微信群里畅聊着八卦新闻和即将到来的周...【详细内容】
2023-12-15  Search: 架构设计  点击:(150)  评论:(0)  加入收藏
云原生数据库 GaiaDB 架构设计解析:高性能、多级高可用
百度智能云团队在今年 11-12 月特别推出了四期《百度智能云数据库》系列云智公开课,为大家全面地介绍了以云原生数据库 GaiaDB 和分布式数据库 GaiaDB-X 为代表的百度智能云...【详细内容】
2023-12-13  Search: 架构设计  点击:(119)  评论:(0)  加入收藏
架构设计的目的
关于架构设计的目的,存在一些常见的误解。首先,仅仅因为架构很重要,并不意味着必须进行架构设计。重要的是理解架构为何重要。例如,有人可能认为没有架构设计,系统就无法运行,但这...【详细内容】
2023-12-06  Search: 架构设计  点击:(195)  评论:(0)  加入收藏
10个必知必会的云原生架构设计模式
在构建云原生应用程序时,采用了一些不同的软件架构方法。云原生应用程序通常采用微服务架构,以最大程度地利用云计算模型的优势。这些应用程序需要能够在动态编排和容器化环境...【详细内容】
2023-12-04  Search: 架构设计  点击:(153)  评论:(0)  加入收藏
如何做好架构设计,架构设计有章可循吗?
设计一个系统的过程,就是建造一座大厦的过程,架构设计的质量直接决定了大厦的质量。在我们进行系统的架构设计时,总是会遇到一系列的问题,比如一个大型系统的架构应该如何起步,从...【详细内容】
2023-11-24  Search: 架构设计  点击:(298)  评论:(0)  加入收藏
云计算时代下的系统技术架构设计与实践
随着云计算技术的快速发展,越来越多的企业和组织将其业务和应用迁移到云平台上。云计算为用户提供了弹性的计算资源、灵活的服务模式和高效的运维管理,成为了当今信息技术领域...【详细内容】
2023-11-16  Search: 架构设计  点击:(127)  评论:(0)  加入收藏
听说你会架构设计?来,弄一个群聊系统
群聊系统是社交应用的核心功能之一,每个社交产品几乎都有着群聊系统的身影:包括但不限于 QQ、微信、抖音、小红书等。上述介绍的技术细节可能只是群聊系统的冰山一角,像常见的...【详细内容】
2023-11-08  Search: 架构设计  点击:(212)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(4)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(5)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(8)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(114)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条