软件开发与创新课程设计第一次作业

1)来源:同学课程设计ii的期末大作业
2)运行环境(Devc++)

3)
问题 改进方案
1. 重复main函数 删除重复的main函数,合并逻辑到统一入口。
2. goto滥用 用while循环和状态变量替代,增强可读性。
3. 全局数组BOOK/B 封装为BookManager和UserManager类,使用单例模式管理数据。
4. 字符数组溢出风险 改用std::string存储字符串,使用getline(cin, str)安全读取输入。
5. 输入验证不足 增加密码复杂度检查、图书数量非负校验、选项合法性判断。
6. 固定数组大小限制 使用std::vector动态管理用户和图书数据。
7. 文件操作风险 添加文件打开失败处理,避免程序崩溃(如try-catch块)。
8. 编码混乱 统一使用std::wcout和宽字符(L"..."),修复中文乱码问题。
9. 订单逻辑缺陷 重构订单模块,使用std::map记录购买记录,避免数据覆盖。
`// --------------- adm.cpp 改进:封装图书管理类 ---------------
class BookManager {
private:
std::vector books;
static BookManager instance;
BookManager() {} // 单例模式
public:
static BookManager& getInstance() { return instance; }

void loadBooks() {
    std::wifstream file("book.txt");
    if (!file) throw std::runtime_error("无法打开文件!");
    // 使用宽字符读取数据到 books
    // ...
}

void addBook(const std::wstring& name, int price, int sum) {
    if (price < 0 || sum < 0) 
        throw std::invalid_argument("价格或数量不能为负!");
    books.emplace_back(name, price, sum);
    saveToFile();
}

void saveToFile() {
    std::wofstream file("book.txt");
    for (const auto& book : books) {
        file << book.name << L"," << book.price << L"," << book.sum << std::endl;
    }
}

};

// --------------- 用户输入安全处理(原 main.cpp)---------------
std::wstring readInput() {
std::wstring input;
std::getline(std::wcin, input);
if (input.empty()) throw std::invalid_argument("输入不能为空!");
return input;
}

// --------------- 管理员功能循环替代 goto(原 adm.cpp)---------------
void adm::way() {
int choice;
while (true) {
printMenu(); // 封装菜单输出
std::wcin >> choice;
switch (choice) {
case 1: ls(); break;
case 2: addBookSafe(); // 封装添加逻辑
// ...其他选项
case 8: return; // 退出循环,不再使用 exit(0)
default: std::wcout << L"无效选项!" << std::endl;
}
}
}
5)总结
·难点:
单例模式实现时需确保线程安全,最终采用静态局部变量解决。
替换goto时需重构多层嵌套逻辑,用状态变量控制流程。
·耗时点:
文件读写格式从二进制改为文本,需重新设计数据序列化方式。
动态容器(std::vector)与原有固定数组逻辑的兼容性调整。
·逆向工程思考:
通过分析全局变量依赖,逐步解耦模块,降低耦合度。
发现原代码中订单数据可能覆盖的问题,通过std::map记录用户ID和购买记录解决。
·启示:
避免使用全局变量,优先面向对象设计。
输入输出需严格验证,避免安全漏洞。`

posted @ 2025-02-26 17:58  肖郝毅成  阅读(16)  评论(0)    收藏  举报