软件工程第六周
软件体系结构概述
体系结构:一种思想,而框架就是思想的实现,设计模式就是根据某一特殊问题实现的框架。
体系结构:体系结构是软件系统的高级结构。它定义了系统的主要组成部分,以及这些部分之间的关系和交互方式。
框架:框架是一个半完整的应用。它实现了一种或多种体系结构,并为特定类型的应用程序提供了一个重用的结构和方法。开发者使用框架作为基础,添加特定功能来创建完整的应用。
设计模式:设计模式是在特定情境下反复出现的问题的通用解决方案。它不是可以直接转化为代码的模板,而是一个关于如何解决问题的描述或模板。
有一个设计模式叫观察者模式,可以根据不同的用户给出不同的视图。
观察者模式
观察者模式是一种行为型设计模式,它定义了对象之间的一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并被自动更新。
关键组成部分
主题(Subject):持有某个重要状态,并允许观察者对象注册和取消注册。
观察者(Observer):一旦主题的状态发生变化,所有注册的观察者都会收到通知。
应用场景
在前端开发中,观察者模式经常被用于实现事件监听和响应。例如,当用户点击按钮或填写表单时,观察者(如事件处理程序)会被通知并执行相应的操作。但是,观察者模式不仅仅是关于“通知变化”;它还可以根据不同的观察者提供不同的信息或视图。这意味着:
可定制的通知:当主题的状态发生变化时,不同的观察者可能对不同的信息感兴趣。例如,一些观察者可能只关心主题的某个特定部分的变化,而其他观察者可能需要更广泛的更新。
响应差异:不同的观察者可能会以不同的方式响应相同的状态变化。这种多样性可以通过为每个观察者定义不同的接口或回调函数来实现。
提供差异化的视图或接口:在某些实现中,主题可以为不同的观察者提供不同的“视图”或接口。例如,一个数据模型(作为主题)可以为管理员观察者提供一个视图,而为普通用户观察者提供另一个视图。这样,基于观察者的角色或需求,他们可以看到数据的不同表示或不同的数据子集。
这种差异化的方法使得观察者模式更加灵活和强大,可以满足各种各样的应用场景和需求。
软件体系结构分类
构件连接的方式比如过程调用或者中断。
一个系统可能有多个体系结构。
管道和过滤器结构
编译程序、视频播放器就是管道和过滤器结构!信息隐藏!过滤器是一个黑匣子,要很精准的很专注的完成一件事情!
层次体系结构
在软件工程和系统设计中,层次体系结构是一种逻辑分区,它将系统的不同部分分成相互堆叠的层。每一层都为上面的层提供服务,并从下面的层中获得服务。层次体系结构有一个约束:每一层都只依赖于下一层,不依赖于其他层。
这种方法的主要好处是:
- 解耦:每一层只关心其下面的层,这有助于隔离变化和减少依赖。
- 复用性:较低的层可以被多个上层复用。
- 可维护性:清晰的界限和定义有助于开发和维护。
常见的层次体系结构如OSI网络互连模型。
OSI网络互连模型
OSI(开放系统互连)模型是一个网络体系结构模型,由国际标准化组织(ISO)定义。它将网络协议分成七个不同的层,从物理传输到应用之间的交互。
从下到上,这七层是:
物理层(Physical Layer):涉及到物理连接、电压、时钟频率等。例如,电缆、交换机、集线器。
数据链路层(Data Link Layer):确保在物理网络上有一个可靠的链接。这一层经常被分为两个子层:逻辑链路控制(LLC)和介质访问控制(MAC)。
网络层(Network Layer):处理数据包的发送和路由,例如IP协议。
传输层(Transport Layer):提供端到端的通信服务,例如TCP和UDP。
会话层(Session Layer):负责建立、管理和终止会话。
表示层(Presentation Layer):处理数据格式、加密和解密等功能。
应用层(Application Layer):为应用程序提供网络服务,例如HTTP、FTP和SMTP。
在OSI模型中,每一层都只依赖于下一层来提供其所需的服务。
C/S与B/S架构
服务器掌管资源。其实可以看作两层客户机/服务器体系结构,也可以看为胖客户机,我们的目标就是让C端尽可能瘦。这样就诞生了三层C/S体系结构,增加了数据库!
MVC架构
由于增加了VIEW,所以mvc更加适用于用户交互。对于mvc模式的讲解,请见文章Springboot知识点必知必会(一)_Joy T的博客-CSDN博客
系统设计原理之模块化
边界元素:{}、begin end等。
最小成本区:7±2原则,介绍请见软件工程第四周-CSDN博客
信息隐藏不是隐藏全部信息,而是有针对的暴露信息!要求高聚合!内部实现再复杂,都可以使用接口暴露出来!
内部资源分配策略、控制接口controlled interface都需要保密!
模块独立——耦合与内聚
耦合
尽量少出现内容耦合、公共耦合与控制耦合呦!
数据耦合
main与sum函数之间交换参数!很多情况下都是数据耦合。但是一定是局部变量的传递!如果传递的是全局变量,则表示公共耦合,其耦合性会大大增加,不好!
特征耦合
这里,住户情况就是整个的数据结构,是一点也不细化啊。这样的话,计算水费和电费都用的是住户情况。一旦住户情况出现问题,这就不知道会不会影响水费或者电费的计算,这就是特征耦合,耦合性较强,不太好。最好是你需要什么数据,就传递什么数据,修改如下:
这就从特征耦合改进到数据耦合了耶!
控制耦合
怎么去理解控制耦合定义中的信号呢?本质上就是分支,主要表示形式如下:
若采用这种控制形式,一旦计算平均分的方法从求平均值变成分别去掉一个最大值和最小值再求平均值,那么计算最高分耶很有可能受到影响。联系第一周软件工程的内容:软件修改是有副作用的!所以我们应该把控制信号变成调用函数的调用判断对象!
公共耦合
公共耦合是指多个模块共享相同的数据,可能导致的问题是数据的不完整性和不一致性。
为了解决这些问题,我们可以采用一些机制和策略来减少或管理公共耦合。比如下图中将读写公共数据的两个模块分为一个模块读,另一个模块写:
以下是减少公共耦合的一些建议和考虑:
1. 封装
封装意味着将数据隐藏在模块或对象内部,并只通过定义好的接口访问它。这样,可以确保数据的完整性和一致性,并防止外部模块直接修改数据。
2. 使用服务层或API
为数据访问提供统一的服务层或API,确保所有的读写操作都经过这一层。这不仅可以保持数据的一致性,还可以为数据访问提供安全和验证机制。
想象你在一个大型酒店办理入住。你不会直接去找清洁员或者房间服务员来拿钥匙,而是去前台。前台是你和酒店的所有服务之间的中介。同样,当软件需要数据时,它不直接去数据库拿,而是通过一个“前台”——服务层或API。这确保了所有的数据请求都统一和有序。
以图书管理系统为例,我们将服务层和API展示在其他文章中,请见
3. 数据访问对象(DAO)
在设计模式中,DAO是一种将低级的数据访问逻辑或操作从高级的业务服务中分离出来的模式。这样可以避免多个模块直接与数据库进行交互,从而减少公共耦合。
在软件设计中,DAO(Data Access Object)层是负责与数据源(例如数据库)进行交互的部分。对于像JDBC或MyBatis这样的技术,DAO层就是定义SQL查询,插入,更新和删除操作的地方。
拿图书管理系统举例,我们可以细化如下:
实体层(Entity Layer):这里定义了“图书”这一实体的属性和行为。一个图书实体可能有诸如
title
(标题)、author
(作者)、ISBN
(国际标准书号)等属性。DAO层(Data Access Layer):
- 这是我们定义如何从数据库中获取图书,如何插入新的图书,如何更新图书信息,或如何删除图书的地方。
- 如果你使用JDBC,你的DAO层可能会包含原始的SQL语句来实现上述操作。
- 如果你使用MyBatis,你可能会在XML映射文件或注解中定义SQL语句,而DAO层(通常称为Mapper接口)将包含与这些SQL语句对应的Java方法。
服务层(Service Layer):这是应用程序的核心业务逻辑所在。例如,如果要借出一本书,服务层可能需要首先检查这本书是否已经被其他人借走。这个层级会调用DAO层来获取数据库中的相关数据。
表示层/控制器层(Presentation/Controller Layer):用户与此层互动。例如,这可以是一个web页面,用户在这里输入书名来查找书籍,或者输入书籍的详细信息来添加新书。
在这个架构中,DAO层是充当桥梁的角色,连接业务逻辑(在服务层)和实际的数据(在数据库中)。其目标是封装与数据访问相关的所有代码,使其他部分的应用程序不需要关心数据访问的具体细节。
4. 事件驱动架构
使用事件来触发或通知数据更改,而不是直接进行数据操作。这样可以避免直接的数据耦合,并允许模块独立地响应事件。
想象你在一个餐厅里,当你的食物准备好时,服务员会叫你。你不需要每隔几分钟去厨房检查食物是否准备好。这是因为餐厅采用了“事件驱动”的模式——当某个事件(食物准备好)发生时,会有一个相应的动作(叫你)。在软件中,系统也可以这样设计:它不不断地检查数据是否已经改变,而是当数据改变时,系统会得到通知,并采取相应的行动。
数据库中的读写分离
这个对于公共耦合的改进让作者瞬间意识到数据库中的读写分离机制! 进一步讨论:
公共耦合主要发生在多个模块或应用共享相同的数据库表或字段时。这意味着,如果一个模块对共享数据结构进行了修改(例如更改了表结构或删除了某些字段),其他模块可能会受到影响。
读写分离是数据库架构中的一个策略,主要目的是提高性能和扩展性。在读写分离的系统中,写入操作通常发送到主数据库,而读取操作可以从一个或多个从数据库进行。
读写分离可以降低公共耦合,因为它使得读和写操作在逻辑上或物理上分离,减少了对同一数据的并发访问。但是,它并不完全消除公共耦合,特别是在需要保持数据一致性的情况下。
读写分离如何帮助
-
减少资源竞争:由于写操作通常只发生在主数据库上,而读操作可以在多个从数据库上分散,这减少了对同一数据资源的并发访问,从而降低了因并发访问导致的数据不一致性的风险。
-
分离业务逻辑:在某些场景中,可能会有一个模块主要进行数据写入,而其他模块主要进行数据读取。这就是上图改进后的效果。读写分离自然地分隔了读写这两种业务逻辑,减少了它们之间的直接依赖。
但是,读写分离不能完全消除公共耦合,原因如下:
-
结构共享仍然存在:尽管读和写操作已经分离,但如果多个模块共享相同的数据结构,它们仍然是耦合的。例如,如果更改了数据库的表结构,那么与该表相关的所有读写模块都可能受到影响。
-
数据同步和一致性:在读写分离的环境中,从数据库需要定期从主数据库同步数据。这可能导致短暂的数据不一致。因此,模块需要考虑这种不一致性,特别是在高数据更新频率的应用中。
内容耦合
1. goto就是一种通过非正常路口随便进入另一个模块内部的方法,会造成内容耦合。但是goto语句会在极端情况下对性能做出优化,所以到现在仍然允许使用,只不过需要强劲的实力。
2. 一个模块有多个入口,其实也会违背controlled interface的机制,接口不唯一了。
3. 模块代码重叠,可以通过将重叠部分(中间图阴影部分所示)转换成可调用的部分。
数据库视图
对于内容耦合,作者认为可以通过视图view这一机制降低。
数据库中的视图(view)可以帮助管理和降低内容耦合。内容耦合发生在一个模块直接访问另一个模块的内部数据或实现细节。在数据库上下文中,这可以解释为应用或服务直接访问数据库表的具体结构和数据。
使用视图(views)具有以下优势:
抽象:视图提供了一个对基础数据的抽象表示。它们允许展现数据的特定部分,或者以不同的方式整合和呈现数据,而不需要改变基础的表结构。
隔离变化:如果基础表的结构需要更改,视图可以帮助保持对外部应用或服务的相同表示,只要视图的定义和输出仍然是一致的。
安全:通过视图,可以控制对数据的访问,只显示对特定应用或服务的必要数据,从而提高数据的安全性。
简化复杂查询:对于复杂的数据结构,您可以创建视图来简化查询,使得应用的查询逻辑更加简单和直接。
通过这些方式,视图确实可以降低内容耦合,因为它们为应用程序提供了一个与基础数据结构和逻辑解耦的数据访问层。然而,值得注意的是,使用视图并不完全消除耦合,因为任何对视图定义的更改仍然可能影响到依赖它的应用程序。
在实践中要注意分析耦合情况,分析模块,对模块进行调整。
逻辑内聚往往与控制耦合相关!内聚部分下周再讲解。
相关文章:
软件工程第六周
软件体系结构概述 体系结构:一种思想,而框架就是思想的实现,设计模式就是根据某一特殊问题实现的框架。 体系结构:体系结构是软件系统的高级结构。它定义了系统的主要组成部分,以及这些部分之间的关系和交互方式。 框…...
node+pm2安装部署
1、安装node 下载node安装包: wget https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz 解压: tar -xvJf node-v14.17.0-linux-x64.tar.xz 配置环境变量,在/etc/profile文件最后添加以下脚本: export PATH$P…...
大数据学习(11)-hive on mapreduce详解
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…...
MyBatis基础之自动映射、映射类型、文件注解双配置
文章目录 自动映射原理jdbcType同时启用配置文件和注解两种配置方式 自动映射原理 在 MyBatis 的配置文件(settings 元素部分)中,有一个 autoMappingBehavior 配置,其默认值为 PARTIAL ,表示 MyBatis 会自动映射&…...
8、docker 安装 nginx
1、下载镜像 docker pull nginx 2、本机创建目录 1)创建nginx挂载目录 mkdir /usr/local/nginx 2)进入nginx目录 cd /usr/local/nginx 3)创建 www和logs目录 mkdir -p www logs 3、创建nginx容器 此容器用于复制配置文件,复…...
关于Skywalking Agent customize-enhance-trace对应用复杂参数类型取值
对于Skywalking Agent customize-enhance-trace 大家应该不陌生了,主要支持以非入侵的方式按用户自定义的Span跟踪对应的应用方法,并获取数据。 参考https://skywalking.apache.org/docs/skywalking-java/v9.0.0/en/setup/service-agent/java-agent/cust…...
手机路径、Windows路径知识及delphiXE跨设备APP自动下载和升级
手机路径、Windows路径知识 及delphiXE跨设备APP自动下载和升级 一、APP安装程序文件版本和权限信息 1、运行时动态调用Android apk的AndroidManifest.xml获取versionName 2、运行时动态调用IOS ipa的info.plist获取CFBundleVersion (和entitlements)…...
GitLab 502问题解决方案
由于最近 gitlab 切换到另一台服务器上部署的 gitlab 后,经常出现 502。平时重启 gitlab 后都能解决,今天突然重启多次后都还是 502(重启日志是正常的),遂通过 gitlab-ctl tail 查看日志进行排查。 gitlab-ctl tail通…...
selenium打开火狐浏览器
项目上需求为:甲方OA 系统是IE系统,需要从IE系统点个按钮打开火狐浏览器单点登录跳转到我们的系统 前期解决方案为:打开浏览器就行了,然后就用的是打开本地浏览器,但是由于B/S架构,有别人远程访问我的ip来…...
多标签分类论文笔记 | ML-Decoder: Scalable and Versatile Classification Head
个人论文精读笔记,主要是翻译心得,欢迎旁观,如果有兴趣可以在评论区留言,我们一起探讨。 Paper: https://arxiv.org/pdf/2111.12933.pdf Code: https://github.com/Alibaba-MIIL/ML_Decoder 文章目录 0. 摘要1. 介绍2. 方法2.1 Ba…...
修改http_charfinder.py使能在python311环境中运行
需要修改两个函数,第一个是init函数,修改如下: async def init(loop, address, port): # <1> # app web.Application(looploop) # <2> # app.router.add_route(GET, /, home) # <3> app web.Application(…...
蓝桥杯(跳跃 C++)
思路: 1、根据题目很容易知道可以用深度搜索、广度搜索、动态规划的思想解题。 2、这里利用深度搜素,由题目可知,可以往九个方向走。 3、这里的判断边界就是走到终点。 #include<iostream> using namespace std; int max1 0; int …...
08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?
我们用 Spring Boot 里面默认集成的 fasterxml.jackson 加以说明,这看似和 JPA 没什么关系,但是一旦我们和 Entity 一起使用的时候,就会遇到一些问题,特别是新手同学,我们这一课时详细介绍一下用法。先来跟着我了解一下…...
JavaScript—获取当前时间 并转化为yyyy-MM-dd hh:mm:ss格式
JavaScript—获取当前时间 并转化为yyyy-MM-dd hh:mm:ss格式 每次项目都需要用到时间戳格式,可以封装成一个方法 下次直接CV过去 const timestampPadStart=(str)=>{str=String(str);return str.padStart(2,0)...
OpenHarmony创新赛丨报名倒计时,超强秘籍带你直通大奖!
OpenHarmony创新赛报名倒计时开始啦! 设于开放原子全球开源大赛下的OpenHarmony创新赛,目前正在如火如荼地进行赛事招募中!这次大赛围绕创新应用、商显行业、金融行业三大赛题,邀请来自企业、个人、高校师生等各界群体的优秀开发者…...
Linux高性能服务器编程 学习笔记 第十四章 进程池和线程池
动态创建子进程或子线程的缺点: 1.动态创建进程或线程比较耗时,这将导致较慢的客户响应。 2.动态创建的子进程或子线程通常只用来为一个客户服务(除非我们做特殊处理),这将导致系统上产生大量的进程或线程,…...
微信小程序/vue3/uview-plus form兜底校验
效果图 代码 <template><u-form :model"form" ref"formRole" :rules"rules"><u-form-item prop"nickname"><u-input v-model"form.nickname" placeholder"姓名" border"none" /&…...
Photoshop 2024正式发布!内置最新PS AI,创意填充等功能无限制使用!
PS正式版目前更新到了2024,版本为25.0。 安装教程 1、下载得到安装包后,先解压。鼠标右键,【解压到当前文件夹】 2、双击 Set-up 开始安装 3、这里可以更改安装位置。如果C盘空间不够大,可以把它安装到C盘以外。更改好后&#x…...
芯片学习记录TLP184
TLP184 芯片介绍 TLP184是一款光耦隔离器,它的主要特点包括:高电压耐受能力、高传输速度、高共模隔离能力、低功耗等。它可以用于工业自动化、通信设备、家用电器等领域的电气隔离应用。由一个光电晶体管组成,光学耦合到两个红外发射二极管…...
C++ 重载运算符和重载函数
前言 C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个…...
Linux:mongodb数据库基础操作(3.4版本)
安装 3.*版本和4.*版本安装都是一样的 Linux:mongodb数据库源码包安装(4.4.25版本)_鲍海超-GNUBHCkalitarro的博客-CSDN博客https://blog.csdn.net/w14768855/article/details/133826626?spm1001.2014.3001.5501 mysql和mongodb对比 登录…...
nginx实现灰度上线(InsCode AI 创作助手)
要基于Nginx实现灰度上线,有以下三种方法: 权重分发:使用Nginx的upstream模块来设置不同服务器的权重。将一部分请求分发给新版本服务器,另一部分请求分发给旧版本服务器。这可以通过以下方式实现: http {upstream bac…...
记:apifox 返回 invalid header token 的问题排查思路
背景: 某接口服务使用 springboot 2.x 开发, RestController 、ReqeustBody 在本地(localhost)调用的时候正常、chrome (.cn域名访问)浏览器访问正常。 换成 apifox (.cn域名访问)、postman (.cn域名访问)调用异常返回:invalid header t…...
【00】神经网络之初始化参数
问题描述 #随机初始化权重 w12 np.random.randn(100, 784)/np.sqrt(784) 为什么除以28 回答 这里的代码是初始化一个深度学习模型中的权重矩阵w12。权重矩阵的形状是(100, 784),这是一个从784个输入节点到100个隐藏节点的全连接层。 除以np.sqrt(784)是权重初始…...
代码随想录Day20 回溯算法 LeetCode77 组合问题
以下内容更详细解释来自于:代码随想录 (programmercarl.com) 1.回溯算法理论基础 回溯法也叫回溯搜索法,是搜索法的一种,我们之前在二叉树中也经常使用到回溯来解决问题,其实有递归就有回溯,有的时候回溯隐藏在递归之下,我们不容易发觉,今天我们来详细介绍一下什么是回溯,它能…...
免费获取天气预报的API接口(Json格式)
免费获取天气预报的API接口(Json格式) 1、接口地址2、城市代码 1、接口地址 当需要获取某个城市天气数据json时候,需要传入一个城市代码编码作为入参,地址: http://t.weather.itboy.net/api/weather/city/xxxxx &…...
安卓程序执行入口
Android程序执行入口 Android应用程序的执行入口是在一个特定的 Java 类中,通常是 MainActivity 或 SplashActivity,具体取决于应用的设计和结构。 Android应用程序的执行入口通常通过以下方式进行定义: 在 AndroidManifest.xml 文件中&am…...
消息队列(中间件)
通信协议: 为了实现客户端和服务器之间的通信来完成的逻辑,基于TCP实现的自定义应用层协议。通过这个协议,完成客户端–服务器远程方法调用。 序列化/反序列化: 通过网络传输对象把对象存储到硬盘上。 序列化:把对象转化为二进制的…...
Java|学习|异常
1.异常 1.1 异常 1.1.1 概述 异常:就是程序出现了不正常的情况。 Error:严重问题,不需要处理。 Exception:称为异常类,它表示程序本身可以处理的问题。 RuntimeException:在编译器不检查,出…...
nextjs项目修改启动端口号,以及开发启动后自动打开浏览器
next版本:13.5.4 一、修改端口 在package.json文件当中修改启动命令 "scripts": {"dev": "next dev -p 3100","build": "next build","start": "next start","lint": "ne…...
ui设计的网站有哪些/什么关键词能搜到资源
项目最初给的意见是,pc一套前端代码,wap一套代码,并没有说手机端在电脑上打开正常显示的需求。因此,我最后移动端单位用了vw/vh进行布局,没想到的是,需求变了,噩梦开始了! 遇到的问…...
科创纵横 网站建设/山西网络推广专业
事务的定义 我们常说事务事务,事务在软件设计中事务很重要,那么到底什么是事务呢? 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中指访问并访问并有有可能更新数据库中各种数据项的一个程序执行单元。事务通常由高…...
建网站的公司浩森宇特/合肥seo招聘
xjusticex2016/07/07还是不行。数据库挂了之后,如果不关闭禅道或者重启禅道的话,启动mysql会出现:Starting MySQL. ERROR! The server quit without updating PID file (/usr/local/mysql/var/iZ94aqs6nntZ.pid).的错误。一旦关闭活重启禅道&…...
网站空间怎么登陆/网络推广有前途吗
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼br0 Link encap:Ethernet HWaddr D2:23:4A:E2:84:84inet addr:192.168.1.130 Bcast:192.168.1.255 Mask:255.255.255.0inet6 addr: fe80::d023:4aff:fee2:8484/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX p…...
网站流量做那些好/seo外包顾问
Windows XP是一款经典的操作系统,同时也是一款很老的操作系统,不过尽管如此,还是有一批用户在使用XP系统,所以发行一些软件的时候还是要测试在XP系统中能否运行,这时候我们就可以借助VirtualBox虚拟机安装一个XP系统来…...
网站公司怎么做业务/如何建立自己的网站平台
1.什么是方法的重写? 在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。2.方法重写的要求? ①. 子类重写的方法必须和父类被重写的方法具有相同的方法名称…...