题目来源:年软件工程期末考试卷
题目难度:中等偏上
相关知识点:顺序图,代码分析
解析:
讲到顺序图,其相关的知识点位于书上第六章。顺序图(又称时序图)是UML建模方法的一种,它主要讲究的是用动态的方式描述模块与模块之间,或是类与类之间的一个交互关系。顺序图又分为系统顺序图和一般意义上的顺序图,考试时候一定要注意审题。
其实很多同学在学需求分析这一章的时候,往往不理解画这些图的用意在哪里。这里简单的介绍一下。通俗意义来讲,当你画完了顺序图之后(这里指一般意义上的顺序图),另一个开发人员照着你画的顺序图,就可以正确的完成编码。而真正在企业开发过程中,顺序图可不止关心主流程,还需要关心异常流程,反向流程等。异常流程如支付流程中如果支付失败了,应该如何处理。反向流程如支付退款等。这些都是需要考虑在内的。当然,考试的时候,把题目中提到的主流程写出来就可以了。
这里的题目在某种意义上已经降低了题目的难度,因为它在题目中说明了顺序图中涉及的交互对象,我们无需再去分析这一段代码中需要和哪些对象进行交互。题目中也用代码注释的形式告诉了我们的交互的顺序和方式,如Sales对象先和Commodity对象进行交互,交互的内容为获得商品价格。通过注释,以及对顺序图图例的理解,我们就可以从代码反向生成一个顺序图。
接着看第二题。每次出现这种题目的时候,都能难倒一众考生,因为书上讲了太多太多代码分析的内容,往往不知道从哪个知识点作为切入点来分析题目中的代码。其实,软工考试的一个最大特点是,它的所有代码题基本在课本上都有原型,只要你能够对课本上的代码足够熟悉,平时对书本的代码也进行了细致的分析和理解,考试的时候看到代码就一定能够联想到课本上出现的代码分析片段。
直观的看来,这题首先是违背了迪米特法则,迪米特法则是一个比较抽象的法则,它要求模块只能和直接的模块交流。那什么是直接的模块呢?直接的模块是指:类本身,类方法中的参数对象,类方法中创建的对象,类的成员变量。可以看一下下面的代码,理解一下什么是可以访问的对象:
publicclassPerson{privateintage;//对象的成员变量,可以直接访问publicvoiddrive(Carcar){//car为方法的参数对象,可以访问car.engine.start();//错误,engine为Car的成员变量,不是Person的可访问对象。如果想要引擎启动,应该把这个职责交给car对象进行Personpassenger=newPerson();passenger.age();//可以访问,此处passenger为方法中创建的成员变量,可以直接访问}}publicclassCar{privateEngineengine;}
总结来说,要避免a.b.method形式的访问,在题目中就是salesItems.getCommodity().getQuantity()这样的访问形式。Sales模块应当将计算总价的职责直接委托给SaleLineItem对象来执行,而不是自己亲自去访问销售列表明细获得购买商品件数,再访问商品模块获得商品价格,再自己进行单品总价的计算。
为什么要避免直接访问非邻居对象呢。这也是基于封装和信息隐藏的思想。通过这种方式,无论非邻居对象发生了怎样的变更,Sales模块都不会受到影响。比如说,需求发生了变动,现在需要加入折扣计算,部分商品满两件打9折。此时,只需要SaleLineItem模块去关心真实的计算逻辑,Sales模块仍然可以直接获得单品总价的结算结果。从而实现了变更的隔离。
解答:
1.原时序图
2.核心必须回答出迪米特法则,其它的知识点可以适当回答、
3.新时序图