首页 > 其他分享 >软件设计中 高扇入,高扇出是啥?

软件设计中 高扇入,高扇出是啥?

时间:2024-07-08 22:43:40浏览次数:17  
标签:调用 模块 软件设计 高扇 扇入 func 组件

在软件设计和架构中,“高扇入”(High Fan-In)是一个重要的概念,它描述了一个模块或组件被其他模块或组件调用的频率和广度。具体来说:

高扇入(High Fan-In)


定义:高扇入是指一个模块或组件被多个其他模块或组件调用或依赖的情况。这意味着该模块是一个常用的功能模块,很多其他模块都依赖它来完成某些工作。

示例


假设我们有一个日志组件 Logger,它被应用程序中的多个模块调用来记录日志信息:
go   Copy
type Logger struct{}

func (l *Logger) Log(message string) {
    fmt.Println(message)
}

// 应用程序中的多个模块
func ModuleA(logger *Logger) {
    logger.Log("Module A is running")
}

func ModuleB(logger *Logger) {
    logger.Log("Module B is running")
}

func main() {
    logger := &Logger{}
    ModuleA(logger)
    ModuleB(logger)
}

在这个例子中,Logger 组件具有高扇入,因为它被 ModuleA 和 ModuleB 两个模块调用。

高扇入的优点


  1. 代码复用:高扇入通常意味着高复用率,这可以减少代码重复,提高代码的可维护性。
  2. 集中管理:集中管理某些通用功能(如日志记录、错误处理等),有助于保证系统的一致性和统一性。

高扇入的缺点


  1. 单点故障:如果高扇入的模块出现故障,可能会影响到依赖它的所有其他模块。
  2. 复杂性增加:随着依赖模块的增加,高扇入的模块可能变得过于复杂,难以维护和理解。
  3. 性能瓶颈:过多的调用可能会导致性能瓶颈,特别是在高并发环境下。

如何处理高扇入


  1. 解耦和抽象:利用设计模式(如依赖注入、代理模式等)来解耦高扇入模块和调用它的模块。
  2. 模块化设计:将高扇入的功能模块化,尽量减少不必要的依赖。
  3. 负载均衡:在高并发场景下,可以考虑使用负载均衡或其他优化手段来分担负载。

结论


高扇入是软件设计中的一个重要概念,它反映了模块之间的依赖关系和调用频率。理解和合理管理高扇入,可以帮助我们设计出更高效、可维护的系统。         在软件设计和架构中,“高扇出”(High Fan-Out)是另一个重要的概念,它描述了一个模块或组件调用其他模块或组件的广度和频率。具体来说:

高扇出(High Fan-Out)


定义:高扇出是指一个模块或组件调用或依赖多个其他模块或组件的情况。这意味着该模块具有多个下游依赖,它需要与许多其他模块进行交互来完成其功能。

示例


假设我们有一个控制器模块 Controller,它需要调用多个服务模块来完成某个业务逻辑:
go   Copy
type ServiceA struct{}
type ServiceB struct{}
type ServiceC struct{}

func (s *ServiceA) DoWork() {
    fmt.Println("Service A is doing work")
}

func (s *ServiceB) DoWork() {
    fmt.Println("Service B is doing work")
}

func (s *ServiceC) DoWork() {
    fmt.Println("Service C is doing work")
}

type Controller struct {
    serviceA *ServiceA
    serviceB *ServiceB
    serviceC *ServiceC
}

func (c *Controller) HandleRequest() {
    c.serviceA.DoWork()
    c.serviceB.DoWork()
    c.serviceC.DoWork()
}

func main() {
    controller := &Controller{
        serviceA: &ServiceA{},
        serviceB: &ServiceB{},
        serviceC: &ServiceC{},
    }
    controller.HandleRequest()
}

在这个例子中,Controller 模块具有高扇出,因为它调用了 ServiceAServiceB 和 ServiceC 三个服务模块。

高扇出的优点


  1. 功能分离:高扇出通常意味着功能分离得很好,每个被调用的模块或组件都专注于完成特定的任务。
  2. 灵活性和扩展性:这种设计使得添加新功能时更加灵活,因为可以通过增加新的模块来扩展系统,而无需对现有模块进行大量修改。

高扇出的缺点


  1. 复杂性增加:高扇出的模块需要管理和协调多个下游模块,这会增加系统的复杂性。
  2. 故障传播:如果某个被调用的模块出现故障,可能会影响到调用它的上游模块。
  3. 性能问题:多个调用可能导致性能瓶颈,特别是在分布式系统中,每个远程调用都可能增加延迟。

如何处理高扇出


  1. 解耦和抽象:利用设计模式(如门面模式、代理模式等)来解耦调用模块和被调用模块,减少直接依赖。
  2. 模块化设计:将功能模块化,尽量减少不必要的依赖,并使用接口和抽象类来隔离变化。
  3. 监控和日志:增加对调用链的监控和日志记录,快速定位和解决性能瓶颈和故障点。
  4. 缓存和优化:在需要频繁调用的模块前增加缓存层,以减少重复调用带来的性能开销。

结论


高扇出是软件设计中的一个重要概念,它反映了一个模块与其他多个模块之间的依赖关系。理解和合理管理高扇出,可以帮助我们设计出更灵活、可扩展的系统,同时也需要关注其带来的复杂性和性能问题。      

在软件系统总体结构图中,扇入扇出官方解释挺绕人的,常常被绕晕。

扇入:模块的扇入是指有多少个上级模块调用它。扇入越大,表示该模块被更多的上级模块共享。扇入越大,表示该模块被更多的上级模块共享。这当然是我们所希望的。但是不能为了获得高扇入而不惜代价,例如把彼此无关的功能凑在一起构成一个模块,虽然扇入数高了,但这样的模块内聚程度必然低。这是我们应避免的。----百度百科

扇出:软件工程中的定义:该模块直接调用的下级模块的个数。在面向对象编程中,扇出应用于继承。----百度百科

我的理解是:扇入就是引入,扇出就是输出。换个词语来理解,就更清晰了,如下图:

 

   

扇入数(引入)就是引入了多少别的模块引到自己模块来,像光线汇聚。(相对于基础日志模块就是被引入)

扇出(输出)就是自己模块被多少个其他模块拿来使用,像瀑布铺洒。

 

#每天进步一点点#

PS:新学习到的小技能:

连接线默认情况下是折线,在选中连接线,在检视窗口中切换,可以直接切换为直线

 

 

作者:小荔枝Rose
链接:https://www.jianshu.com/p/2d196ecffd09
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:调用,模块,软件设计,高扇,扇入,func,组件
From: https://www.cnblogs.com/gongxianjin/p/18290816

相关文章

  • 软件设计之Java入门视频(13)
    软件设计之Java入门视频(13)视频教程来自B站尚硅谷:尚硅谷Java入门视频教程,宋红康java基础视频相关文件资料(百度网盘)提取密码:8op3idea下载可以关注软件管家公众号学习内容:该视频共分为1-717部分本次内容涉及360-389在写代码时,总是需要来回切换界面来看代码要求......
  • 24年软件设计师!看这篇就够了(规划+知识点)
    祝大家逢考必过~一,关于软考:考试时间:    一年有两次软考,一般是五月末和十一月的中旬,具体时间官网通知:中国计算机技术职业资格网中国计算机技术职业资格网https://www.ruankao.org.cn/exam/plan考试时长:        考试总时长240min      ......
  • 软考:软件设计师 知识点整理 1
    一.计算机组成与体系结构1.数据的表示(1)进制转换进制数码基数位权十进制(D)0,1,2,3,4,5,6,7,8,910二进制(B)0,12十六进制(H)0~9,A,B,C,D,E,F16按权展开法:二进制10100.01=1× +0+1×  +0+0+0+1× 七进制604.01=6×  +0+4×  +0+1× 其......
  • 基于javaweb jsp ssm库存管理软件设计与实现+vue录像(源码+lw+部署文档+讲解等)
    前言......
  • 随记--软件设计
    输入输出技术:调节cpu和内存之间数据传输的差距程序控制查询:无条件传送和程序查询效率低严重影响cpu利用率程序中断方式:cpu与数据传输是并行的cpu无需等待DMA方式:高速批量数据交换(向cpu总线裁决逻辑提出总线请求cpu执行完当前总线周期即可释放总线控制权)中断处理过......
  • 软件设计之Java入门视频(8)
    软件设计之Java入门视频(8)视频教程来自B站尚硅谷:尚硅谷Java入门视频教程,宋红康java基础视频相关文件资料(百度网盘)提取密码:8op3idea下载可以关注软件管家公众号学习内容:该视频共分为1-717部分本次内容涉及210-239在写代码时,总是需要来回切换界面来看代码要求,......
  • 软件设计之Java入门视频(9)
    软件设计之Java入门视频(9)视频教程来自B站尚硅谷:尚硅谷Java入门视频教程,宋红康java基础视频相关文件资料(百度网盘)提取密码:8op3idea下载可以关注软件管家公众号学习内容:该视频共分为1-717部分本次内容涉及240-269在写代码时,总是需要来回切换界面来看代码要求,......
  • (菜鸟)软考经验贴-中级软件设计师 ps:记性太差已经忘掉很多感悟了哈哈
    一、成绩和悄悄话考试内容是分为基础知识+应用技术两大块。基础模块全部选择题,应用模块是大题。机考改革之后都是上机考试,我个人的感受是没有想象中那么吓人啦,时间还算挺充足的。中级软件设计师考试时间是8:30-12:30,那天是8点,巡考的工作人员就开始催促进场了。我在的考场电脑两......
  • 哈夫曼树(软件设计师)
    上半年的软件设计师考完了,许多同学对于哈夫曼树的大题看不懂。其实这个是很好拿分的,你完全不用去理解,你了解一次就行,就能做出题目。 这题一看就要我们构造哈夫曼树,题目不讲就能知道。 选出最小的两个结合成一个大的,再根据剩下的选出两个小的结合成一个大的。   做一......
  • 软件设计原则
    一、分类    六大软件设计原则:单一职责原则、里式替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则。二、单一职责原则    一个类或者一个模块只负责一个功能。三、里式替换原则    针对继承而言的。子类可以扩展父类的方法,但不能改变父类......