前文

学校的软件工程考试,基本都是画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. 如果数据库出现故障,回滚事务结果
2. 如果服务器出现故障,检查系统日志目录并采取相应措施
后置条件 数据库删除一条新闻信息

绘制分析鲁棒图RD

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

这里是添加新闻的鲁棒图。
在这里插入图片描述

分析

在这里插入图片描述
一般只要元素正确就没问题。

绘制类及其依赖的类图CD

绘制NewsDao及其依赖类图
在这里插入图片描述

分析

跟NewsDao相依赖的 News实体类,这里的属性可以写多写少,写一个,其他…也行。
最重要的NewsDao,比如说save(News),注意save的参数是News类型,所以和News之间构成了依赖关系。
NewsDao我们可能会定义个BaseDao抽象类的实现类,这个可以不写,但是NewsDao和News要写。

高阶活动图

评论新闻的高阶活动图。
在这里插入图片描述

分析

得分点。
1.抽取出三个以上活动,分区,得4分。
2.有出点和终点,得2分
3.有决策、同步和转移,得3分
4.内同正确,布局合理,1分

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

顺序图

时序图就有点复杂了,这里给一个链接,是教你10分钟学会画时序图
https://www.bilibili.com/video/BV12f4y127pp?from=search&seid=6737327818590504170
先给个登录的时序图方便边看边理解。(此图有问题)
在这里插入图片描述

总结视频的几个重点:
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 异常 一致
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐