目录
第八章 软件设计基础
1.软件设计(名词解释)
2.软件设计的核心思想
第九、十章 软件体系结构设计与构建
1.体系结构概念
2.体系结构的风格的优缺点
(1)主程序/子程序风格
(2)面向对象式风格
(3)分层风格
(4)MVC风格
题目
3.体系结构设计的过程
4.包的原则
4.1. Common Closure Principle (CCP) 共同封闭原则
4.2. Common Reuse Principle (CRP) 共同重用原则
共同封闭原则和共同重用的原则的折衷
4.3. Reuse-Release Equivalency Principle (REP) 重用发布等价原则
4.4. The Acyclic Dependencies Principle (ADP) 无环依赖原则
4.4.1. Dependencies are a DAG
4.4.2. 依赖循环打破循环:第一种方式:
4.4.3. 依赖循环打破循环:第二种方式:
4.4.4. 无环依赖原则的应用场景
4.5. Stable Dependencies Principle (SDP) 稳定依赖原则
4.5.1. 稳定依赖原则
包的稳定性度量
4.6.Stable Abstractions Principle (SAP) 稳定抽象原则
5.8.1. 抽象性度量
5.8.2. 例子
5.体系结构构件之间接口的定义
6.体系结构开发集成测试用例:Stub和Driver
第11章 人机交互设计
1.可用性(名词解释)
2.界面设计的注意事项及解释(至少5个)
3.精神模型,差异性
4.导航、反馈、协作式设计
第12章 详细设计概述
1.详细设计的出发点
(1)信息专家模式
(2)控制器
(3)创建者模式
(4)纯虚构
2.职责分配
3.协作
4.控制风格
5.建立设计类图或详细顺序图
6.协作的测试
参考:南软考研大书,软工二
这位大佬:Blog of Samperson (samperson1997.github.io)
还有这位大佬:SpriCoder的博客
a)为使一软件系统满足规定的需求而定义系统或部件的体系结构、部件、接口和其他特征的过程;
b)设计过程的结果。
复杂度控制
分解、抽象、层次性
高层抽象(体系结构 = 部件 + 连接件 + 配置)
部件+连接件+配置
部件:承载系统主要功能,包括处理与数据
连接件:定义部件间的交互,是连接的抽象表示
配置:定义了部件和连接件之间的关联方式,将它们组织称系统的总体结构
常见风格模式:
设计决策与约束
题目
- 按照功能分解的方式进行模块分割能够实现高内聚的软件设计:√
- 软件系统设计的主要目的是为系统制定蓝图, (D)并不是软件设计模型所关注的。
- 系统总体结构
- 数据结构
- 界面模型
- 项目范围(这个是在需求部分已经完成)
- 体系结构设计是软件非功能性的实现,而详细设计主要是软件功能性的实现。√
以超市系统设计为例,看书。
最高原则:包与包之间不能有重复和冗余、复用发布等价原则、共同封闭原则、共同复用原则、无环依赖原则、稳定依赖原则、稳定抽象原则
前三条描述的是依赖性,后三条描述的是耦合性
根据分配的需求确定模块对外接口,如逻辑层接口根据界面的需求得到,数据层接口根据逻辑层调用得到。
根据刺激与响应确定接口,依据详细规格明确接口内容(数据、返回值)
(1)通常情况下,VIEW的required接口可以直接作为相应Logic的Provided
(2)通常情况下,LOGIC的required接口需要分解为同层模块和不同Data的Provided
(3)Data一般没有层间依赖,接口通常来自于上一层的相应模块
【示例】saleLogic的其他接口来源 :
(1)其他被归类为saleLogic模块承担的需求,如退货用例
(2)同层模块间的依赖
解除双向依赖:需要被抽象为一个独立接口和独立包,saleLogic再导入上面的包
独立接口和独立包也属于saleLogic模块最终承担的Provide接口,也需要转化为对Data的Required接口
在分析其他模块时逐步完善,例如进行礼品赠送时查看特定客户的销售记录、库存分析时查看一定时间段内的销售记录或特定商品的销售记录
在独立接口和独立包中定义有限制的领域类供外界使用,例如对象限制为查询接口,限制数据种类等等
(1)依据模块接口建立桩程序Stub——为了完成程序的编译和连接而使用的暂时代码,对外模拟和代替承担模块接口的关键类,比真实程序简单的多,使用最为简单的逻辑
【示例】P177 SalesBLService_Stub
(2)编写驱动程序,在桩程序帮助下进行集成测试
View的测试比较特殊,其他层都需要增加Driver进行测试
可以基于Junit编写Driver;基于接口规格设计测试用例
开发View层时:需要logic的stub
开发logic层时:需要模仿view的driver,需要data的stub,需要模拟同层调用的driver和stub
开发data层时:需要模拟logic的driver
(3)持续集成:逐步编写各个模块内部程序,替换相应的桩程序
真实程序不仅实现业务逻辑,而且会使用其他模块的接口程序(真实程序或者桩程序)
开始:客户端: view driver, logic stub, data stub;服务器端: logic driver, data stub
进展:客户端: (逐步替换)driver,逐步替换logic stub, data stub;服务器端: logic driver, 逐步替换 data stub
最后联调:使用真实的客户端和服务器
易用性是人机交互中一个既重要又复杂的概念。它不仅关注人使用系统的过程,同时还关注系统对使用它的人所产生的作用,因为比较复杂,所以易用性不是一个单一的质量维度,而是多维度的质量属性。从易于度量的角度讲,易用性的常用维度包括:易学性、易记性、有效率、低出错率和主观满意度。
【题型】例子违反了哪条界面设计原则
(1)不要暴露内部结构
例子:该设计明显暴露了软件结构,三个独立软件过程:创建、更新、解除
(2)展示细节——所见即所得
(3)常见界面类型:软件系统通常同时使用多种界面类型,以适应差异性的用户和任务。
(1)精神模型就是用户进行人机交互时头脑中的任务模型
依据精神模型可以进行隐喻(Metaphor)设计:隐喻又被称为视觉隐喻,是视觉上的图像,但会被用户映射为业务事物。用户在识别图像时,会依据隐喻将控件功能与已知的熟悉事物联系起来,形成任务模型;隐喻本质上是在用户已有知识的基础上建立一组新的知识,实现界面视觉提示和系统功能之间的知觉联系。
(2)用户希望看到的+希望用户看到的:识别并添加哪些能够帮助用户完成任务的功能,任务的频率也要纳入考虑
常见错误:加入一些容易加入(例如正好是一个独立的软件过程)的功能,这会扰乱用户的精神模型,影响使用过程的顺利性
(3)新手用户:关注易学性,进行业务导航,尽量避免出错
专家用户:关注效率
熟练用户:在易学性和效率之间进行折中
好的人机交互应该为不同的用户群体提供差异化的交互机制。
既为新手用户提供易学性高的人机交互机制(图形界面)
又为专家用户提供效率高的人机交互机制(命令行、快捷方式、热键)
(1)导航
主动将自己的产品和服务简明扼要地告诉用户,目的是为用户提供一个很好的完成任务的入口,好的导航会让这个入口非常符合人的精神模型。
全局结构按照任务模型将软件产品的功能组织起来,并区分不同的重要性和主题提供给不同的用户。全局结构常用的导航控件包括窗口、菜单、列表、快捷方式、热键等等。全局结构的设计主要以功能分层和任务交互过程为主要依据。
局部结构通过安排界面布局细节,制造视觉上的线索来给用户提供导航。局部结构常用的导航控件包括可视化控件布局与组合、按钮设置、文本颜色或字体大小等等。局部结构的设计主要以用户关注的任务细节为主要依据。
(2)反馈
让用户能够意识到行为的结果,但不能打断用户工作时的意识流
用户喜欢较短的响应时间;较长的响应时间(>15秒)具有破坏性;
用户会根据响应时间的变化调整自己的工作方式;
较短的响应时间导致了较短的用户思考时间;较快的节奏可能会提高效率,但也会增加出错率;
根据任务选择适当的响应时间:打字、光标移动、鼠标定位:50~150毫秒;简单频繁的任务:1秒;普通的任务:2~4秒;复杂的任务:8~12秒
响应时间适度的变化是可接受的;意外延迟可能具有破坏性;经验测试有助于设置适当的响应时间。
(3)协作式设计
A.简洁设计(摘要图片优于文字描述)
列举、隐藏、赋予(标签、图标等线索暗示)
B.一致性设计(确认与删除键相对位置不一致)
C.低出错率设计(用具体的指导来提示用户出错)
限制输入:列表、可选框等选择性组件代替输入框;按钮代替命令行;限定输入:类型,范围,格式…
限制范围:简单化单步操作
辅助:事前提示;事后检查;随时可以撤销
D.易记性设计
减少短期记忆负担;使用逐层递进的方式展示信息;使用直观的快捷方式。重新认知比记忆更容易;设置有意义的缺省值,可以帮助用户减少记忆负担。
中层设计+低层设计:实现所有功能性+非功能性需求
需求开发的结果(需求规格说明和需求分析模型)和软件体系结构的结果(软件体系结构设计方案与原型)
明确职责建立静态模型(设计类图),明确协作建立动态模型(详细顺序图)
GRASP(General Responsibility Assignment Software Patterns)(1)信息专家模式
基本的职责分配原则之一,把职责分配给具有完成该职责所需信息的那个类
例如:总价(委托)——数目——单价——促销策略:耦合没有增加
总价(得到)——数目、单价、促销策略:增加了耦合(总价知道太多)
优点:促进低耦合、高内聚、维护封装(2)控制器
处理外部事件(用户和系统时钟发生的外部交互)
核心思想:解耦
不要界面直接调用代码,也不要代码直接调用界面,把系统/人/用例作为controller(3)创建者模式
根据潜在创建者类和被示例话类之间的关系决定哪个类创建实例
当满足以下的条件时,B创建A:B“包含”A,或者B组合A;B直接使用A;B拥有A的初始化数据;B记录A(4)纯虚构
软件特有的ui、DAO、RMI、文件读写、复杂行为、设计模式、复杂数据结构、界面与逻辑层的model,不属于现实世界
作用:保持代码可复用性,高内聚、低耦合
通过职责建立静态模型:面向对象分解中,系统是由很多对象组成的。对象各自完成相应的职责,从而协作完成一个大的职责。类的职责主要有两部分构成:属性职责和方法职责。类与类之间也不是孤立存在的,它们之间存在一定的关系。关系表达了相应职责的划分和组合。它们的强弱顺序为:依赖<关联<聚合<组合<继承。
根据协作建立动态模型:(1)从小到大,将对象的小职责聚合形成大职责;
(2)大到小,将大职责分配给各个小对象。通过这两种方法,共同完成对协作的抽象。
为了完成某一个大的职责,需要对职责的分配做很多决策。控制风格决定了决策由谁来做和怎么做决策
分散式:所有系统行为在对象网络中广泛传播
集中式:少数控制器记录所有系统行为的逻辑
委托式(授权式):决策分布在对象网络中,一些控制器作主要决策
抽象类的职责->抽象类之间的关系->添加辅助类
辅助类:接口类、记录类(数据类)、 启动类、控制器类、实现数据类型的类、容器类
MockObject