软件开发之架构设计、编程语言框架、面向对象的设计模式
liuian 2024-11-28 00:47 37 浏览
对于复杂的大型应用系统,正如一座大型建筑一样,不能直接开干,需要进行反复设计验证。包括整体框架设计,以及子系统或组件可以适用的代码框架(技术选型),框架下诸多类和对象的创建和使用,复合关系及行为交互等的一些套路(设计模式)的使用。
1 什么是架构设计
架构(Architecture)设计是系统的顶层设计,是软件整体结构与组件的抽象描述,涉及到子系统划分与交互,包括系统如何纵向分层、横向模块划分,组件如何交互等设计,设计的系统要求有高性能与安全性、易于维护与扩展。
如一个电子商城系统,可以按其业务逻辑(用户实现一个功能的最小的闭环,包括流程环节、人机交互、数据交互)进行划分:
1 商家卖货 | 1.1 订单系统 | 订单生成 | 用户下单、商品信息、优惠信息、会员权益、库存减少、运费计算 |
支付订单 | 用户信息、支付信息 | ||
商家发货 | 商家发货、仓库调拔、订单分拣、商品包装、订单出库、快递配送 | ||
确认收货 | 物流追踪、用户签收 | ||
交易完成 | 用户评价、订单售后 | ||
1.2 物流系统 | …… | …… | |
1.3 文件系统 | …… | …… | |
2 买家买货 | 2.1 直播系统 | …… | …… |
2.2 红包雨系统 | …… | …… | |
2.3 秒杀系统 | …… | …… |
架构设计的一些常用套路称为架构模式,如,MVC模式、分层模式、CS模式、主从模式、管道过滤模式、代理模式、P2P模式、事物总线模式、解释器模式、微内核架构(插件架构)、基于空间的架构(云架构)、微服务架构等。
在软件系统中,架构是非常重要的一部分,它统领各个模块的开发和合作,项目从研发到上线运营,我们要在不同的方案中选择合适的架构,比如,我们服务器使用什么操作系统?使用什么语言开发?数据如何获取和存储?客户端使用什么框架开发?
这些问题的方案组合在一起就是一种软件开发架构,项目组的每个子系统都要有自己的方向,把子系统的决策方向合起来再加入它们之间的关联调用就构成了一个完整的架构,每个系统、组件、模块都是软件系统架构的一部分。
2 什么样的架构才是好架构?
一个好的架构设计需要有好的承载力、扩展性、易用性、伸缩性和容错性。
2.1 承载力
一个架构能承载多少个业务系统或功能系统,能承载多少代码行数,在达到规定的代码量时是否能有效正常的运行。
对于服务器来说,服务器的架构能承载多少人同时访问,能承载的日均访问量是多少,这就是它承载力的体现。
对于客户端来说,它能显示多少个UI功能,可以同时渲染多少个模型,分辨率可以达到多少,则是它的承载力体现。
2.2 扩展性
可扩展性的关键就在于,在添加新系统新功能的时候,会不会影响其他系统,添加这个新系统的代价大不大,会不会导致系统整体性能问题。
2.3 易用性
易用性其实很简单,就是你这个产品设计的好不好用,是不是方便使用。
易用性也决定了软件的整体开发效率,因为一个好的架构,会让团队成员容易上手,子系统容易对接,开发效率高,各模块和各系统的编写只需要关注系统的设计和编码工作,其他模块通信方面的事情,架构可以提供很好的兼容。
2.4 伸缩性
什么是伸缩性?其实就是你设计的这个方案或系统是否可以根据需求适配不同数量的功能或子系统,在我们设计的软件系统中,架构的可伸缩性决定了架构的可适配性,比如,当这个系统使用人数较少的时候,是否支持减少一些服务器来支撑服务端的运行,当系统使用的人数较多时,访问量较大时是否支持添加服务器来增强系统的支持。
2.5 容错性
如果软件中某个系统出现了一点小BUG导致整个系统使用不了,那这个架构容错性就很差,软件中的一些BUG很常见,我们无法避免,但是我们应尽量保证这个BUG的影响范围最小。
同时,若出现系统无法使用的情况,应该有备份方案,比如自动启动或者自动保存数据等功能,也应该能够让开发人员及时知道问题的发生,以及问题所在的位置并记录错误信息。
在架构设计中,以上五项基本能力缺一不可,某项能力的突出并不能带动其他项,也不能决定整个系统的好坏。
但是如果某一项能力比较弱,随着时间的推移,问题会越来越大,甚至系统崩溃。就像木桶原理那样,一个木桶的容量不是取决于最长的那根木板,而是取决于最短的那根。
我们需要一个坚固的、多样化的、好用的、可伸缩的、容错性强的房子,这也是我们设计架构所追求的目标。
3 框架(Framework)
框架是某一架构模式的某一基础组件的代码化,表现为类库或工具。
例如MVC是一种架构模式,其具体的网络开发框架有:
Python Django 框架
Java Spring 框架
Ruby on Rails框架
不同的编译语言有不同的框架来实现不同的架构设计:
C:ACL
C++:QT、MFC
Python:PyQt
JavaScript:Node.js、React.js
SSM框架是Spring+SpringMVC+MyBatis三个框架整合而成的,在SpringBoot出现之后,SpringBoot慢慢开始占据了主流地位,另外在SSM之前还有一个业内流行的SSH框架(Struts、Spring和Hibernate0。
4 设计模式
一个系统可以选择不同的架构设计模式,一种架构设计模式可以选择不同编程语言的不同框架或框架组合,而不同的框架下的代码开发可以使用不同的面向对象的设计模式(Design Pattern)来实现不同对象之间的关系及行为交互,包括对象的创建与使用分离,以降低系统的耦合度。
5 编程语言及相关内容
所以,学习一门编程语言往往不仅限于编程语言本身:
① 计算机组成原理
② 汇编语言
③ 编程语言本身
④ 标准库
⑤ 编程语言相关的某操作系统的API
⑥ 编程语言相关的数据结构(如C++的STL,Java的Collection)
⑦ 通用数据结构与算法
⑧ 数据库、网络
⑨ 框架、工具
ref:
https://ea.zhoujingen.cn/?p=4875
https://www.zhihu.com/question/25654738
https://www.toutiao.com/article/7116139300672094753
-End-
相关推荐
- Python生态下的微服务框架FastAPI
-
FastAPI是什么FastAPI是一个用于构建API的web框架,使用Python并基于标准的Python类型提示。与flask相比有什么优势高性能:得益于uvloop,可达到与...
- SpringBoot:如何解决跨域问题,详细方案和示例代码
-
跨域问题在前端开发中经常会遇到,特别是在使用SpringBoot框架进行后端开发时。解决跨域问题的方法有很多,我将为你提供一种详细的方案,包含示例代码。首先,让我们了解一下什么是跨域问题。跨域是指在...
- 使用Nginx轻松搞定跨域问题_使用nginx轻松搞定跨域问题的方法
-
跨域问题(Cross-OriginResourceSharing,简称CORS)是由浏览器的同源策略引起的。同源策略指的是浏览器限制来自不同源(协议、域名、端口)的JavaScript对资源的...
- spring boot过滤器与拦截器的区别
-
有小伙伴使用springboot开发多年,但是对于过滤器和拦截器的主要区别依然傻傻分不清。今天就对这两个概念做一个全面的盘点。定义与作用范围过滤器(Filter):过滤器是一种可以动态地拦截、处理和...
- nginx如何配置跨域_nginx配置跨域访问
-
要在Nginx中配置跨域,可以使用add_header指令来添加Access-Control-Allow-*头信息,如下所示:location/api{if($reques...
- 解决跨域问题的8种方法,含网关、Nginx和SpringBoot~
-
跨域问题是浏览器为了保护用户的信息安全,实施了同源策略(Same-OriginPolicy),即只允许页面请求同源(相同协议、域名和端口)的资源,当JavaScript发起的请求跨越了同源策略,...
- 图解CORS_图解数学
-
CORS的全称是Cross-originresourcesharing,中文名称是跨域资源共享,是一种让受限资源能够被其他域名的页面访问的一种机制。下图描述了CORS机制。一、源(Orig...
- CORS 幕后实际工作原理_cors的工作原理
-
跨域资源共享(CORS)是Web浏览器实施的一项重要安全机制,用于保护用户免受潜在恶意脚本的攻击。然而,这也是开发人员(尤其是Web开发新手)感到沮丧的常见原因。小编在此将向大家解释它存在...
- 群晖无法拉取Docker镜像?最稳定的方法:搭建自己的加速服务!
-
因为未知的原因,国内的各大DockerHub镜像服务器无法使用,导致在使用群晖时无法拉取镜像构建容器。网上大部分的镜像加速服务都是通过Cloudflare(CF)搭建的,为什么都选它呢?因为...
- Sa-Token v1.42.0 发布,新增 API Key、TOTP 验证码等能力
-
Sa-Token是一款免费、开源的轻量级Java权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、微服务网关鉴权等一系列权限相关问题。目前最新版本v1.42.0已...
- NGINX常规CORS错误解决方案_nginx配置cors
-
CORS错误CORS(Cross-OriginResourceSharing,跨源资源共享)是一种机制,它使用额外的HTTP头部来告诉浏览器允许一个网页运行的脚本从不同于它自身来源的服务器上请求资...
- Spring Boot跨域问题终极解决方案:3种方案彻底告别CORS错误
-
引言"接口调不通?前端同事又双叒叕在吼跨域了!""明明Postman能通,浏览器却报OPTIONS403?""生产环境跨域配置突然失效,凌晨3点被夺命连环Ca...
- SpringBoot 项目处理跨域的四种技巧
-
上周帮一家公司优化代码时,顺手把跨域的问题解决了,这篇文章,我们聊聊SpringBoot项目处理跨域的四种技巧。1什么是跨域我们先看下一个典型的网站的地址:同源是指:协议、域名、端口号完全相...
- Spring Cloud入门看这一篇就够了_spring cloud使用教程
-
SpringCloud微服务架构演进单体架构垂直拆分分布式SOA面向服务架构微服务架构服务调用方式:RPC,早期的webservice,现在热门的dubbo,都是RPC的典型代表HTTP,HttpCl...
- 前端程序员:如何用javascript开发一款在线IDE?
-
前言3年前在AWSre:Invent大会上AWS宣布推出Cloud9,用于在云端编写、运行和调试代码,它可以直接运行在浏览器中,也就是传说中的WebIDE。3年后的今天随着国内云计算的发...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)