前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >阿里P8架构师都是怎么分析软件模型的?

阿里P8架构师都是怎么分析软件模型的?

作者头像
JavaEdge
发布于 2021-12-07 05:34:46
发布于 2021-12-07 05:34:46
3290
举报
文章被收录于专栏:JavaEdgeJavaEdge

面对一个新项目,如何理解它的模型呢?

要先知道项目提供了哪些模型,模型又提供了怎样的能力。若只知道这些,你只是在了解别人设计的结果,这不足以支撑你后期对模型的维护。

在一个项目中,常常会出现新人随意向模型中添加内容,修改实现,让模型变得难以维护。原因在于对模型的理解不够

模型都是为解决问题,理解一个模型,需要了解在没有这个模型之前,问题是如何被解决的? 这样,你才能知道新的模型究竟提供了怎样的提升,这是理解一个模型的关键。

本文以Spring的IoC容器为例,来看看怎样理解软件的模型。

耦合的依赖

Spring的根基就是IoC容器,即“ 控制反转”,也叫依赖注入。

IoC容器是为了解决什么问题呢?

组件创建和组装问题。

为什么这是个亟待解决的问题?

软件设计需要有个分解过程,必然还面对一个组装过程,即将分解出的各组件组装到一起完成功能。

案例

某博客服务提供:根据标题查询博客。

ArticleService处理业务过程中,需用ArticleRepository辅助完成功能,即ArticleService依赖ArticleRepository。

这时你会怎么做?

直男做法,在 ArticleService新增一个ArticleRepository字段:

看起来好像还行。 那这个字段怎么初始化?

直男反应:直接new!

看起好还能用,但实际上DBArticleRepository不能这样初始化。 就如实现类的名字,这里要用到DB。但在真实的项目中,由于资源所限,一般不会在应用中任意打开DB连接,而是会共享DB连接。 所以,DBArticleRepository需要一个DB连接(Connection)参数。

于是你决定通过构造器把这个参数传入:

看上去也还正常。既然开发完了,那么开始测试吧: 要让ArticleService跑起来,就得让ArticleRepository也跑起来;就得准备好DB连接。

是不是太麻烦,想放弃测试了?。但你还是决定坚持一下,去准备DB连接信息。

然后,真正开始写测试时,发现,要测试,还要在DB里准备数据:

  • 测查询,得事先插入一些数据吧,看查出来的结果和插入的数据是否一致
  • 测更新,得先插入数据,测试跑完,再看数据更新是否正确

咬咬牙准备了一堆数据,你开始困惑了:我在干什么?我不是要测试服务吗?做数据准备不是测试仓库的时候该做的事吗?

所以,你发现问题在哪了吗?

在你创建对象的那刻,问题就出现了。

分离的依赖

当我们创建一个对象时,就必须要有个实现类,即DBArticleRepository。 虽然ArticleService写得很干净,其他部分根本不依赖DBArticleRepository,只在构造器里依赖,但依赖就是依赖。

而且由于要构造DBArticleRepository,还引入了Connection类,该类只与DBArticleRepository的构造有关系,与ArticleService业务逻辑毫无关系。

只是因为引入一个具体实现,就需要把它周边全部东西引入,而这一切都与业务类本身的业务逻辑没一毛钱关系。 这就像是,你原本打算买套房子,现在却让你必须了解怎么和水泥、砌墙、怎么装修、户型怎么设计、各个家具怎么组装,而你想要的只是一套能住的婚房。

实际项目,构建一个对象可能牵扯更多内容:

  • 根据不同的参数,创建不同的实现类对象,你可能需要用到工厂模式
  • 为了解方法执行时间,需要给被依赖的对象加上监控
  • 依赖的对象来自于某个框架,你自己都不知道具体的实现类咋样的

即便是最简单的对象创建和组装,看起来也不是多简单。

直接构造存在这么多问题,最简单的就是把创建的过程拿出去,只留下与字段关联的过程:

这时的ArticleService就只依赖ArticleRepository。 测试ArticleService也很简单,只要用一个对象模拟ArticleRepository的行为。通常这种模拟对象行为的工作用一个现成的程序库就可以完成,就是那些Mock框架。

之前的代码里,如果我用Mock框架模拟Connection类是不是也可以? 理论上,是可以。但是想要让ArticleService的测试通过,就必须打开DBArticleRepository的实现,只有配合着其中的实现,才可能让ArticleService跑起来。显然,你跑偏了。

对象的创建已经分离了出去,但还是要要有一个地方完成这个工作,最简单的解决方案自然是,把所有的对象创建和组装在一个地方完成:

相比业务逻辑,组装过程很简单,仅仅是个对象创建及传参。 最好的解决方案就是有个框架。Java的这种组装一堆对象的东西一般被称为“容器”。

至此,一个容器就此诞生。它解决的是依赖问题,把被依赖的对象注入到目标对象,所以叫“依赖注入”(Dependency Injection,简称 DI)。这个容器就叫DI容器。

这种创建和组装对象的方式在当年引发了很大的讨论,直到最后Martin Fowler写了一篇《反转控制容器和依赖注入模式》,才算把大家的讨论做了一个总结,行业里总算达成共识。

说了这么多,和我们要讨论的“模型”有什么关系?

很多人习惯性把对象的创建和组装写到了一个类里,导致代码出现大量耦合。 也导致项目很难测试,可测试性是衡量设计优劣的一个重要标准。

有了IoC容器后,你的代码就只剩下关联的代码,对象的创建和组装都由IoC容器完成。不经意间,还做到了面向接口编程,实现是可以替换的,且可测试。 容器概念还能继续增强。比如,我们想给所有与数据库相关的代码加上时间监控,只要在容器构造对象时添加处理即可。这就是 AOP,而这些改动,对业务代码透明。 但还是很多程序员即便用Spring,依然是自己构造对象,静态方法随便写。

总结

理解模型,要知道项目提供了哪些模型,这些模型都提供了怎样的能力。 更重要的是了解模型设计的渊源:

  • 可增进对它的了解
  • 也会减少我们对模型的破坏或滥用

IoC容器有效地解决了对象的创建和组装的问题,让程序员们拥有了一个新的编程模型。

按照这个编程模型去写代码,整体的质量会得到大幅度的提升,也会规避掉之前的许多问题。这也是一个好的模型对项目起到的促进作用。像DI这种设计得非常好的模型,你甚至不觉得自己在用一个特定的模型在编程。

理解模型,要了解模型设计的来龙去脉。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/10/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
重新温习软件设计之路(2)
我们在职业生涯中肯定有去接手和维护一个已有项目的时候,项目到来时,我们大部分时候可能都会首先就去看源代码。但是,过不了多久就开始打退堂鼓了。
Edison Zhou
2021/01/13
1K0
重新温习软件设计之路(2)
轻松理解.NET控制反转和依赖注入
在软件工程领域,特别是在 C# 和 .NET 的上下文中,控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)是增强代码模块化、可测试性和可维护性的基本原则。这些范式允许开发人员通过将依赖关系的创建和管理与业务逻辑分离,构建松耦合、灵活的应用程序。
郑子铭
2024/07/12
4350
轻松理解.NET控制反转和依赖注入
Java Web框架篇之Spring「建议收藏」
可以看出,这种方式有两个问题: (1)业务代码与单例/工厂模式的模板代码放在一个类里,耦合性较高; (2)大量重复的单例/工厂模式的模板代码,需要自己管理对象间复杂的依赖关系
全栈程序员站长
2022/09/08
4440
谈谈 Spring IOC
学习过 Spring 框架的人一定都会听过 Spring 的 IoC(控制反转) 、DI (依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对 Spring Ioc 的理解。
JavaFish
2019/10/17
5040
Spring IoC 总结
Spring框架是学习 Java 开发必不可少的技术之一,其中的IoC(控制反转)便是重要的组成部分。本文旨在为读者提供一份完整的、易懂的Spring IoC入门指南,加深读者对Spring框架的理解,从而提升基于Spring框架开发的工作效率。
windealli
2023/10/13
3090
Spring IoC 总结
Spring系列第2篇:控制反转(IoC)与依赖注入(DI),晦涩难懂么?
Spring中有3个核心的概念:控制反转(Ioc)、依赖注入(DI)、面向切面编程(AOP),spring中其他的技术都是依靠3个核心的技术建立起来的,所以玩spring需要先对这3个概念有个深入的理解。
路人甲Java
2020/02/18
6430
Spring IoC的基本概念
在 Java 中,出现了大量轻量级容器,这些容器有助于将来自不同项目的组件组装成一个有凝聚力的应用程序。这些容器的底层是它们如何执行布线的常见模式,它们将这一概念称为“控制反转”。
不惑
2024/03/12
2680
Spring IoC的基本概念
深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能、易扩展以及易复用的程序。其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC、DI以及Ioc容器等概念。通过本文我们将一起学习这些概念,并理清他们之间微妙的关系。 ---- 目录 前言 依赖倒置原则(DIP) 控制反转(IoC) 依赖注入(DI) IoC容器 总结 ---- 前言 对于大部分小菜来说,当听到大牛们高谈DIP、IoC、DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些“高大上”的名词,理解起来也并不是那么的难
刘皓
2018/04/03
1.2K0
深入理解DIP、IoC、DI以及IoC容器
Spring基础小结
Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。
WindCoder
2018/09/19
5980
Spring基础小结
Spring中控制反转究竟反转的什么
控制反转(Inversion of Control, IoC)是一种软件设计原则,它将传统的程序设计中的控制权从应用程序代码转移到框架或容器,从而实现了松耦合和更好的可维护性。
codetrend
2024/04/28
2510
Spring中控制反转究竟反转的什么
Spring依赖注入的魔法:深入DI的实现原理【beans 五】
在软件开发的舞台上,依赖注入是一个强大的设计模式,而Spring框架以其优雅的实现而脱颖而出。你可能已经使用了DI,但你是否真正了解它的实现原理呢?在这篇文章中,我们将打开DI的黑盒,揭开Spring DI的神秘面纱,让你更深刻地理解这一关键的框架特性。
一只牛博
2025/05/30
1100
Spring依赖注入的魔法:深入DI的实现原理【beans 五】
Spring IOC知识点一网打尽!
前言 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工厂模式,总的来说还是非常值得的! 本来想的是刷完《Spring 实战 (第4版)》和《精通Spring4.x 企业应用开发实战》的IOC章节后来重新编写一篇IOC的文章的,看了一下之前已经写过的入门系列Spring入门这一篇就够了和Spring【依赖注入】就是这么简单。最主要的知识点都已经讲过了,所以感觉就没必要重新来编写这些知识点了…
Java3y
2018/06/11
6330
浅析IOC 和 DI
  学习过spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。
Kevin_Zhang
2021/06/10
1.2K0
spring八股记录
model(模型:service、daomapper);view(视图:jsp);controller(控制:servlet)
用户11204257
2024/12/04
1010
介绍依赖注入,依赖查找,控制反转--php实例
不是我自身的,却是我需要的,都是我所依赖的。一切需要外部提供的,都是需要进行依赖注入的。
OwenZhang
2022/01/05
5320
介绍依赖注入,依赖查找,控制反转--php实例
IOC --- 控制反转
IOC,全称为 Inversion of Control(控制反转),是一种重要的编程思想,它可以帮助我们更好地管理程序中的依赖关系。在IOC的基础上,依赖注入(Dependency Injection,DI)是一种实现IOC的技术手段,它可以提高代码「可测试性」,「可维护性」,「可拓展性」。
Niuery Diary
2023/10/22
2310
IOC --- 控制反转
深入了解 Spring Boot 核心特性、注解和 Bean 作用域
Spring Boot 是基于 Spring Framework 构建应用程序的框架,Spring Framework 是一个广泛使用的用于构建基于 Java 的企业应用程序的开源框架。Spring Boot 旨在使创建独立的、生产级别的 Spring 应用程序变得容易,您可以"只是运行"这些应用程序。
小万哥
2023/07/30
4050
深入了解 Spring Boot 核心特性、注解和 Bean 作用域
依赖注入
讲真的,今年就业形势相当不好,对IT从业者的专业能力要求将变得更高。近来一边忙学业,一边学习Java基础和框架源码,为不久之后的招聘做准备。
用户2987604
2020/06/15
1.8K0
关于 Spring :松耦合、可配置、IOC、AOP
SpringFramework 是一个开源的、松耦合的、分层的、可配置的一站式企业级 Java 开发框架,它的核心是 IOC 与 AOP ,它可以更容易的构建出企业级 Java 应用,并且它可以根据应用开发的组件需要,整合对应的技术。
訾博ZiBo
2025/01/06
690
Spring IOC 是如何实现降低耦合度的?
在软件开发过程中,耦合度是一个非常重要的概念。高耦合度意味着代码之间的依赖性强,导致系统难以扩展、维护和测试。为了解决这个问题,Spring 框架引入了 IOC(控制反转)机制,它能够显著降低耦合度,提高代码的可维护性和可测试性。本文将详细讨论 Spring IOC 是如何实现降低耦合度的。
网络技术联盟站
2023/07/03
4600
Spring IOC 是如何实现降低耦合度的?
相关推荐
重新温习软件设计之路(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档