软件系统开发设计的基本流程

一、前言

  经过年的工程实践软件系统开发的流程演变有很多种,但是最基本的还是瀑布模型。但是由于近几年演变了很多种模型,现在很多公司的研发流程并不遵循瀑布模型。主要原因是无法满足市场竞争的需求。比如在哪某个节日需要敏捷上线活动等这样的场景。没法走完瀑布模型功能就要上线等。但是不管怎样,瀑布模型还是最经典的软件开发设计上线流程。

二、瀑布模型 

以下是瀑布模型的主要阶段:

  1. 需求分析:这是项目的起始阶段,主要目标是收集和分析用户的需求,并生成需求规格说明书。
  2. 设计:在需求明确后,进入设计阶段。设计师会制定系统架构,确定系统各部分的交互方式,并生成设计文档。
  3. 编码:在设计阶段完成后,开发人员根据设计文档开始编写代码。
  4. 测试:编码完成后,测试团队会对系统进行测试,包括单元测试、集成测试和系统测试等,以确保软件的质量。
  5. 维护:在软件发布后,可能还需要进行维护,包括修复错误、更新功能和优化性能等。

瀑布模型的主要优点包括:

  • 易于管理:每个阶段都有明确的目标和输出,便于项目管理。
  • 文档完备:各阶段都有详细的文档记录,方便后期维护。

三、软件的设计7个基本原则

  1. 单一职责原则(Single Responsibility Principle, SRP)
    • 一个类应该只有一个引起变化的原因。
    • 意味着一个类应该只有一个职责,当这个职责发生变化时,只需要修改这个类。
  2. 开放封闭原则(Open-Closed Principle, OCP)
    • 软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的。
    • 当需求变化时,通过扩展现有代码而不是修改现有代码来满足新的需求。
  3. 里氏替换原则(Liskov Substitution Principle, LSP)
    • 子类型必须能够替换掉它们的父类型。
    • 也就是说,程序中的对象应该能够使用其父类型来替换,而不会产生错误或异常。
  4. 接口隔离原则(Interface Segregation Principle, ISP)
    • 使用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。
    • 这意味着应该细化接口,避免客户端依赖不需要的接口方法。
  5. 依赖倒置原则(Dependency Inversion Principle, DIP)
    • 要依赖于抽象,不要依赖于具体。
    • 高层模块不应该依赖于低层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
  6. 迪米特法则(Law of Demeter, LoD)
    • 一个软件实体应当尽可能少地与其他实体发生相互作用。
    • 也就是说,一个对象应该对其他对象保持最少的了解,降低类之间的耦合度。
  7. 组合优于继承原则(Favor Composition over Inheritance)
    • 尽量使用对象组合,而不是通过继承来达到复用的目的。
    • 组合通常使得系统更加灵活,因为它允许在运行时改变对象的行为,而继承则是一种静态关系,在编译时就确定了。

四、软件架构与设计

1、Web软件架构

Web软件架构主要关注如何组织和设计系统的各个组件,以便它们能够协同工作并实现所需的功能。常见的Web架构模式包括C/S(客户端/服务器)和B/S(浏览器/服务器)两种。C/S架构中,服务器通常采用高性能的计算机设备,而客户端需要安装专用的客户端软件。B/S架构则更为灵活,客户端只需安装一个浏览器,即可通过浏览器与Web服务器进行数据交互。

此外,MVC(模型-视图-控制器)是一种在Web开发中广泛使用的软件设计典范和模式。MVC将业务逻辑、数据和界面显示分离,使得在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。在MVC架构中,模型负责处理数据和业务逻辑,视图负责与用户进行交互并展示数据,控制器则负责接收视图传输的数据或向视图传输数据,并调用模型处理数据。

2、Web软件设计原则

在设计Web软件时,需要遵循一系列原则以确保系统的成功实施和高效运行。这些原则包括:

  1. 实用性原则:每个系统都应具备实用性,能够解决用户的实际问题。
  2. 可靠性原则:系统应可靠运行,出现异常时应有人性化的异常信息帮助用户理解原因或采取适当的应对方案。
  3. 可维护性和可管理性原则:Web系统应有一个完善的管理机制,以确保系统的可维护性和可管理性。
  4. 安全性原则:Web应用应采取严格的安全措施,如使用五层安全体系来确保网络层、系统、用户、用户程序和数据的安全性。

3、组件与交互

在Web软件设计中,组件和交互的设计至关重要。基于组件和事件驱动的架构是一种常见的Web设计方法,它将程序分成多个组件,每个组件都可以触发事件并调用特定的事件处理器来处理。这种设计方式使得开发人员能够更高效地组织和管理代码,并降低代码的耦合度。

此外,Web页面和文件也是Web软件设计中的重要组成部分。通过合理地组织和设计Web页面和文件结构,可以提高网站的可访问性和用户体验。

五、比了解的重点场景知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP .Net Core 配置集合 IConfiguration 的使用

🐳简介 IConfiguration 是 ASP.NET Core 中的一个接口,用于表示配置集合。以下是关于 IConfiguration 的详细介绍: 作用:IConfiguration 允许开发人员从各种来源(如文件、环境变量、命令行参数等)读取应用…

ASP.NET中的GridView和DataList控件:功能、应用与比较

目录 一、引言 二、GridView控件 三、DataList控件 四、GridView与DataList的比较 五、结论 一、引言 ASP.NET是微软公司开发的一款强大的Web应用程序开发框架,它提供了丰富的控件库,使得开发人员能够更快速、更高效地构建功能强大的Web应用程序。…

【工具类】vscode 常用功能

1. vscode 常用功能 1. vscode 常用功能 1.1. 关闭右侧预览功能1.2. 快捷键(右键或者菜单栏多看看就记住了)1.3. 常用插件 1.1. 关闭右侧预览功能 点击文件-首选项-设置,搜索 “editor.minimap.enabled” ,默认值为打钩,我们只需要把钩去掉即可; 1.2. 快捷键(右…

上传日志到aws日志服务

安装包 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>cloudwatchlogs</artifactId><version>2.16.60</version></dependency>使用 HashMap<String, Object> map new HashMap<>();map.put(…

inner join,left join,right join,outer join的区别

INNER JOIN&#xff1a;内连接是最常见的连接操作&#xff0c;它返回两个表中满足连接条件的交集。即只返回条件匹配的记录。 LEFT JOIN&#xff1a;左连接返回左表记录和右表记录匹配后组成的记录。以及左表中未与右表匹配的记录&#xff0c;右边用null显示。 RIGHT JOIN&…

如何正确关闭MySQL

一、介绍 MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;由于其高性能、稳定性和可靠性&#xff0c;被广泛应用于互联网应用等领域。然而&#xff0c;当我们需要停止或关闭MySQL实例时&#xff0c;很多人并不清楚如何做到正确、安全地关闭MySQL&#xff0c;这将会…

好就业三种专业#信息安全#云计算#网络工程

一、信息安全专业 根据2021年网络安全宣传周白皮书的观察结果&#xff0c;网络安全产业对于人才的需求正以高速增长的趋势呈现&#xff0c;当前网络安全行业存在着巨大的人才缺口&#xff0c;平均供求比例约为1:2。这一现象导致了资深人才的储备不足&#xff0c;并且新人才的培…

AWS Sagemaker详解

Sagemaker各个组件的介绍 Ground Truth Sagemaker Ground Truth Labeling platform。图片语义分析 Amazon SageMaker Ground Truth semantic segmentation labeling taskGround Truth Active Learning will require human labelling only when needed, works well with small…

如何画好架构图

什么是架构图&#xff1f; 架构图 架构的表达 架构在不同抽象角度和不同抽象层次的表达 架构可以从很多个角度去看&#xff0c;比如&#xff1a;业务架构、应用架构、技术架构、代码架构、数据架构等。 从架构级别来分类&#xff0c;使用金字塔的说明&#xff0c;上层级别…

图像分割论文阅读:Adaptive Context Selection for Polyp Segmentation

这篇论文的主要内容是关于一种用于息肉分割的自适应上下文选择网络&#xff08;Adaptive Context Selection Network&#xff0c;简称ACSNet&#xff09; 1&#xff0c;模型的整体结构 模型的整体结构基于编码器-解码器框架&#xff0c;并且包含了三个关键模块&#xff1a;局部…

贵州省二级分类土地利用数据(矢量)

贵州省&#xff0c;地处中国西南腹地&#xff0c;地貌属于中国西南部高原山地&#xff0c;境内地势西高东低&#xff0c;自中部向北、东、南三面倾斜&#xff0c;平均海拔在1100米左右。贵州高原山地居多&#xff0c;素有“八山一水一分田”之说。全省地貌可概括分为&#xff1…

列表(list)篇(二)

文章目录 2.10 insert()函数2.11 list()函数2.12 pop() 函数2.13 remove()函数2.14 reverse()函数2.15 sort()函数2.16 sorted()函数2.17 sum()函数 2.10 insert()函数 在Python中&#xff0c;list.insert()是一个列表方法&#xff0c;用于在指定索引位置插入一个元素。这个方…

【鸿蒙HarmonyOS开发笔记】通知模块之为通知添加行为意图

概述 WantAgent提供了封装行为意图的能力&#xff0c;这里所说的行为意图主要是指拉起指定的应用组件及发布公共事件等能力。HarmonyOS支持以通知的形式&#xff0c;将WantAgent从发布方传递至接收方&#xff0c;从而在接收方触发WantAgent中指定的意图。例如&#xff0c;在通…

RK3568平台开发系列讲解(pinctrl篇)引脚的复用关系的设置

🚀返回专栏总目录 文章目录 一、调用pinctrl_bind_pins二、dev_pin_info结构体沉淀、分享、成长,让自己和他人都能有所收获!😄 引脚的复用关系是在什么时候被设置的。 一、调用pinctrl_bind_pins 在内核源码目录下的 “drivers/base/dd.c” 文件中 static int really_p…

Java项目:67 ssm家政服务网站设计+jsp

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 家政服务网站&#xff0c;主要的模块包括查看 管理员&#xff1b;个人中心、用户管理、服务类型管理、家政类型管理、家政评价管理、家政资讯…

Cesium for UE-01-虚幻引擎的下载安装及插件配置

学习Cesium for UE的过程笔记 下载UE 下载 下载完成后&#xff0c;点击运行&#xff0c;执行安装 安装完成后需要下载epic game 下载完成&#xff0c;需要登录 没有账号的自行注册&#xff0c;或者选一个有账号的平台登录即可 选择虚幻引擎&#xff0c;再点击库 可以看到下…

课时70:流程控制_for循环_嵌套循环

2.4.4 嵌套循环 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 这里的嵌套实践&#xff0c;与选择语句的嵌套实践基本一致&#xff0c;只不过组合的方式发生了一些变化。常见的组合样式如下&#xff1a;for嵌套for语句for …

【工具使用】VScode配置gcc开发环境

一&#xff0c;简介 本文主要介绍如何在VScode中配置gcc环境&#xff0c;方便开发调试。 二&#xff0c;配置步骤 2.1 gcc环境配置 2.1.1 安装gcc环境 这里我使用的是msys2&#xff0c;具体安装步骤可以参考我另外一篇文章《史上最全msys2下载配置操作步骤》&#xff0c;这…

SpringCloud-Feign远程调用

使用Feign替代RestTemplate进行远程服务调用&#xff1a; 远程调用配置 1. 引入依赖 我们在order-service服务的pom文件中引入feign的依赖&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starte…

LeetCode 45. 跳跃游戏 II java题解

题目 贪心 class Solution {public int jump(int[] nums) {int nnums.length;int max0;//能到达的最远位置int endmax;//边界int res0;//跳跃次数for(int i0;i<n-1;i){//最后一个位置不用跳maxMath.max(max,inums[i]);if(iend){//到达边界。end取决于更新之前的maxendmax;//…