软件构造复习



前言

最佳食用方法是理解记忆,考试时能扯多少是多少,有小部分直接复制@hwq的答案.其实有心人想要找出那些题目考的概率大也是相对明显的.答案都是基于我自己理解的,不保证正确,觉得不对的也可以下面评论.

解答

  1. 解释模块耦合性的含义,对不同的耦合举例说明。
    (ps:这个题分为两部分,一部分是解释含义,另一部分是举例说明.)
    (1) 耦合性是一个模块与系统其他模块及外部世界的关联程度的度量.
    (2) 以下将对不同耦合进行伪代码的举例说明.(ps:考试写那么多不太科学,我选择先随便举两个例子,有时间再回来补其他的)
  • 非直接耦合.两函数之间没有直接关系.
void a(){
}
void b(){
}
  • 数据耦合.一个函数访问另一个函数,通过简单参数来交换输入输出.
 void addOne(int a){
   return a+1;
}
void b(){
  addOne(1);
}
  • 标记耦合.一组函数通过参数表传递信息.
void setAuthor(Book book,String author){
  book.author=author;
}
void b(){
  setAuthor(new Book(),"jackson");
}
  • 控制耦合.一个函数通过传递控制信息来控制另一个函数.
void cal(int a,int b,char c){
   if(c=='-')
   return  a-b;
  else
   return a+b;  
}
void b(){
  cal(1,2,'-');
}
  • 外部耦合.一组函数都访问同一个全局简单变量.
double PI=3.1415926;
double getArea(double r){
   return PI\*r\*r;
}
double getPerimeter(double r){
   return PI\*r\*2;
}
  • 公共耦合.一组函数访问同一个公共数据环境.
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void getJan(){
   return months[1];
}
void getDec(){
  return months[12];
}
  • 内容耦合.一个函数直接修改另一个函数的内容,或直接转入另一个函数等.
void a(){
  label:printf("hello world");
}
void b(){
  goto label;
}
  1. 解释模块内聚性的含义,对不同的内聚举例说明。
    (1) 内聚性是一个模块内部各个元素之间相互结合的紧密程度的度量指标.要求模块功能明确且单一.
    (2) 以下将利用伪代码对内聚性进行解释.
  • 偶然内聚.模块中的代码无法定义其不同功能的调用.
int getInt(){
   int a=rand()%100;
  int b =rand()%100;
  printf("%d",a+b);
   return a*b;
}
  • 逻辑内聚.把几种相关的功能或数据组合在一起,每次被调用的时候,由传送参数来确定该函数应完成哪种功能.
void cal(int a,int b,char c){
   if(c=='-')
   return  a-b;
  else
   return a+b;  
}
  • 时间内聚.把需要同时执行的动作组合在一起形成的函数为时间内聚函数.
void init(){
  PI=3.1415;
  E=2.718281;
}
  • 过程内聚.一系列有序的操作.
void dealFile(){
  open file;
   deal file;
  close file;
}
  • 通信内聚.函数内所有处理元素都在同一个数据结构上.
void deal(Person p){
   p.name='zz';
  p.old=18;
}
  • 顺序内聚. 前一条语句的输出作为下一条语句的输入.
void printRandom(){
  int number=rand()%10;
  int answer=number*10;
  printf("%d",answer);  
}
  • 功能内聚.函数各个部分是为了完成某一项功能必不可少的部分.
void dealFile(){
  open file;
   change file;
  close file;
}
  1. 请简要描述模块化设计的原则。
    (1) 模块可分解性
    (2) 模块可组装性
    (3) 模块可理解性
    (4) 模块连续性
    (5) 模块保护性

  2. 请简要描述一下使用JUnit进行单元测试的基本步骤
    (1) 为待测软件(类)建立一个测试类。
    (2) 编写用@Before注解的setUp()来进行初始化测试类。
    (3) 为待测类的成员方法/函数编写测试方法。
    (4) 运行测试。
    (5) 每增加一个方法或修改代码时,重复执行(3)、(4)。

  3. 请简要描述防御性编程及其基本技术。
    (1) 防御性编程是程序员要预计其他程序员的过错 无效输入 甚至有害数据及使用者的过失,采取适当措施保护自己的程序.
    (2) 主要有以下两种种技术.
      处理错误
      使用异常

  4. 交互设计的8条黄金规则是什么?
    (1) 尽量保持一致
    (2) 满足普遍可用性
    (3) 提供信息反馈
    (4) 设计对话框以产生结束信息.
    (5) 预防并成立错误
    (6) 允许撤销操作
    (7) 支持内部控制点
    (8) 减轻短时记忆负担

  5. 简单说明软件调试和软件测试的区别与联系。
    (1)软件测试是为了找出错误
    (2)软件调试是为了修正错误
    (3)软件测试得到错误后要调试
    (4)软件调试修正错误后要重新测试

  6. 请简要描述在Eclipse中的调试过程。可以结合代码描述。

int main(){
  int a,b;
  scanf("%d%d",&a,&b);
  double d=a/b;
  printf("%lf",d);
  return 0;
}

(0)输入6 5的时候发现输出结果为1.0不符合预期
(1)在可能出现错误的地方double d=a/b;设置断点
(2)启动调试
(3)单步执行查看变量d变化
(4)在单步执行时应当注意变量变化,大脑中同步程序运行,观察到变量变化不合理
(5)注意到是由于整数相除引起的问题,修正为double d=(double)a/b;
(6)再次测试结果正确

  1. 请写简要描述一下常见的Java编程风格。
    (1) 不应该出现魔法值(未经定义的常量).
    (2) 对于常量名字应当全部大写.
    (3) 函数与变量命名采用驼峰式.
    (4) 类名开头字母大写.
  2. 使用下图解释里氏替换原则,尽可能的用代码来解释。
    图一
class Testes{
  public void test1(Horse horse){
    System.out.println(horse.name);
  }
  public static void main(){
   BlackHorse bh=new BlackHorse();
   bh.setName("小旋风");
   Testes ts=new Testes();
   ts.test1(bh);
    }
}

(1) 图中白马黑马都继承了

                   .-' _..`.
                  /  .'_.'.'
                 | .' (.)`.
                 ;'   ,_   `.
 .--.__________.'    ;  `.;-'
|  ./               /
|  |               /
`..'`-._  _____, ..'
     / | |     | |\ \
    / /| |     | | \ \
   / / | |     | |  \ \
  /_/  |_|     |_|   \_\
 |__\  |__\    |__\  |__
,函数要求的参数也是马.
(2) 因为白马黑马是马的子类,所以子类黑马的实例可以当做马类来看待并执行函数.
(3) 要求子类能够替换基类,这就是里氏替换原则.

  1. 使用下图解释开闭原则,尽可能的用代码来解释。
    图二
    (1) 开闭原则要求对扩展开放,对修改封闭.
    (2) 图中东海龙王 西海龙王 太白金星已经是文武仙卿的子类了.
    (3) 对扩展开放是指可以不改变其他代码的情况下直接增加一个弼马温的类.
    (4) 对修改封闭是指不能随意修改已完成类或者函数的内部结构.
  2. 解释什么是单一职责原则,在编程实践中该如何实践这一原则。
    (1) 一个类只有一种功能.
    (2) 在设计程序前应当做好类图.
    (3) 虽然实践有时候存在困难,但应尽量避免一个类多功能.
  3. 使用下图解释依赖倒转原则,尽可能的用代码来解释。这里墨子的“爱人”是一个行为,是指施以仁爱。

图三

public interface People{}
public Yr extends People{}
public Lr extends People{}
 public Cr extends People{}
public class MoZi {
  protected ArrayList<People> plist;
  public void love(People p) {
    plist.add(p);
  }
}
//强哥代码

(1) 墨子爱人,爱的是抽象的人.
(2) 不管是什么人都可以爱(抽象不依赖于细节).
(3) 所以墨子无论是越人 鲁人 楚人都爱.(古代中央空调??)
(4) 前提是这三个都是人,而不是阿猫阿狗,即细节依赖与抽象.
(5) 总结一句就是抽象不依赖于细节,细节依赖于抽象.

  1. 请简要叙述代码走查。主要说明其形式、目的和意义。
    (1) 至少两人组成,其中一人协调走查,另一人扮演测试者.
    (2) 测试者提出测试用例
    (3) 走查会议上在大脑中执行程序,演变程序执行状态,发现错误.
    (4) 目的:是为了发现错误.
    (5) 意义:有助于验证设计和实现之间的一致性.

  2. 请简要叙述正式审查。主要说明其形式、目的和意义。(P149)
    (1) 形式上分为计划 流程 结果和追查.
    (2) 要求最少四人
    (3) 目的: 为了发现程序的缺陷.
    (4) 意义: 确保错误能够被及时发现并及时改正.

  3. 请简述代码重构的原因、目的和原则。
    原则:代码重构就是在不改变软件外部行为的前提下改善它的内部结构。
    原因、目的:改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性

  4. 什么是设计模式?它是在哪些级别上的复用?
    设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
    代码级复用。

  5. 什么是工厂方法?其结构和核心思想有哪些?
    在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
    结构和核心思想:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

  6. 请简要描述适配器模式及其适用场合?
    适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
    这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
    场合:1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

  7. 软件缺陷管理的状态和级别有哪些?
    常见的缺陷状态有:“新建”、“待解决”、“已解决”、“已修复”
    缺陷的严重程度
    描述缺陷的严重程度,一般分为“致命”、“严重”、“一般”、“细微”四种
    缺陷的紧急程度
    描述缺陷的紧急程度,从1-4,1是优先级最高的等级,4是优先级最低的等级
    缺陷的紧急程度与严重程度虽然是不一样的,但两者密切相关,往往的越是严重,就越是紧急,所以有些组织只用“严重程度”

  8. JUNIT需要使用的注解有哪些?
    @RunWith
    @Before
    @Parameters
    @Test

  9. 断言的使用原则是什么?
    (1) 每个assert只检验一个条件 [因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败 ]
    (2) 不能使用改变环境(比如变量)的语句 [因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题 ]
    (3) 使用断言对函数的参数进行确认。
    (4) 使用断言捕捉不应该发生的非法情况。

  10. 框架的概念是什么?是在哪些级别上的复用?
    就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现。
    模块级复用

  11. 在UML类图中,类与类之间有哪些关系?符号是什么?依赖和泛化有什么区别?
    (1) UML中关系主要有依赖,聚合,组合,泛化和实现
    (2) 对应上条每点依次是虚线箭头,空心的菱形+实线箭头,实心的菱形+实线箭头,空心三角形+实线,空心三角形+虚线.(ps:dbq,在下记不住)
    (3) 依赖关系是指两个或多个类之间的依存关系,如植物类依赖于土壤类.
    (4) 泛化是类之间的继承关系.

结语

  本来想把程序题代码也贴一下,想想代码都该不一样,而且自己java编程水平有限.就不贴了吧.


文章作者: 青椒
版权声明: 本笔记所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 青椒 !
 上一篇
计算机网络期末复习 计算机网络期末复习
网络及其计算复习 如有谬误,欢迎指正 第一章简述分组交换的要点 报文分组,加首部。 经路由器储存转发。 在目的地合并。 比较电路交换、报文交换和分组交换的主要优缺点电路交换——整个报文的比特流连续地从源点直达终点,好像在一个管道中传送。
2020-01-05 青椒
下一篇 
浙江水利新闻分析 浙江水利新闻分析
2013年至今水利新闻标题中的关键词 文章内容中的关键词可以看出防汛防台工作一直是水利行业的重要组成部分 哪些地区在水利方面做的很好 频繁出现在水利厅新闻上可以看出地级市中绍兴市,温州市在这方面做的很棒,而县级地区中兰溪、海宁、萧山都做的很
2018-12-17 青椒
  目录