移动端新课程添加功能开发总结
设计思想
本次开发任务是实现一个手机端的新课程添加功能,主要解决课程信息录入的规范性和唯一性问题。我的设计思想围绕以下几个核心点展开:

数据唯一性验证:在用户提交前检查课程名称是否已存在,避免重复录入

教师合法性验证:确保任课教师属于系统认可的九位教师之一

地点格式验证:上课地点必须符合指定的教学楼前缀要求

远程数据存储:将验证通过的课程信息安全地存储到远程数据库

源程序代码
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设计、输入验证、数据库操作和异常处理等,是一次非常宝贵的实践学习经历。