百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

女朋友强依赖我!我引入IOC后,从此我们的关系微妙而稳固

ccwgpt 2024-10-07 07:05 35 浏览 0 评论

此文从面向对象设计角度分析依赖倒置原则,引入依赖注入,IOC相关内容进行探讨,文中引用女朋友案例可能引起分手风险,故理解为 new 对象


想起在学校的时候,有一个任务就是设计一款宠物商店项目。那时候引入三层架构设计概念,分为UI(表现层)、BLL(业务逻辑层),DAL(数据访问层)。


▲图/ 简单三层架构示例


每一层各司其职,表现层只管负责用户的界面交互;业务逻辑层只管计算、验证,业务规则等等;数据访问层则负责与数据库的增、删、改,查。


设计完交差后,就会思考,为啥要使用这个,能给我带来什么好处。学完面向对象设计思想之后得出了答案,当时判定程序的良好基本可以通过“高内聚,低耦合”的方式。



确实,三层架构设计能够符合程序的高内聚,达到解耦的目的,但是并没有达到低耦合的层级,自上而下层层依赖,其耦合性还是相对较高。或许当时设计的项目相对较简单,没有直接体现出来。


工作之后才发现,三层架构设计的应用还是相对较广,曾经就有一些项目运用三层架构之后,不断的需求变更导致一层的改动,都会造成联级改动。


如果要解决这个问题,面向对象设计中有一个设计原则,就是依赖倒置原则(DIP)


高层模块不应该依赖低层模块,两者都应依赖于抽象层。

抽象层不应该依赖于实现,实现应该依赖于抽象。


模块间的依赖通过抽象发生的,实现类之间不发生直接的依赖关系,依赖关系是通过接口或者抽象类产生的。


这个原则听起来很像是“针对接口编程,不针对实现编程”,的确很相似,然而这里更强调“抽象”。这里就是要求设计者们编程时需要有一定的抽象思维啦。


依赖倒置的原则,也可以让三层架构升级,具有抽象化。


▲图/ 升级抽象化三层架构示例


当然DIP的主要目的并不是这,目的就是为了让系统架构更加的稳定、更加灵活,更好的应对需求的变化


无论多少种设计模式或者多少种设计原则,主要就是让系统稳定,能够应付需求的千变万化,并不是花里胡哨的存在。毕竟,相对于细节的多变性,抽象化会更加稳定。


那么程序中要使用依赖倒置原则,一个呼声最高的名词就是控制反转(Inversion of Control),简称IOC


IOC的存在可以说是更好的实现依赖倒置原则,也让程序更加的灵活和稳固。


至于怎么理解这个IOC呢,可以请出女朋友的例子来说明。


女朋友饿了,想要吃这吃那,对食物有需求。


此时会怎么做呢?


1.自己去找吃的,去冰柜或者厨房去拿吃的。


2.找男朋友,向你撒娇,给她递食物。


第一种,女朋友可能不太聪明,也不会做饭,拿到的食品没有加工,或者没有清洗就直接吃,会存在一定的风险。


第二种,向男朋友撒娇,表达需求。此时你可能会表现出男友力Max,会去冰柜里拿出食物并洗干净给她,或者进厨房做饭给她吃,甚至还可以喂她。


啊?你要上班或者出差不在家?此时你女朋友发现隔壁邻居老王很富有且很会做饭,便向隔壁老王打电话撒娇表达需求,此时隔壁老王会做一手拿手好菜端到你女友面前并喂她。


我们可以看到,你的女朋友从对食物的需求,从主动去冰柜或者厨房(正转)获取食物,到想要吃食物而被动(你或者老王)获得(反转)食物。


女朋友对食物的需求,食物的控制权转移到了你或者老王的手上。


编程时,相当于组件对象控制权的转移。


例如,方法A中需要使用方法B,方法B需要使用方法C,此时方法B和方法C并不由自己本身来负责,而是由第三方来创建!


这个过程,称为控制反转,最直观的体现就是依赖注入(DI),反转依赖。


上述例子,女朋友想要的是食物(依赖,对食物的依赖),食物由第三方的你(男朋友)或者老王来负责,做好之后拿给(注入)你女朋友。


控制反转的是一种结果,一种由依赖食物到注入给定目标的结果。正是因为有了依赖注入,才需要控制反转,控制依赖的对象的选择权反转到目标结果。


如果明白了以上的内容,就能明白依赖注入和控制反转的目的。


为什么要依赖注入?因为要实现控制反转


为什么要控制反转?因为软件设计体系中需要符合依赖倒置原则


说到IOC(控制反转),我们会听到IOC容器的概念,IOC和IOC容器也有本质的区别。


IOC,定义就是一种反转流、依赖和接口的方式,它把传统上由程序代码直接操控的对象的调用权交给第三方(容器),通过第三方来实现对象组件的装配和管理。


所谓的IOC容器,可以理解为一个对象,通常是由依赖注入框架来提供的。负责映射依赖、管理对象的创建和生命周期。


说到IOC对象,我想大家应该有一个概念,就是对象池的概念。IOC容器可以理解为一个对象池的概念。


例如耳熟能详的数据库连接池,线程池等都是对象池的概念。


所谓的对象池,就是对象的容器,通过在一个容器中池化(实例化,也就是new)对象,并根据需要重复使用这些池化对象来满足性能上的需求。


当一个对象被激活时,便从池子里取出。用完时,又放回池中,等待下一个请求。一般用于对象的初始化过程代价较大或者使用频率较高的场景。


通俗讲,就是多个对象的实例化,资源释放都是交给对象池来处理。

依赖注入框架,目前使用较多的有 Unity、Autofac、Ninject等。


相关的框架也可以通过搜集文档进行了解,此处以Unity框架作为例子来实现。


▲图/ 抽象化鸟类示例






以上内容,就是依赖倒置原则,IOC的内容了。


希望能够帮助到伙伴们,文中示例有可能引发分手风险,在此希望多加支持点个赞!

相关推荐

一个基于.Net Core遵循Clean Architecture原则开源架构

今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...

AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%

写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...

OneCode低代码平台的事件驱动设计:架构解析与实践

引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...

国内大厂AI插件评测:根据UI图生成Vue前端代码

在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...

AI+低代码技术揭秘(二):核心架构

本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...

GitDiagram用AI把代码库变成可视化架构图

这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...

30天自制操作系统:第六天:代码架构整理与中断处理

1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...

AI写代码越帮越忙?2025年研究揭露惊人真相

近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...

一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具

一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...

5分钟掌握 c# 网络通讯架构及代码示例

以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...

从复杂到优雅:用建造者和责任链重塑代码架构

引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...

低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈

专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...

框架设计并不是简单粗暴地写代码,而是要先弄清逻辑

3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...

大佬用 Avalonia 框架开发的 C# 代码 IDE

AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...

轻量级框架Lagent 仅需20行代码即可构建自己的智能代理

站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...

取消回复欢迎 发表评论: