高级软件工程-复习

高级软件工程复习

坐标国科大,下面是老师说的考试重点。

  1. Ruby编程语言的一些特征需要了解
  2. 要能读得懂Ruby程序
  3. Git的基本命令操作知道
  4. Rails的MVC工作机理需要清楚,Model, Controller, View各司什么职责明白
  5. BDD的User Story需要会,SMART要求能理解
  6. TDD的Rspec读得懂会补充
  7. 重点:最常用的几种设计模式知道、理解、会用;SOLID原则是什么?什么情况下是违背的。

SOA(Service Oriented Architecture)面向服务架构:所有组件都设计为服务、且服务可以组合的软件架构。

**特点:**一个服务直接访问另外一个服务的数据时可能出现不稳定。

image-20250105222415157

4

软件质量(Quality Assurance)

软件质量保障(QA):确保软件开发的质量,改进优化过程,提高效率。

一般通过测试来保证软件质量

image-20250105223053228

image-20250105223104016

image-20250105223612569

这个题的24,怎么选

提高开发者生产力:简洁性、合成、重用和工具

4种技术

  1. 通过表达的简洁化:语法更短更易读、抽象级别提高(高级程序设计语言、自动内存管理、动态脚本语言:计算反射和元编程)
  2. 程序合成(Program Synthesis):生成代码以适应情境和删除条件测试
  3. 重用 (Reuse):重用旧代码vs.编写新代码
    • 重用技术(按历史顺序排列)
      • 过程和函数-procedure, function
      • 标准化库(重用单一任务)-standard library
      • 面向对象编程-Object Oriented Porgramming: 重用和管理任务集合
      • 设计模式-Design Pattern: 实现可以不同, 但重用的是通用策略
  4. 自动化和工具 (Automation & Tools)

DRY-Don’t Repeat Yourself

在一个系统中,每一知识必须有一个单一的、明确的、权威的表示。

P&D软件过程模型

P&D: 计划与文档

  1. 编码前,项目经理制定计划
  2. 撰写计划各阶段的详细文档
  3. 根据计划来度量进展
  4. 项目的变更必须反映在文档中,并可能反映在计划中
瀑布模型螺旋模型Rational统一软件开发过程,RUP
image-20250105224414183image-20250105224447980image-20250105224610698
缺点:当客户看到开发出来的产品时,通常想要对软件产品进行改变,这时就会遇到麻烦。image-20250105224638912image-20250105224626865
image-20250105224545598image-20250105224620339

P&D需要大量的文件和计划,并依赖于经验丰富的经理。

image-20250105224840820

Aglie敏捷开发

个体与交互 vs过程 & 工具

工作软件vs全面文档化

客户协作vs合同谈判

响应变更vs遵从计划

image-20250105225016936

敏捷强调测试驱动开发(TDD)来减少错误,记录用户故事来验证客户需求,用速度来度量进展。

设计模式:捕捉/刻画重复出现问题的常见结构化解决方法。

Client/Server: 架构级设计模式,Web是C/S架构,面向请求/应答方式。

image-20250105225641483

Ruby/Rails框架中,Rails复杂管理防止篡改cookie

2

image-20250105230001028

三层架构:表示层-逻辑(应用)层-持久层

image-20250105230143422

image-20250105230215458

MVC(Model-View-Controller)

提倡痩视图和控制器、不要在视图中添加功能代码。

image-20250105230256794

image-20250105230313058

image-202501052316506832,比如嵌入式系统

在MVC中,用户可以进行的每个交互都是由控制器中的动作来处理的

Ruby语言中的方法(method)处理这种交互。

image-20250105230935122

image-20250105231000999

image-20250105231028015

Git

使用版本控制系统

命令说明
checkout从库中拷贝一个版本的代码
commit将代码写回仓库

Git基础

命令说明
git init创建仓库
git config配置仓库
git clone <url>获取一个仓库
image-20250105232206795将变更录入仓库
git log查看变更历史
git pushgit pull与远程仓库同步
git branch <branch_name>git checkout <branch_name>创建分支
git mergegit rebase (branch 1)在branch2上执行合并分支
git rest --hard <commit_id>回退
git revert <commit_id>撤销

Git配置

Cit配置配置用户信息配置文本编辑器查看配置信息
git config --global / -- localgit config --global user.name "John Doe"git config --global core.editor emacsgit config --list
git config --global user.email johndoe@example.com

Rails

Rails是使用Ruby语言建立的流行编程框架。

Ruby:现代动态脚本编程语言。

面向对象函数式自动内存管理动态类型mix-in闭包用于重用、元编程、程序合成

Rails遵守:(依赖于Ruby的语言特性:自省和元编程闭包模块(混合)

  1. 约定优于配置:命名遵守某些约定、不需要配置文件
  2. DRY:提取公共功能的开发原则:“在一个系统中,每一知识必须有一个单一的、明确的、权威的表示。”

CRUD: create, read, update, delete

Ruby->Database

ActiveRecord::Base子类化。–将模型连接到数据库+CRUD

image-20250106234738821

ActiveRecordcreate 方法是new方法与save方法的组合。

  • save!操作失败会抛出异常。

image-20250106234905336

Rails解决方案: 开发、测试和生产环境都有自己的数据库。

**迁移:**用脚本描述更改,可以跨数据库类型进行安全快速移植。

image-20250106235136067

# 创建迁移
rails generate migration CreateMovies

# 将迁移应用于开发环境
rake db:migrate

# 完成代码测试后,将迁移应用于生产环境,应用迁移还包括在数据库中记录哪些迁移脚本已经用过了
heroku rake db:migrate

# 新模型,创建模型文件
app/models/model.rb

# 更新测试数据库schema
rake db:test:prepare

# 最终部署
heroku rake db:migrate

RUD

image-20250106235806802

Ruby->Routes

image-20250106235958231

image-20250107000020038


Ruby->Views

创建表单—

BDD(行为驱动设计)

BDD:在开发之前开发期间询问有关应用行为的问题,以减少误解。

需求以用户故事的方法记录。

image-20250107000422401

创建用户故事

SMART故事
SMART说明
Specific明确:每个场景可测试
Measurable可度量:已知合理输入,预期结果存在
Achievable可达成(理想情况:一个迭代下完成)
Relevant相关性(5个为什么)image-20250107000911118
Timeboxed时间框(知道何时放弃)

Cucumber测试

通过Cucumber,用户故事成为验收测试和集成测试用例

# 运行一个功能特征测试
cucumber filename

# 运行所有测试
rake cucumber

绿:通过的步骤

黄:还未实现的

红:失败的–然后步骤是蓝色的

目标:使所有步骤通过

显式/隐式、命令式/声明式场景

显式需求:验收测试的一部分

隐式需求:显式需求的逻辑结果、集成测试

  1. 将电影列表
  2. 电影按时间顺序还是字母顺序排列?

**命令式场景:**初始用户故事,有许多步骤,指定逻辑顺序,直达所需结果。

如果很多用户故事是命令式,那就不DRY

**声明式场景:**描述状态而不是序列。(更少的步骤)

声明式步骤:描述应用程序应该处于的状态

命令式步骤:将当前状态改变表示为期望状态的步骤序列

TDD(测试驱动开发)

在代码本身之前,先为代码编写单元和功能测试

Rspec测试被称为specs或者例子

respec filename
# 运行测试

image-20250108090244624

单元测试-FIRST原则

FIRST说明
Fast(快)快速运行测试子集、因为将一直运行它们
Independent(独立)没有测试依赖于其他测试、远程可以以任何顺序运行任何子集
Repeatable(可重复)运行N次,得到相同的结果(以帮助隔离bug并启动自动化)
Self-checking(自检查)测试可以自动检测是否通过
Timely(及时)与被测试的代码同时编写(使用TDD需要先编写测试)

TDD周期:红-绿-重构

以“始终拥有工作代码”为目标。考虑代码应该完成的一件事(功能)

红:在失败的测试中记录/步骤这种想法

绿:编写尽可能简单的代码使测试通过

重构:与其他测试一起来提炼共性、改进代码。

继续完成代码应该做的下一件事。

接缝(Seam)

接缝:可以唉不改变源代码的情况下改变应用程序行为的位置。

对测试有用:将某些代码的行为与其所依赖的其他代码隔离开来。

image-20250108091402582

每个seam仅为测试中地某些特定行为提供足够地支撑。

Seam概念说明
存根(stub)类似should_receive,但没有期望;add_return可选地控制返回值.
模拟(mock)“特技替身”对象,常用于行为验证(让某方法被调用)、字其上为单个方法创建存根.

RSpec

image-20250108091820081

装置/工厂

从何获取真实对象?

装置(Fixture)工厂(Factory)
说明静态地将一些已知数据预加载到数据库表中只创建每次测试所需要的内容动态创建
需求每次测试之前,db需要擦除和重新载入根据测试需要,设置helper来快速创建带有默认属性的对象
赞成的原因真正的静态数据(e.g.永远不变的配置线性),恒容易在一个地方看到所有测试数据保持测试的独立性:不受它们不关心对象的影响
反对的原因可能会引入对装置数据的依赖复杂的关系可能很难建立(但可能表明代码耦合过紧)

测试覆盖、单元测试、集成测试

覆盖度量

覆盖度量说明
S0方法覆盖
S1调用覆盖
C0语句覆盖
C1分支覆盖
C1+判定覆盖:条件中的美国个子表达式
C2路径覆盖(苦难,价值如何有很大分歧)

image-20250108092733364

测试与调试

变异测试:在代码中引入故意的错误、是否会有一些测试失败?

模糊测试:1万只猴子向你的代码扔随机输入:1.发现了MS~20% bug,崩溃了~25%的Unix应用工具2.以应用程序不应该被使用的方式来测试它

DU-覆盖率:每一对<define x/use x>执行了吗?

黑盒测试/集成测试:不依赖于对应用程序结构的理解

白盒测试

代码坏味-SOFA

通过捕获哪些白哦是代码坏味的症状。

  1. Short:短的
  2. One:只做一件事
  3. Few:不多的参数
  4. Abstraction:一致的抽象级别

定量:ABC复杂度

Assignment,Brach,Condition赋值+分支+条件,检查ABC复杂度

Agile敏捷开发


P&D

image-20250108085726511

需求抽取:抽取非功能/功能需求

面谈、合作创建场景(快乐/悲伤路径流)、创建用例(UML描述)

需求文档(软件需求规范记录需求)

需求检查:有效性、一致性、完整性、可行性

PD维护

image-20250108111236483

PD中设计模式

将软件需求规范(SRS)分解为问题(任务):

  1. 对每个任务寻找匹配的设计模式、然后是子问题的某事
  2. 设计评审将有所帮助

P&D中测试方法

将软件需求规范(SRS)划分为编程单元、开发人员编写单元代码+执行编程测试。

**独立的质量保证(QA)**团队进行更改级别的测试:模块、集成、系统、验收测试。

QA集成选项

自顶向下自底向上三明治集成
从依赖关系图的顶部开始从依赖关系图的底部开始两全其美?
高级功能(UI)很快就能开始工作没有stub,吧所有的集成在一个模块中通过自底向上集成一些单元来减少stub构造
构建许多存根Stub让应用程序“工作”不能看到应用程序工作,知道所有的代码和集成完成通过自顶向下集成一些单元,让UI可操作

QA团队测试

QA团队进行系统测试:

  1. 完成的应用程序可以运行
  2. 测试非功能需求+功能需求

何时系统测试?–看机构的政策

  • 测试覆盖级别(C0类似)
  • 所有测试要输入好的/坏的数据

最后一步是:用户/客户验收测试(UAT)–确认&验证

性能

可以是验收测试的一部分。PD周期忽略了性能。

版本管理:

image-20250108094249320

SaaS

SaaS:Software as a Service

SaaS通过运行在客户端设备上的瘦程序(浏览器、APP),访问Internet上以服务形式提供的软件(包括数据)。

优点:

  1. 无需安装、不用担心硬件与OS差异
  2. 无需担心数据丢失(数据远程存储)
  3. 便于团队共享和分享数据
  4. 如果数据很大/频繁更改,在中心站点保存一份副本更简单
  5. 软件单一拷贝、单一部署硬件/软件环境

SaaS对基础设施的需求:

  1. 通讯::允许客户与服务互动
  2. 可扩展性:需求波动满足新服务快速引入、增加用户
  3. 可靠性:服务和通信7*24h可用

SaaS类的设计模式

GoF:结构化、创建型、行为型

image-20250108100846478

模式不是单独的类或者库,也不是完整的设计(更像是设计的蓝图)

image-20250108094922290

**元模式:**把变与不变的东西分开。

  1. 针对接口百年城而不是针对实现编程。
  2. 比起继承,更倾向组合和委托:委托是接口共享、继承是关于实现代码共享。

SOILD面向对象编程原则

动机:将变更的代价最小化。

image-20250108095424916

SOLID原则说明
单一职责(Single Responsibility, SRP)一个类应该有且只有一个改变的理由、每一项职责可能是变化的轴心、对一个轴的更改不应该影响其他轴。
开闭(Open/Close, OCP)类应该对功能扩展开发、对源代码修改关闭。–抽象工厂模式(提炼构造)
里氏替换(Liskov substitution)子类型可以i替代基类型。
依赖注入(injection of dependencied, DIP)需求:a依赖于b,但b的接口和实现可以改变,即使功能稳定; 解决方案:“注入”a和b所依赖的抽象接口
迪米特(Demeter,DP)只和朋友交谈而不是陌生人。1.用委托替换直接方法调用,2.将遍历与计算分离(Visitor模式),3.在不了解实现细节的情况下只关注重要事件 (Observer模式)
观察者模式Observer

实体Observer想hi到何时某些事情发生在实体Subject上。

image-20250108100413028

非功能需求

服务水平目标(SLO,service level oeject)

image-20250108094026951

考试回忆版

哈哈终于考完了,我为期1个多月的考试周终于宣告结束了。

考之前,一直在想,老师会不会根据给的题库然后做一些变动。但实际情况是:完全没有.

让我们说:谢谢老师!

此外,虽然老师给了部分的重点,但是还是和我自己复习的有一些出入,比如,我以为概念应该会考SOLID或者BDD/TDD,像单元测试的SMART,TDD周期的红-绿-重构这些。但其实都没考,反倒是后面出了一个SaaS的概念,但是考前就看了两眼,觉得不会考…

再一个有出入的就是,我以为会考点读Ruby程序给输出的题,毕竟简单,但也完全没有()

所以大家复习的时候,建议还是复习的全面一点,基本上给的题库要全部过一遍,然后根据老师给出重点,再过一遍重要的。因为如果万一没有命中的话,至少之前做过一遍,还是会有印象,至少不会是0分(?)

当然,要是有时间能够全面复习,那就太好辣!

很高兴你能看到这里~
获取考试试题,请到个人博客中找。就不放CSDN了~
Schwertlilien.blog<--------

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初学stm32 --- SPI驱动25Q128 NOR Flash

目录 SPI介绍 SPI结构框图介绍 SPI外设对应的引脚 SPI数据发送与接收 SPI工作原理 SPI 全双工模式的通信机制 从机返回主机之前保存的数据 SPI工作模式介绍 SPI相关寄存器介绍&#xff08;F1 / F4 / F7&#xff09; SPI控制寄存器1&#xff08;SPI_CR1&#xff09; SPI状…

yum系统报错:SyntaxError: multiple exception types must be parenthesized

执行yum相关步骤报错如下&#xff1a; File "/usr/bin/yum", line 30except KeyboardInterrupt, e:^^^^^^^^^^^^^^^^^^^^ SyntaxError: multiple exception types must be parenthesized原因&#xff1a;python解释器版本错误&#xff0c;yum运行版本为python 2.7&am…

STM32第5章、IWDG

一、简介 IWDG&#xff1a;全称是Independent watchdog&#xff0c;即独立看门狗。本质上是一个能产生系统复位信号的计数器。 特性&#xff1a; 是一个递减计数器。 时钟信号由独立的RC振荡器提供&#xff0c;可在待机和停止模式下运行。 看门狗被激活后&#xff0c;当递减计…

快速上手 HarmonyOS 应用开发

一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的工具和功能&#xff0c;支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址&#xff1a…

ThinkPHP 8的一对一关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

像JSONDecodeError: Extra data: line 2 column 1 (char 134)这样的问题怎么解决

问题介绍 今天处理返回的 JSON 的时候&#xff0c;出现了下面这样的问题&#xff1a; 处理这种问题的时候&#xff0c;首先你要看一下当前的字符串格式是啥样的&#xff0c;比如我查看后发现是下面这样的&#xff1a; 会发现这个字符串中间没有逗号&#xff0c;也就是此时的J…

国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)

1 扩展脚本&#xff1a;在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时&#xff0c;比如&#xff1a;Python&#xff0c;经常做完一个小练习后&#xff0c;又需要新建一个文件&#xff0c;在新建文件的时候&#xff0c;不但要选择文件类型&#xff0c…

Java+Maven+GDAL

下载已经编译好的压缩包&#xff0c;下载地址 解压 jar 包 release-1930-x64-dev.zip\release-1930-x64\bin\gdal\java 目录下 打成Maven依赖 mvn install:install-file -Dfilegdal-3.10.1.jar -DgroupIdorg.gdal -DartifactIdgdal -Dversion3.10.1 -Dpackagingjar -Dgener…

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招&#xff0c;打算做一个个人主页&#xff0c;以便在秋招市场上更有竞争力。 目前&#xff0c;现有的一些搭建主页的博文教程存在以下一些问题&#xff1a; 使用Github Page进行部署&#xff0c;这在国内访问容易受阻使用宝塔面板等框架&#xff0c;功能…

【Linux探索学习】第二十五弹——动静态库:Linux 中静态库与动态库的详细解析

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在 Linux 系统中&#xff0c;静态库和动态库是开发中常见的两种库文件类型。它们在编译、链接、内存管理以及程序的性能和可维护性方面有着…

【Rust自学】12.4. 重构 Pt.2:错误处理

12.4.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读取…

算法-贪心算法简单介绍

下面是贪心算法视频课的导学内容. 目录 1. 什么是贪心算法?2. 贪心算法简单的三个例子:1. 找零问题2. 最小路径和问题3. 背包问题 3. 贪心算法的特点4. 贪心算法学习的方式? 1. 什么是贪心算法? 简单来说, 我们称以局部最优进而使得全局最优的一种思想实现出来的算法为贪心…

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架&#xff0c;主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一&#xff0c;具有轻量级、灵活和功能丰富的特点。 核心概念包括路由&#xff0c;中间件&#xff0c;请求与响应&a…

day08_Kafka

文章目录 day08_Kafka课程笔记一、今日课程内容一、消息队列&#xff08;了解&#xff09;**为什么消息队列就像是“数据的快递员”&#xff1f;****实际意义**1、产生背景2、消息队列介绍2.1 常见的消息队列产品2.2 应用场景2.3 消息队列中两种消息模型 二、Kafka的基本介绍1、…

459. 重复的子字符串【力扣】——kmp拼接字符串解法

常规kmp解答 class Solution { public:void getNext(int *next,string s){int j0;next[0]0;for(int i1;i<s.size();i){while(j>0 && s[i]!s[j]){jnext[j-1];}if(s[i]s[j]) j;next[i]j;}}bool repeatedSubstringPattern(string s) {if(s.size()0) return false;i…

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构&#xff08;一&#xff09;远程管理系统&#xff08;二&#xff09;资源管理系统&#xff08;三&#xff09;SLA 管理系统&#xff08;四&#xff09;计费管理系统 二、安全与可靠性保障&#xff08;一&#xff09;数据安全防线&#xff08;…

【STM32】HAL库USB实现软件升级DFU的功能操作及配置

【STM32】HAL库USB实现软件升级DFU的功能操作及配置 文章目录 DFUHAL库的DFU配置修改代码添加条件判断和跳转代码段DFU烧录附录&#xff1a;Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏…

PHP答题考试系统

&#x1f50d; 这是一款由PHP与Uniapp强强联手打造的小程序答题考试系统&#xff0c;它如同智慧教育领域中的一颗璀璨明珠&#xff0c;凭借其强大的功能和灵活多变的应用&#xff0c;牢牢吸引了无数求知者的目光。系统全面覆盖了多种试题类型&#xff0c;从基础易懂的判断题、单…

瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版

前言 在上一篇文章中&#xff0c;我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速&#xff0c;在这篇文章&#xff0c;我将讲解如何使用 ffmpeg-rockchip 用户空间库&#xff08;代码&#xff09;实现 MPP 硬件编解码。 本文不仅适…

Element Plus 之 el-table相同行合并(通用函数),相同列合并(自行判断需合并的字段以及相应的列下标)

展示 代码 <el-table :data"tableData" border style"width: 100%" :span-method"objectSpanMethod"><el-table-column prop"date" label"Date" width"180" align"center" /><el-table…