南软爱码士
查看: 436|回复: 2
打印 上一主题 下一主题

[历年真题] 每日一题分享

[复制链接]

1

主题

4

帖子

21

积分

新手上路

Rank: 1

积分
21
跳转到指定楼层
楼主
发表于 2019-8-10 13:12:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
题目来源:2017年软院期末试题
图片看不清楚的可以阅读下面代码:

class Application{??private String applicationName;??private float averageRate;??private ArrayList newFeatureItems = new ArrayList<>();??String getDescriptionForIOS(){? ? StringBuffer result = new StringBuffer();
? ? result.append("This is " + applicationName + "for IOS platform. /n");
? ? for(int i = 0 ; i
? ? result.append("average rate from App Store");? ? result.append(String.valueOf(averageRate));? ? return result.toString();??}
??String getDescriptionForAndroid(){? ? StringBuffer result = new StringBuffer();
? ? result.append("This is " + applicationName + "for Andriod platform. /n");
? ? for(int i = 0 ; i
? ? result.append("average rate from Google Play");? ? result.append(String.valueOf(averageRate));? ? return result.toString();??}}





OCP问题代码截图.png (171.11 KB, 下载次数: 75)

OCP问题代码截图.png

OCP问题.jpg (119.57 KB, 下载次数: 68)

OCP问题.jpg
分享到:? 微信微信
收藏收藏 分享淘帖

1

主题

4

帖子

21

积分

新手上路

Rank: 1

积分
21
沙发
?楼主| 发表于 2019-8-10 13:13:15 | 只看该作者
解析:

做任何代码分析题,首要的任务是,理解代码是什么意思。考试时候软件工程考试的代码分析题往往是JAVA语法进行编写,包含部分伪代码的成分。如这题里面就没有给出NewFeature这个类的完整内容,但是从代码中我们可以理解这个类中至少包含一个description属性。补充的代码如下:

class NewFeature{
??private String description;
??//...
??public String getDescription(){
? ? return this.description;
??}
}


这段代码其实描述的是,针对不同的平台,Application类会提供不同的描述内容。如苹果的App Store会生成面向App Store主题的App描述,谷歌的Google Play则会生成面向该应用商店的App描述。但是,生成描述的方式大同小异,都是拼接出该应用面向的平台,以及根据应用的功能列表生成应用描述。



因此,直观上来说,它首先将大段重复的代码放在两个方法中。任何出现重复代码的地方必定触发了重复耦合,并且违背了DRY原则(Do Not Repeat Yourself)。这两个知识点也是最容易想到的知识点。针对重复代码的修改方案一般是将共有的部分抽取出来,如抽取出方法、利用模板模式等,进行重构。



系统的每一个功能都应该有唯一的实现。也就是说,如果多次遇到同样的问题,就应该抽象出一个共同的解决方法,不要重复开发同样的功能。



在得出最表层的结论之后,我们一般从代码的可维护性入手,继续分析代码潜在违背的设计原则。



代码的可维护性包括了代码的可修改性和可扩展性,一般我们会着重分析代码的可修改性。在软件工程领域中有一句俗语,”软件中唯一不变的是变化本身“。因此,在开发程序时,需要很好的考虑未来软件可能出现的变更,并且为之做好准备。



这里用两个方法分别面向安卓和IOS来提供应用描述,但是应用发布的平台往往不止这两个,就比如最近话题热度极高的即将推出的华为鸿蒙操作系统。假如应用需要支持鸿蒙系统,则必须新增一个方法来专门实现面向该系统。假如一共有N个方法跟平台的具体类型有关,而现在一共有M个操作系统,则必须支持N*M个方法,且每增加一个平台需要增加N个方法。因此这里违背了开闭原则(OCP Open Close Principle)。Application类不再是稳定的,它极易出现变更。



开闭原则是指软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的



针对开闭原则的代码修改方案包括多态,策略模式等。



在分析完耦合和代码的可维护性之后,我们再从内聚性来研究一下这段代码。可以看到,获取应用的描述包含三个部分:应用面向的平台、应用的功能和应用在该平台上的平均打分。可以说一个获取描述的功能中包含了三个操作,违背了单一职责原则(SRP Single Responsibility Principle)。应当将每个操作再提取出来,使得其内聚性更强。



这种类型的题目切入点其实非常多,考试的时候往往不会要求所有的要点均回答出来,一般能够回答出相关的三个原则就会给相应的分数。因此,要从各个角度对代码进行分析,只要能够合理解释,就回答到卷子上。

1

主题

4

帖子

21

积分

新手上路

Rank: 1

积分
21
板凳
?楼主| 发表于 2019-8-10 13:22:30 | 只看该作者
查看完整答案,欢迎关注公众号 软院考研直通车 获得最新的考研咨询,免费的资料和每日一题!

返回顶部