软件构造复习


前言

最佳食用方法是理解记忆,考试时能扯多少是多少,有小部分直接复制@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");
}

  • 控制耦合.一个函数通过传递控制信@RunWith
    @Before
    @Parameters
    @Test息来控制另一个函数.

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. 什么是工厂方法?其结构和核心思想有哪些?
    工厂方法的实质是由一个工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例.
    结构和核心思想:有一个专门的类来负责创建实例的过程...(累了 看P270)

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

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

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

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

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

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

结语

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及...
    dle_oxio阅读 11,091评论 6 244
  • 一、 软件测试基本概念 1 bug的概念 bug类型:defect、fault、problem、error… pr...
    三口一个瓜阅读 3,648评论 0 12
  • 虽然非常失落,但我知道一味这样而不去努力改变不了任何东西。当我没有任何心情去干任何事情的时候,努力起来真是太难了,...
    losheroes阅读 156评论 0 1
  • 这两年,“整理师”这个名词在中国悄然出现,有的人对“整理师”可能有所了解了,有的人可能对“整理师”还很模糊。 今天...
    晓英_日式收纳整理阅读 7,638评论 0 0
  • 小小的人儿快快长大 随着儿童年龄的增长,小小的乳牙已经不能适应长大的颌骨和日益增强的咀嚼力,所以,乳牙从孩子6岁左...
    看萌宝贝阅读 2,488评论 0 0