软件工程uml画图期末考试新闻发布系统
软件工程uml画图期末考试(新闻发布系统)
前文
学校的软件工程考试,基本都是画uml图,不知道其他学校是什么样子。这里就在学习的同时, 从考试角度 把各种图简单分析下,在网上找了找确实也不太好找各类图的画法,觉得我写的有问题的可以指出来。
题目
某客户要求开发用于新闻发布管理系统,以下是调研记录:
记录1:NPS主要功能:用户选择不同栏目及类别浏览、发布、评论、审核。。。
记录2:注册用户浏览、发布、评论新闻。
记录3:管理员对用户、新闻、栏目(大类别)、类别(某栏目的小分类)等进行管理。
记录4:未注册用户只可浏览新闻。
记录5:用户、新闻和访问记录等信息都存储在数据库系统。
记录6:系统要求采用便于扩展的分层设计(至少客户层、业务层、实体层等三层)、 兼容PC、移动的多端应用。
一、需求工程分析绘制需求图RD(共8分)
根据调研记录整理项目需求,要求: ①识别功能性和非功能性需求,②根据业务规则。③绘制系统需求图。至少3层次,各需求描述正确、含义清晰完整。
分析
这类题有两种画法,一种是从角色来表达也就是图上这种,一种是从功能来表达,这里给个例子自己领悟,考试觉得哪种方便用哪种。
这里要注意上一层的需求到下一层的子需求之间是聚合关系,要用空心的菱形连接
这一题算比较简单的了,基本上看下图基本都能看懂,就不再做过多介绍。
二、数据建模绘制逻辑类图CD(8分)
根据调研记录抽象项目的对象、属性及实体间关系,需求:①识别出业务实体,②识别出必要的属性,及其类型、大小,是否空:缺省值等。③识别出对象之间的联系和权重,④图素符号准确.布局合理。
分析
栏目、 用户、新闻、类别之间的关系要弄清楚,中文英文都可以。
其次是他们的权属和方向性最好标注出来,中文英文都可以。
必要的属性就行,实体识别出来就可以了,不需要写更多的属性。
不需要很多方法,这是不对的,主要是业务的属性,注意是逻辑建模。
三、架构分析与设计层次结构建模(8分)
根据调研记录和需求分析以及业务数据逻辑类图CD.利用分层设计架构设计系统的体系结构,要求:①至少分3层绘制结构模型图,②标往清晰层次:不要多余和错误的功能,综合考虑分层分包。
分析
首先要分层来画。(3分)
其次用uml来表示架构的时候,我们用包来组织。(3分)
其次是关系,这里的关系主要是依赖。(2分)
包内的元素写多写少都没有太大关系,因为这是分层的体系结构。
三、面向对象分析与设计用例建模
根据调研记录整理出系统用例图,要求:①识别出参与者,②识别出用例,③识别出系统边界,对象属性留息存储于数据库中,④绘制用例图,图素正确。要素齐全,井填写用例规约,每个路径步骤擄述要简洁,见下表。1.绘制整个系统用例图UCD
分析
得分点:识别出角色、识别出主要用例、各类关系正确
浏览新闻、登录系统等等这些表述一定要注意动宾结构。后面的包含关系要写出来。
用例规约 UCI(10分)
这里要求写出 删除新闻 的用例规约
分析
每空一分,10分
用例名称 删除新闻
用例编号 NEWS001
用例描述 根据新闻标号选择删除,确认后从数据库删除
参与者 管理员
前置条件 登录系统
基本路径 管理员登录,选择删除新闻操作,选择待删新闻,提交删除,系统确认是否删除,确认后从数据库中删除,数据库减少一条记录
备选路径 确认删除时没选择取消,删除失败
异常路径 1. 如果数据库出现故障,回滚事务结果
- 如果服务器出现故障,检查系统日志目录并采取相应措施
后置条件 数据库删除一条新闻信息
绘制分析鲁棒图RD
根据调研记录设计开发所需要的系统类图,要求:①识别出类及其必要的属性和操作(重点是非属性的访问与设置器),②识别出类间的正确关系,③属性和操作必须有清晰、明确的声明和签名,④检制鲁櫸園需给出边界、控制、实体绘制模型中.●层的类及其依赖类的类图,需给出接口、抽象类和具体类的符号,⑤关系和符号表达准确,所有元素为英文,出现中文扣分。
这里是添加新闻的鲁棒图。
分析
一般只要元素正确就没问题。
绘制类及其依赖的类图CD
绘制NewsDao及其依赖类图
分析
跟NewsDao相依赖的 News实体类,这里的属性可以写多写少,写一个,其他…也行。
最重要的NewsDao,比如说save(News),注意save的参数是News类型,所以和News之间构成了依赖关系。
NewsDao我们可能会定义个BaseDao抽象类的实现类,这个可以不写,但是NewsDao和News要写。
高阶活动图
评论新闻的高阶活动图。
分析
得分点。
1.抽取出三个以上活动,分区,得4分。
2.有出点和终点,得2分
3.有决策、同步和转移,得3分
4.内同正确,布局合理,1分
- 要把普通用户和管理员合起来,在一张图上画。
- 用户的普通的逻辑,新闻是保存入库的。管理员从入库的新闻开始入手,然后做两个判断,一个是写的评论是否合法的,一个是审核评论是否通过的。
顺序图
时序图就有点复杂了,这里给一个链接,是教你10分钟学会画时序图
先给个登录的时序图方便边看边理解。(此图有问题)
总结视频的几个重点:
1.序列图显示了系统中的对象或代码中的类如何交互,可以理解成显示事件的顺序。
2.为每个对象添加生命线,生命线是垂直虚线,从上往下意味着时间正在过去。
3.返回信息用虚线,虚线表示返回消息或从接收对象返回到请求对象的消息。
4.备用帧象征着两个或多个消息序列之间的选择,这些选择通常是互斥的。如上图的成功、失败。
当使用备用帧时,需要使用选择框。
5.当表画完后,可以添加激活框,就是上图竖着的长条,从第一个活动消息连到最后一活动消息。激活框显示对象执行过程的时间和持续时间。
角色是外部对象,不需要激活框,所以上图老师给的图有问题。。。,激活框的持续时间也不对。
这里给出视频中的标准序列图,例子是ATM取款。
七、面向对象分析与设计实现测试(30分)
7.1 java代码编写
(1)根据的NPS使用的单例模式,读下图完成编码。①不考虑命名空间和导包,资源文件在项目类路径下,②注意类间关系,重点是属性和方法Java代码编写(10分),
分析
从图上看Env继承Properties类,依赖于InputStream。
其中有一个私有的属性Instan,类型为Env。
一个公共的方法getInstance,类型为Env。
一个私有方法makeInstance,类型为void。
一个不带参的构造方法Env。
答案
public final class Env extends Properties{
private static Env instance;
//私有的构造方法,写公共的不给分
private Env() {
InputStream is = getClass().getResourceAsStream("/db.properties");
try {
load(is)
}catch(Exception e){
e.printStackTrace();
System.out.println("db.properties isnot exists!");
}
}
public static Env getInstance() {
if(instance != null) {
return instance;
}else {
makeInstance();
return instance;
}
}
//私有 同步 静态
private synchronized static void makeInstance() {
//双检查
if(instance == null) {
instance = new Env();
}
}
}
总结这道题,基本上框子写出来了,注意些细节就可以拿6分以上了。
类名写好,私有属性写好,这是一个得分点。
私有的构造方法Env,里面的内容记不住就不写,写好方法框架就有分了。
后面两个方法要写出来,都是得分点。
7.2 Java多线程实现事件监听(10分)。
(2)根据NPS用户登录实现见下图,设计单元测试用例并改写为可测程序。
public class LoginAciton extends BaseAction implements Action{
protected boolean interceptorServlet(String uname,String upwd) {
if(uname=="" || upwd=="") {
String strLog = "System.out.println:用户名密码为空 LoginAction拦截了,不必去db服务了\n";
System.out.println(strLog);
return true;
}
return false;
}
public String login(HttpServletRequest request,HttpServletResponse response) throws Exception{
String result="";
String nps_username = request.getParameter("username");
String nps_password = request.getParameter("username");
String nps_usertype = request.getParameter("usertype");
if(interceptorServlet(String uname,String upwd)) {
String message = "用户名或密码为空!";
request.setAttribute("loginmessage",message);
return result = "loginError";
}
User voUser = new User();
voUser.setNps_username(nps_username);
voUser.setNps_password(nps_password);
voUser.setNps_usertype(nps_usertype);
LoginService loginService = new LoginService();
if(loginService.login(voUser)) {
request.setAttribute("currentUser",voUser);
if(voUser.getNps_usertype().equals("管理员")) {
List<User> userList = loginService.findAll();
request.setAttribute("userList",userList);
result = "loginAdmin";
}
else if(voUser.getNps_usertype().equals("普通用户")) {
NewsService newsService = new NewService();
List<News> newsList = newsService.findAll();
request.setAttribute("newsList",newsList);
result = "loginUser";
}
}
else {
String message = "用户名或密码错误,登录失败!";
request.setAttribute("loginmessage",message);
result = "loginFail";
}
return result;
}
}
得分点
1.每个if else2分,共6分
2.必要说明,3分
3.程序正确,1分
答案
public String login(HttpServletRequest request,HttpServletResponse response) throws Exception{
String result=null;
String nps_username = request.getParameter("username");
String nps_password = request.getParameter("username");
String nps_usertype = request.getParameter("usertype");
User voUser = new User();
voUser.setNps_username(nps_username);
voUser.setNps_password(nps_password);
voUser.setNps_usertype(nps_usertype);
request.setAttribute("currentUser",voUser);
//将拦截操作移至服务层
LoginService loginService = new LoginService();
if(loginService.login(voUser)) {
if(voUser.getNps_usertype().equals("管理员")) {
//将加载用户信息移至服务层
result = "loginAdmin";
}
else if(voUser.getNps_usertype().equals("普通用户")) {
//将加载新闻信息移至服务层
result = "loginUser";
}
}
else {
String message = "用户名或密码错误,登录失败!";
request.setAttribute("loginmessage",message);
result = "loginFail";
}
return result;
}
}
(2)采用白盒测试技术的路径覆盖方法为login设计多组测试用例,填在下表(4分)
测试用例编号 | 输入 | 输出 | 结果 |
---|---|---|---|
TC001 | 206004 osgis123! 管理员 | loginAdmin | 管理员页面一致 |
TC002 | 206004 osgis123! 普通用户 | loginUser | 浏览新闻页面一直 |
TC003 | 206004 osgis123!! 管理员 | loginFail | 登陆失败 一致 |
TC004 | “” “” 管理员 | loginError | 异常 一致 |