目录

软件工程uml画图期末考试新闻发布系统

软件工程uml画图期末考试(新闻发布系统)

前文

学校的软件工程考试,基本都是画uml图,不知道其他学校是什么样子。这里就在学习的同时, 从考试角度 把各种图简单分析下,在网上找了找确实也不太好找各类图的画法,觉得我写的有问题的可以指出来。

题目

某客户要求开发用于新闻发布管理系统,以下是调研记录:

记录1:NPS主要功能:用户选择不同栏目及类别浏览、发布、评论、审核。。。

记录2:注册用户浏览、发布、评论新闻。

记录3:管理员对用户、新闻、栏目(大类别)、类别(某栏目的小分类)等进行管理。

记录4:未注册用户只可浏览新闻。

记录5:用户、新闻和访问记录等信息都存储在数据库系统。

记录6:系统要求采用便于扩展的分层设计(至少客户层、业务层、实体层等三层)、 兼容PC、移动的多端应用。

一、需求工程分析绘制需求图RD(共8分)

根据调研记录整理项目需求,要求: ①识别功能性和非功能性需求,②根据业务规则。③绘制系统需求图。至少3层次,各需求描述正确、含义清晰完整。

https://i-blog.csdnimg.cn/blog_migrate/3942cd4af33652152a8a88e2f9c81dd2.png#pic_center

分析

这类题有两种画法,一种是从角色来表达也就是图上这种,一种是从功能来表达,这里给个例子自己领悟,考试觉得哪种方便用哪种。

这里要注意上一层的需求到下一层的子需求之间是聚合关系,要用空心的菱形连接

https://i-blog.csdnimg.cn/blog_migrate/49ab99ac8102a3772d4fac24d9426f08.png#pic_center

这一题算比较简单的了,基本上看下图基本都能看懂,就不再做过多介绍。

二、数据建模绘制逻辑类图CD(8分)

根据调研记录抽象项目的对象、属性及实体间关系,需求:①识别出业务实体,②识别出必要的属性,及其类型、大小,是否空:缺省值等。③识别出对象之间的联系和权重,④图素符号准确.布局合理。

https://i-blog.csdnimg.cn/blog_migrate/1e493d9cf15f8c16bfbab488fef4f148.png#pic_center

分析

栏目、 用户、新闻、类别之间的关系要弄清楚,中文英文都可以。

其次是他们的权属和方向性最好标注出来,中文英文都可以。

必要的属性就行,实体识别出来就可以了,不需要写更多的属性。

不需要很多方法,这是不对的,主要是业务的属性,注意是逻辑建模。

三、架构分析与设计层次结构建模(8分)

根据调研记录和需求分析以及业务数据逻辑类图CD.利用分层设计架构设计系统的体系结构,要求:①至少分3层绘制结构模型图,②标往清晰层次:不要多余和错误的功能,综合考虑分层分包。 https://i-blog.csdnimg.cn/blog_migrate/ebfc2ede1598a52765b469fd3d20cbb8.png#pic_center

分析

首先要分层来画。(3分)

其次用uml来表示架构的时候,我们用包来组织。(3分)

其次是关系,这里的关系主要是依赖。(2分)

包内的元素写多写少都没有太大关系,因为这是分层的体系结构。

三、面向对象分析与设计用例建模

根据调研记录整理出系统用例图,要求:①识别出参与者,②识别出用例,③识别出系统边界,对象属性留息存储于数据库中,④绘制用例图,图素正确。要素齐全,井填写用例规约,每个路径步骤擄述要简洁,见下表。1.绘制整个系统用例图UCD

https://i-blog.csdnimg.cn/blog_migrate/2da8e8fa1538b597ada62259c1ef16a6.png#pic_center

分析

得分点:识别出角色、识别出主要用例、各类关系正确

浏览新闻、登录系统等等这些表述一定要注意动宾结构。后面的包含关系要写出来。

用例规约 UCI(10分)

这里要求写出 删除新闻 的用例规约

分析

每空一分,10分

用例名称 删除新闻

用例编号 NEWS001

用例描述 根据新闻标号选择删除,确认后从数据库删除

参与者 管理员

前置条件 登录系统

基本路径 管理员登录,选择删除新闻操作,选择待删新闻,提交删除,系统确认是否删除,确认后从数据库中删除,数据库减少一条记录

备选路径 确认删除时没选择取消,删除失败

异常路径 1. 如果数据库出现故障,回滚事务结果

  1. 如果服务器出现故障,检查系统日志目录并采取相应措施

后置条件 数据库删除一条新闻信息

绘制分析鲁棒图RD

根据调研记录设计开发所需要的系统类图,要求:①识别出类及其必要的属性和操作(重点是非属性的访问与设置器),②识别出类间的正确关系,③属性和操作必须有清晰、明确的声明和签名,④检制鲁櫸園需给出边界、控制、实体绘制模型中.●层的类及其依赖类的类图,需给出接口、抽象类和具体类的符号,⑤关系和符号表达准确,所有元素为英文,出现中文扣分。

这里是添加新闻的鲁棒图。

https://i-blog.csdnimg.cn/blog_migrate/197b7ae1d5913e212c6f5030e2e23d12.png#pic_center

分析

https://i-blog.csdnimg.cn/blog_migrate/21b69bb3220cef27c0b2bd1e53410500.png#pic_center

一般只要元素正确就没问题。

绘制类及其依赖的类图CD

绘制NewsDao及其依赖类图

https://i-blog.csdnimg.cn/blog_migrate/35974e94d32bec593939d897be478b05.png#pic_center

分析

跟NewsDao相依赖的 News实体类,这里的属性可以写多写少,写一个,其他…也行。

最重要的NewsDao,比如说save(News),注意save的参数是News类型,所以和News之间构成了依赖关系。

NewsDao我们可能会定义个BaseDao抽象类的实现类,这个可以不写,但是NewsDao和News要写。

高阶活动图

评论新闻的高阶活动图。

https://i-blog.csdnimg.cn/blog_migrate/25fa644414ffec930bff2da2bc3a21ed.png#pic_center

分析

得分点。

1.抽取出三个以上活动,分区,得4分。

2.有出点和终点,得2分

3.有决策、同步和转移,得3分

4.内同正确,布局合理,1分

  1. 要把普通用户和管理员合起来,在一张图上画。
  2. 用户的普通的逻辑,新闻是保存入库的。管理员从入库的新闻开始入手,然后做两个判断,一个是写的评论是否合法的,一个是审核评论是否通过的。

顺序图

时序图就有点复杂了,这里给一个链接,是教你10分钟学会画时序图

先给个登录的时序图方便边看边理解。(此图有问题)

https://i-blog.csdnimg.cn/blog_migrate/f896bb284ac0eed997d6e4ce31f692a9.png#pic_center

总结视频的几个重点:

1.序列图显示了系统中的对象或代码中的类如何交互,可以理解成显示事件的顺序。

2.为每个对象添加生命线,生命线是垂直虚线,从上往下意味着时间正在过去。

3.返回信息用虚线,虚线表示返回消息或从接收对象返回到请求对象的消息。

4.备用帧象征着两个或多个消息序列之间的选择,这些选择通常是互斥的。如上图的成功、失败。

当使用备用帧时,需要使用选择框。

5.当表画完后,可以添加激活框,就是上图竖着的长条,从第一个活动消息连到最后一活动消息。激活框显示对象执行过程的时间和持续时间。

角色是外部对象,不需要激活框,所以上图老师给的图有问题。。。,激活框的持续时间也不对。

这里给出视频中的标准序列图,例子是ATM取款。

https://i-blog.csdnimg.cn/blog_migrate/1ceb2637ebe5665ab13e437f63ff1c35.png#pic_center

七、面向对象分析与设计实现测试(30分)

7.1 java代码编写

(1)根据的NPS使用的单例模式,读下图完成编码。①不考虑命名空间和导包,资源文件在项目类路径下,②注意类间关系,重点是属性和方法Java代码编写(10分),

https://i-blog.csdnimg.cn/blog_migrate/11bf1d1419fee359006511423647222f.png#pic_center

分析

从图上看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分)

测试用例编号输入输出结果
TC001206004 osgis123! 管理员loginAdmin管理员页面一致
TC002206004 osgis123! 普通用户loginUser浏览新闻页面一直
TC003206004 osgis123!! 管理员loginFail登陆失败 一致
TC004“” “” 管理员loginError异常 一致