Loading

软件科学概论复习

软件的内在特性

软件的基本特点是前所未有的复杂性,为了降低复杂度我们在不同层面大量采用了抽象方法建立软件概念模型。为了应对易变性,我们努力保持软件设计和实现上的完整性和一致性

系统的三种类型

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

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

--------科研活动大多数属于上面两种类型---------

E系统:嵌入现实世界并随着世界的变化而变化。

---------------大多数软件属于这个类型---------------

什么是设计模式

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

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

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

设计模式的分类

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

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

常用的设计模式

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

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

设计模式背后的设计原则

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

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。在项目计划时,依赖视图能帮助我们找到没有依赖关系的软件模块或者子系统,以便独立的开发和测试。在项目维护时,可以帮助我们理清一个模块的变更对另一个模块的影响。

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

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

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

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

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

什么是高质量软件

软件质量的三种视角

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

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

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

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

posted @ 2022-01-05 16:21  乌有先生ii  阅读(59)  评论(0编辑  收藏  举报