软件科学概论复习

软件的内在特性

系统的三种类型

S系统:有规范定义,可从规范派生

P系统:需求基于问题的近似解,但现实世界保持稳定

什么是设计模式

基于面向对象设计原则总结出的经验模型。

按照模块化追求的高内聚低耦合目标,使用模块化封装方法,只对外暴露必要的可见信息,将变化和不变的部分进行适当的隔离。在设计模式的基础上,可以更方便地增量且迭代。设计模式是 在某一情景下的问题解决方案,必须针对每个特定用途进行修改和调整。

设计模式由四部分组成——名称、目的、解决方案、该解决方案的约束和限制。

设计模式的分类

按照主要用于类上还是对象上——类模型和对象模型

根据设计模式可以完成的任务——创建型模式、结构型模式、行为型模式。

常用的设计模式

单例模式、原型模式、建造者模式、代理模式、适配器模式

模板方法就是类模式的体现

设计模式背后的设计原则

开闭原则:对扩展开放,对修改关闭

LISkov替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能。为了降低耦合度我们往往使用对象组合来替代继承关系。

依赖倒置原则:高层模块不依赖于低层模块,两者均应该依赖于抽象。,要面向接口编程,不要面向实现编程。以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定得多。依赖倒置原则有利于降低模块之间的耦合度,提高内聚度。

单一职责原则:控制类的粒度大小,提高内聚度。逻辑简单。

迪米特法则:最少知识法则,两个软件实体如果无需直接通信,就可以通过第三方转发调用,可以降低耦合度。

合成复用原则:类的复用通常分为继承复用和组合复用。合成复用原则要求在软件复用时,要尽量先使用组合或者聚合关系来实现,其次才考虑使用继承关系来实现。”黑箱复用”,耦合度低,复用灵活度高(可以在运行时动态进行)

MVC架构为什么更灵活?

MVC即模型-视图-控制器,模型封装核心数据和功能,独立于特定的输入输出行为,只提供功能性接口;视图向用户显示信息,决定模型以何种形式展示给用户;控制器作用于视图和模型上,创建模型和视图,并将视图和模型相关联。 用户对于模型的操作是通过控制器进行的,当模型状态改变时会通知视图进行更新。

MVC架构是典型的中介者模式,通过控制器来降低模型和视图的交互关系,降低系统中对象间的耦合度,是对象组合的应用。(与代理模式完全不一样!代理模式是客户代码通过代理访问服务代码,如外地接口本地化)

MVC模式通常用于开发具有人机交互界面的软件,因为用户界面容易随着需求变化而变化。如果将视图和模型紧密耦合在一起,就很难扩展,对视图的任何改动都可能在其他功能上产生错误。

MVVM为什么更智能?

随着前端页面越来越复杂,用户对交互性的要求越来越高,jQuery远远不够,于是将MVVM引入到JS开发中,前端有了MVVM的设计思想,MVVM让前端和后端逻辑开发分离。

MVVM和MVC的主要目的都是为了分离视图和模型。

在MVVM中,视图可以独立于模型的变化和修改。ViewModel负责把Model的数据同步到View显示出来,还负责把View的修改同步回Model。也就是说,不像MVC那样, 在MVVM中V和M不可以直接通信,更加降低了耦合。

软件架构复用方法

克隆:完整地借鉴相似项目的设计方案,甚至代码,只需要完成一些细枝末节的适配工作。

重构:构建软件模型的基本方法,对系统进行分解,并在已有模型的基础上逐步形成软件架构的建模方法。

软件架构模型为什么重要

  • 软件架构模型有利于项目成员从整体上理解整个系统。
  • 给复用提供了高层视图, 既可以辅助决定从其他的系统中复用设计,也给我们自己构建的架构提供了未来复用的可能。
  • 为整个项目提供了蓝图,贯穿于项目的生命周期,有助于进行增量和迭代
  • 有助于理清系统演化的内在逻辑,理清软件架构上的依赖关系,进行项目的风险管理。

几种架构的分解方法(六种)

构建软件架构模型就是在不同的层次上分解系统并抽象出关键要素,有以下几种分解方法:

面向功能分解,如用例建模

面向特征分解,根据系统中大量显著的特征进行分解

面向数据分解,业务领域建模中形成业务数据模型时应用

面向并发分解,将系统分解到不同的并发任务中。

面向事件分解,如果系统需要处理大量事件则可以考虑。

面向对象分解,通用的分析设计范式

软件架构的描述方法(七种)

软件架构模型是通过一组关键视图来描述的, 同一个软件架构,由于选取的视角和抽象层次不同可以得到不同的视图

分解视图:分解是构建软件架构模型的关键步骤,分解视图也是构建软件架构模型的关键视图。分解视图有较为明晰的分解结构,一般会通过不同的抽象层级形成 层次化结构

依赖视图:依赖视图展现了软件模块之间的依赖关系。如模块A调用了模块B,就说A依赖于B。 在项目计划时,依赖视图能帮助我们找到没有依赖关系的软件模块或者子系统,以便独立的开发和测试。 在项目维护时,可以帮助我们理清一个模块的变更对另一个模块的影响。

泛化视图:展现软件模块之间的 一般化或具体化的关系。如类之间的继承关系,将继承用对象组合替代,并不会改变泛化关系。泛化视图有助于软件的维护和扩展,比如通过继承或对象组合使得新的软件模块和原有软件兼容。

执行视图从运行结构的角度出发,展现了系统运行时的时序结构,如流程图等。执行视图中每一个组件都不同于其他组件。 执行实体与软件代码有着比较直接的映射关系,在设计和实现过程中,一般将执行视图转换为伪代码,再进一步转换为实现代码。

实现视图从目录文件的角度出发,展现了软件架构和源文件之间的映射关系。一般我们通过目录和源文件命名来对应软件架构中的静态结构。有助于码农在海量源文件中找到某个静态结构的实现。实现视图和静态结构映射关系的一致性越高,越有利于软件维护。

部署视图执行实体和计算机资源的映射关系,比如以进程为执行实体,那么对应的计算机资源就是主机,此时就描述进程对应于主机的网络拓扑结构。有助于设计人员分析一个设计的质量属性,提高软件的并发处理能力。

工作分配视图从项目团队组织的角度出发,将系统分解为可以独立完成的任务,分配给各个项目团队,在项目执行阶段有助于跟踪各个成员的工作进度,调整项目资源。在项目计划阶段对于进度规划,项目评估和经费规划都有益处。

什么是高质量软件

软件质量的三种视角

产品视角:产品视角分为内部质量和外部质量,内部质量是开发者看到的,如代码缺陷,外部质量是用户看到的,如正确的功能。

过程视角:即开发和维护的过程,过程质量更注重不断持续的过程改进。

价值视角:软件的商业价值,如资本投入,运营成本,毛利率,税后成本等。一般会从市场规模和开发成本来对新项目进行估值。

几种重要的软件质量属性:易于维护、良好的性能、安全性、高内聚低耦合、可靠性、鲁棒性、易用性、商业目标

Original: https://www.cnblogs.com/Grong/p/15767587.html
Author: 乌有先生ii
Title: 软件科学概论复习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585745/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 剑指offer计划25(模拟中等)—java

    1.1、题目1 剑指 Offer 29. 顺时针打印矩阵 1.2、解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制。创建res数组存放结果。循坏开始,遍历完一…

    Linux 2023年6月11日
    087
  • urandom和random区别

    linux中提供了 /dev/urandom 和 /dev/random 两个特殊设备来提供随机数。那么这两个文件有什么区别呢?要回答这个问题,先需要了解熵这个概念。 熵linux…

    Linux 2023年6月7日
    075
  • redis

    ./redis-cli -a 111 KEYS "key*" | xargs ./redis-cli -a 111 DEL Original: https://…

    Linux 2023年5月28日
    087
  • MongoDB安装使用教程

    MongoDB安装使用教程 介绍 MongoDB是一个基于分布式文件存储的数据库,是一个文档数据库,支持的数据结构非常松散,是类似json的bson格式,可以存储比较复杂的数据类型…

    Linux 2023年6月6日
    088
  • SpringBoot-MVC自动配置原理

    MVC自动配置原理 5.1 官网阅读 在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制。 只有把这…

    Linux 2023年6月14日
    092
  • 访问github 与 mac修改hosts并刷新DNS

    加速githubhttps://ipaddress.com/website/github.global.ssl.fastly.nethttps://ipaddress.com/we…

    Linux 2023年6月8日
    0108
  • Git工作流程

    学于2018年6月 总的流程: 一: 首先克隆整个项目到本地 二: 在本地创建一个属于自己的分支, 并push到远程(当时的工作情况是, 每实现一个功能, 或修改一个BUG都创建一…

    Linux 2023年6月6日
    0112
  • 一篇文章Shell脚本快速入门

    Shell脚本基础入门 Bash注释 Bash只支持单行注释,使用 #开头的都被当作注释语句: 整行注释 echo hello world # 行尾注释 通过Bash的一些特性,可…

    Linux 2023年5月28日
    064
  • MSSQL中游标的语法结构

    | 0.21分钟 | 342.4字符 | 1、引言&背景 2、开箱即用的游标结构 3、声明与参考资料 | SCscHero | 2022/4/30 PM10:3 | 系列 …

    Linux 2023年6月14日
    078
  • 【CentOS】检查系统是否安装OpenSSH

    CentOS7 远程联机 哔哩哔哩 萌狼蓝天 博客:https://mllt.cc 微信公众号:萌狼蓝天 检查与安装配置OpenSSH [CentOS7]检查系统是否安装OpenS…

    Linux 2023年5月27日
    086
  • Redis相关监控参数【转】

    1 慢查询 默认情况下命令若是执行时间超过10ms就会被记录到日志,slowlog只会记录其命令执行的时间,不包含io往返操作,也不记录单由网络延迟引起的响应慢。如果想修改慢命令的…

    Linux 2023年5月28日
    068
  • Linux 配置 IPv4或 IPv6地址

    Linux 配置 IPv4或 IPv6地址 配置 配置介绍 查看网络 ifconfig 网卡介绍 eth0 :本地网卡(CentOS7 是ens33) lo :内网网卡,管理内网I…

    Linux 2023年6月6日
    081
  • Nginx 配置文件说明

    bash;gutter:true;</p> <h1>定义Nginx运行的用户和用户组</h1> <p>user www www;&l…

    Linux 2023年6月8日
    086
  • 从磁盘删除Ubuntu出现的问题

    问题描述:Win10+Ubuntu双系统,利用磁盘管理工具删除了Ubuntu占用的磁盘,导致开机直接进入Grub界面,并且启动项仍有Ubuntu。 问题解决: 开机进入BIOS或启…

    Linux 2023年6月14日
    088
  • mac安装homebrew

    1.安装连接 按照下面链接安装https://brew.sh/ 2.百分之99会报错curl: (7) Failed to connect to raw.githubusercon…

    Linux 2023年6月14日
    080
  • Redis时延问题分析及应对

    Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞;当redis的数据量达…

    Linux 2023年5月28日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球