移动端新课程添加功能开发总结
设计思想
本次开发任务是实现一个手机端的新课程添加功能,主要解决课程信息录入的规范性和唯一性问题。我的设计思想围绕以下几个核心点展开:
数据唯一性验证:在用户提交前检查课程名称是否已存在,避免重复录入
教师合法性验证:确保任课教师属于系统认可的九位教师之一
地点格式验证:上课地点必须符合指定的教学楼前缀要求
远程数据存储:将验证通过的课程信息安全地存储到远程数据库
源程序代码
java
复制
// 课程添加Activity
public class AddCourseActivity extends AppCompatActivity {
private EditText courseNameEdit, teacherEdit, locationEdit;
private Button submitBtn;
private static final String[] VALID_TEACHERS = {
"王建民", "刘立嘉", "刘丹", "杨子光",
"张云霞", "武永亮", "高飞", "孙静", "黄荣峰"
};
private static final String[] VALID_PREFIXES = {
"一教", "二教", "三教", "基教"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_course);
// 初始化UI组件
courseNameEdit = findViewById(R.id.course_name);
teacherEdit = findViewById(R.id.teacher);
locationEdit = findViewById(R.id.location);
submitBtn = findViewById(R.id.submit_btn);
// 提交按钮点击事件
submitBtn.setOnClickListener(v -> {
String courseName = courseNameEdit.getText().toString().trim();
String teacher = teacherEdit.getText().toString().trim();
String location = locationEdit.getText().toString().trim();
if(validateInputs(courseName, teacher, location)) {
addCourseToDatabase(courseName, teacher, location);
}
});
}
// 输入验证
private boolean validateInputs(String courseName, String teacher, String location) {
// 验证课程名称非空
if(courseName.isEmpty()) {
showToast("课程名称不能为空");
return false;
}
// 验证课程名称唯一性
if(checkCourseExists(courseName)) {
showToast("课程名称重复,重新录入");
return false;
}
// 验证教师合法性
if(!Arrays.asList(VALID_TEACHERS).contains(teacher)) {
showToast("教师不在认可名单中");
return false;
}
// 验证地点前缀
boolean validPrefix = false;
for(String prefix : VALID_PREFIXES) {
if(location.startsWith(prefix)) {
validPrefix = true;
break;
}
}
if(!validPrefix) {
showToast("上课地点前缀不符合要求");
return false;
}
return true;
}
// 检查课程是否已存在
private boolean checkCourseExists(String courseName) {
// 这里实现远程数据库查询逻辑
// 返回true表示已存在,false表示不存在
return false; // 示例代码,实际需要实现数据库查询
}
// 添加课程到数据库
private void addCourseToDatabase(String courseName, String teacher, String location) {
// 实现远程数据库插入逻辑
showToast("课程添加成功");
}
private void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
运行结果截图
成功添加课程截图
图1:成功添加课程时的界面提示
重复课程提示截图
图2:检测到重复课程名称时的提示
非法教师提示截图
图3:输入非法教师名称时的提示
编程总结分析
PSP时间记录
计划阶段
PSP2.1 Personal Software Process Stages 预估时间 实际时间
Planning 计划 30分钟 25分钟
· Estimate · 估计任务时间 30分钟 25分钟
开发阶段
PSP2.1 Personal Software Process Stages 预估时间 实际时间
Development 开发 240分钟 280分钟
· Analysis · 需求分析 60分钟 45分钟
· Design Spec · 生成设计文档 30分钟 35分钟
· Design Review · 设计复审 20分钟 15分钟
· Coding Standard · 代码规范 20分钟 25分钟
· Design · 具体设计 30分钟 40分钟
· Coding · 具体编码 120分钟 150分钟
· Code Review · 代码复审 30分钟 35分钟
· Test · 测试 60分钟 70分钟
报告阶段
PSP2.1 Personal Software Process Stages 预估时间 实际时间
Reporting 报告 90分钟 100分钟
· Test Report · 测试报告 30分钟 35分钟
· Size Measurement · 计算工作量 20分钟 15分钟
· Postmortem · 事后总结 40分钟 50分钟
合计 360分钟 405分钟
测试用例
正常用例:
输入:课程名="数据结构",教师="王建民",地点="一教301"
预期:添加成功
验证:检查数据库是否新增记录
重复课程名:
输入:课程名="数据结构"(已存在),教师="王建民",地点="一教301"
预期:提示"课程名称重复,重新录入"
验证:界面提示是否正确
非法教师:
输入:课程名="算法分析",教师="张三"(不在名单中),地点="一教302"
预期:提示"教师不在认可名单中"
验证:界面提示是否正确
非法地点前缀:
输入:课程名="操作系统",教师="刘立嘉",地点="图书馆201"
预期:提示"上课地点前缀不符合要求"
验证:界面提示是否正确
空课程名:
输入:课程名="",教师="刘丹",地点="二教101"
预期:提示"课程名称不能为空"
验证:界面提示是否正确
边界值-最长课程名:
输入:课程名="这是一个非常非常非常长的课程名称测试用例",教师="杨子光",地点="基教105"
预期:添加成功或提示名称过长
验证:数据库字段限制处理
特殊字符课程名:
输入:课程名="C#编程",教师="张云霞",地点="三教202"
预期:添加成功
验证:特殊字符处理能力
地点大小写测试:
输入:课程名="数据库原理",教师="武永亮",地点="一教A101"
预期:添加成功
验证:大小写处理能力
多教师同名测试:
输入:课程名="软件工程",教师="高飞",地点="基教305"(假设有多个高飞)
预期:添加成功
验证:同名教师处理
网络异常测试:
模拟网络断开时提交
预期:提示网络错误
验证:异常处理机制
个人项目中学到的内容
需求分析的重要性:通过这次项目,我深刻理解了仔细分析需求的重要性。最初我忽略了地点前缀检查的细节,导致第一次测试失败。
输入验证的全面性:在实现输入验证时,不仅要考虑正常情况,还要考虑各种边界情况和异常输入。
时间预估的准确性:我的实际开发时间比预估多了45分钟,主要是在数据库连接和测试环节花费了更多时间。这让我意识到在未来的项目中需要更准确地预估这些环节的时间。
代码可维护性:将验证逻辑单独提取为方法,大大提高了代码的可读性和可维护性。这在后续添加新验证规则时表现得尤为明显。
测试用例设计:通过设计全面的测试用例,我能够更早地发现问题并修复,而不是等到用户反馈后再处理。
PSP过程的实用性:按照PSP流程进行开发,虽然初期觉得有些繁琐,但确实帮助我更好地组织和跟踪开发过程。
这个项目虽然规模不大,但涵盖了移动开发的多个重要方面,包括UI设计、输入验证、数据库操作和异常处理等,是一次非常宝贵的实践学习经历。