软件分层(数据结构/软件逻辑上分层+举例),为什么是层状结构(软件分层,网络协议分层),协议分层(打电话例子)

本文主要是介绍软件分层(数据结构/软件逻辑上分层+举例),为什么是层状结构(软件分层,网络协议分层),协议分层(打电话例子),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

软件分层

介绍

举例 

类的继承

虚拟文件系统

线程接口封装

虚拟地址空间

总结

为什么是层状的

软件分层

网络协议

协议分层

引入

示例

实际上

逻辑上

制定出协议


软件分层

介绍

通过将软件系统划分为不同的层次,每一层都有特定的功能和职责,以实现模块化,可维护和可扩展的软件架构

这种分层设计有助于提高系统的可理解性,降低耦合度,并促进团队协作

举例 

类的继承

  • 子类和基类,两者类型相互独立
  • 子类可以共享基类的功能,并在此基础上添加、修改或扩展功能,从而建立出类之间的层次关系

虚拟文件系统

  • 虚拟文件系统是一个抽象层,它提供了一个统一的接口,使得操作系统和应用程序能够访问不同种类的文件系统,而不需要关心底层文件系统的具体实现
  • 通过struct file指针,指向不同的硬件:

线程接口封装

  • 我们之前模拟封装c++的线程库时,是使用回调的方式,在构造函数内部调用传进来的函数指针线程库接口模拟封装(使用参数包接受参数,2种方法)-CSDN博客
  • 这就将线程定义和其工作函数进行分层,二者耦合度很低,代码仅通过回调的方式将两者联系在一起

虚拟地址空间

虚拟地址空间属于更高层次的抽象,它隐藏了底层硬件的细节,为应用程序提供了一种独立于实际物理硬件的地址空间

他内部存在着嵌套关系的分层结构:

除此之外,分层也可以是并列关系

  • 每个程序都认为自己独立拥有内存空间,从而在逻辑上将每个程序进行分层
  • 同时,虚拟地址空间内部分出了不同区域,这也属于软件分层

总结

软件分层可以在数据结构/软件逻辑上进行分层,大多数是两者都有

这样分出了各个模块,让代码的耦合度降低了,在维护时也更加容易

为什么是层状的

软件分层

可以将大项目分成多个小模块,写和维护都容易

  • 如果需要修改或扩展系统的功能,只需关注特定层次,而不必涉及整个系统

高内聚,低耦合是代码要实现的目标

  • 模块内的高内聚使得修改和维护变得更加容易,而低耦合减少了模块之间的依赖,使得修改一个模块时不会波及到其他模块

网络协议

除了是因为整个网络项目规模太大了,需要我们分模块

还因为"协议是由问题产生的",问题是层状的,协议自然也是

  • 要运输数据,首先面临的最基础的问题就是,如何将数据在两个设备之间传输
  • 能送是能送了,送到哪去呢?接下来自然是解决定位主机的问题
  • 两个问题都解决后,我们从技术层面上可以运输到目标主机了,但怎么确保一定能做到呢,就来到可靠性的问题
  • 当我们可以可靠地运输数据后,也就该思考下一步,数据到位后要干什么,总不能运到就不管了吧,也就有了应用层面上的设计

协议分层

引入

  • 既然网络协议是分层的,那么其他协议也可能会是分层设计
  • 我们已经有了协议的认知,以及分层的好处,下面就来看看协议是如何实现分层的
  • 我们以打电话为例(当然这里只是简单的两层,实际的网络通信会更加复杂, 需要分更多的层次)

示例

下面是两个人通过座机交流:

实际上

我们可以通过前面学习的知识分析出 -- 两个人并没有直接交流

  • a的声音被电话接收,电话通过压缩,编码,加密音频等行为,最后转换为光电信号
  • 光电信号以电话之间的通信协议,传输给c的电话
  • 然后c的电话进行一系列处理,将光电信号转换为音频并播放出来

逻辑上

  • 但是在逻辑上我们认为,我们是直接和对方交流的(因为逻辑上人与电话无法交流,总不会出现c的电话直接来找a交流吧(瘫))
  • 所以人与人被划分为同一层
  • 而电话本身就要进行交流(将光电信号传给对方),所以电话也分为一层

制定出协议

所以,我们针对划分出的这两层,制定对应的协议

  • 人与人,规定用某种相同语言交流
  • 电话之间,制定某种协议

而连接这两层的,就是听筒(相当于听筒是接口),这就实现了高内聚,低耦合的要求

  • 这样进行分层后,一层有问题,不会影响上下层
  • 即使换了说其他语言的人 / 换了设备(也可以说是更换了协议) ,依然可以沟通
  • 所以,分层可以让维护成本大大降低

这篇关于软件分层(数据结构/软件逻辑上分层+举例),为什么是层状结构(软件分层,网络协议分层),协议分层(打电话例子)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753420

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程