1. 新闻发布系统需求分析实战新闻发布系统作为软件工程课程的经典案例本质上是一个多角色协作的内容管理平台。我当年第一次做这个项目时最头疼的就是分不清栏目和类别的关系。后来发现用报纸来类比就简单多了——栏目相当于报纸的要闻版、娱乐版这些大板块而类别就是娱乐版下的电影、音乐这些细分标签。需求图(RD)绘制要点顶层需求建议按角色划分访客、注册用户、管理员三大类第二层展开功能性需求比如管理员包含用户管理、新闻审核等非功能性需求单独作为分支包括系统安全性、多端兼容性等使用Enterprise Architect工具时记得用空心菱形箭头表示聚合关系实际考试中遇到过这样的坑有同学把新闻搜索功能放在访客和注册用户两个分支下重复出现。正确做法应该是作为公共需求放在更高层级。建议先画草稿确认无冗余再正式绘图毕竟橡皮擦修改UML图会留下难看的痕迹。2. 数据建模与类图设计技巧类图(CD)是面向对象设计的核心但考试时最容易犯的错误就是过度设计。根据我的项目经验新闻系统的核心实体其实就四个User、News、Category、Comment。曾经见过有同学给News类加了二十多个属性结果被扣分——考试考察的是业务核心属性不是数据库全字段设计。关键关联关系示例class News { String title; String content; User author; // 关联关系 ListComment comments; // 聚合关系 } class Category { String name; ListNews newsList; // 组合关系 }特别注意权限控制的体现普通User类有comment()方法但审核新闻的approve()方法应该放在Admin子类中。考试时用英文命名能避免扣分实在不会拼写就用中文但保持统一。3. 分层架构设计详解调研记录中要求的三层架构其实可以有多种实现方式。传统分层是表现层、业务层、持久层但在微服务架构下我更推荐以下分法接口层处理HTTP请求和响应格式化应用层核心业务逻辑如新闻审核流程基础设施层数据库访问、文件存储等用包图表示时要注意每个包标注layer构造型依赖关系必须是单向的上层依赖下层典型错误业务层包出现Servlet API的导入考试中遇到过把Spring框架的jar包也画进架构图的案例这属于过度设计。分层图应该关注逻辑架构而非技术选型细节。4. 动态行为建模实战4.1 用例图常见误区删除新闻用例的常见错误画法忘记标注include关系必须包含权限检查把数据库操作作为用例这是实现细节系统边界包含管理员角色角色应在边界外正确做法是用例名称保持动宾结构比如浏览新闻(browseNews) 发布新闻(publishNews) 删除新闻(deleteNews)4.2 顺序图绘制要诀新闻审核的顺序图最易出错的是生命线控制管理员生命线不应有激活条外部参与者NewsService的激活条要长于DAO层返回消息必须用虚线箭头participant Admin participant NewsController participant NewsService participant NewsDAO Admin - NewsController: 提交审核请求 activate NewsController NewsController - NewsService: verifyNews() activate NewsService NewsService - NewsDAO: updateStatus() activate NewsDAO NewsDAO -- NewsService: deactivate NewsDAO NewsService -- NewsController: deactivate NewsService NewsController -- Admin: 显示结果 deactivate NewsController考试时如果时间不够优先保证消息箭头方向正确、激活条层次清晰、返回消息明确。5. Java代码实现细节5.1 单例模式防坑指南Env类的典型实现陷阱忘记同步锁导致线程不安全未处理反射攻击漏洞资源文件加载未关闭流改进后的线程安全写法public class Env { private static volatile Env instance; private Env() { try(InputStream is getClass().getResourceAsStream(/db.properties)) { // 加载配置 } catch(Exception e) { throw new RuntimeException(初始化失败, e); } } public static Env getInstance() { if(instance null) { synchronized(Env.class) { if(instance null) { instance new Env(); } } } return instance; } }5.2 单元测试最佳实践登录功能的测试用例设计要考虑边界值空用户名、超长密码异常流错误凭证、权限不足安全测试SQL注入尝试JUnit测试示例Test public void testLoginWithEmptyCredential() { LoginAction action new LoginAction(); String result action.login(request, response); assertEquals(loginError, result); assertNotNull(request.getAttribute(loginmessage)); } Test public void testAdminLoginSuccess() { when(voUser.getUserType()).thenReturn(管理员); when(loginService.login(any())).thenReturn(true); String result action.login(request, response); assertEquals(loginAdmin, result); verify(request).setAttribute(eq(currentUser), any()); }测试数据准备推荐用Before方法初始化Mock对象避免重复代码。实际项目中发现越简单的测试用例越容易暴露设计问题。6. 常见考试失误分析根据多年阅卷经验高频扣分点包括类图中出现界面控件如JButton活动图缺少同步条fork/join鲁棒图混淆控制类和业务类代码实现与类图方法签名不一致有个实用的检查技巧完成所有图表后用反向验证法——随机选择一个类的方法检查在所有相关图中是否保持一致的可见性和参数列表。曾经有个学生在类图中将setStatus()设为private却在顺序图中让其他对象调用它这种矛盾会直接导致大量失分。最后提醒考试时间分配建议需求分析20分钟、设计建模40分钟、代码实现30分钟、检查10分钟。宁可某个图略简略也要保证完整性半成品图是拿不到基础分的。