(1) 来源
C++ 大作业 超市收银系统 - shugen - 博客园
该文章介绍了一个软件的实现过程,并提供了相关代码。通过对该软件的分析对其进行了改进和二次开发。
(2) 运行环境+运行结果的截图(伸缩代码附上)
操作系统:Windows 11
开发工具:Dev-c++
编程语言:C++
运行结果截图:
(3)主要问题列表,针对问题要了改善或者重构
- 代码结构优化:将代码拆分成更小的模块,增强可读性和可维护性。
- 数据存储改进:使用更高效的数据结构,如std::map或std::unordered_map,替代文件存储。
- 功能增强:增加错误处理机制,优化用户交互体验。
- 性能优化:减少不必要的文件读写操作,提升系统响应速度。
- 代码风格改进:统一代码风格,增强代码的可读性。
(4)新代码附上(只要你自己改进的地方)
- 商品信息存储和管理
class Product {
private:
double price;
string name;
long number;
public:
static unordered_map<long, Product> products;
void addproduct() {
long pnumber;
cout << "请输入商品条形码: ";
cin >> pnumber;
if (products.find(pnumber) != products.end()) {
cout << "该商品已存在,请重新选择!" << endl;
return;
}
cout << "请输入商品价格: ";
cin >> price;
cout << "请输入商品名: ";
cin >> name;
products[pnumber] = *this;
cout << "保存商品成功!" << endl;
}
};
unordered_map<long, Product> Product::products;
- 商品信息查找
void Product::search() {
long pnumber;
cout << "请输入商品条形码: ";
cin >> pnumber;
if (products.find(pnumber) == products.end()) {
cout << "未找到该商品,请核对!" << endl;
return;
}
cout << "该商品存在,详情如下:" << endl;
cout << "商品条形码: " << pnumber << endl;
cout << "商品名: " << products[pnumber].name << endl;
cout << "商品价格: " << products[pnumber].price << endl;
}
- 商品信息删除
void Product::del() {
long pnumber;
cout << "请输入商品条形码: ";
cin >> pnumber;
if (products.find(pnumber) == products.end()) {
cout << "该商品不存在,请核对!" << endl;
return;
}
products.erase(pnumber);
cout << "删除成功!" << endl;
}
- 性能优化:减少文件操作
void loadProducts() {
ifstream infile("products.txt");
if (!infile) return;
long pnumber;
string name;
double price;
while (infile >> pnumber >> name >> price) {
Product product;
product.name = name;
product.price = price;
products[pnumber] = product;
}
}
void saveProducts() {
ofstream outfile("products.txt");
for (auto& [pnumber, product] : products) {
outfile << pnumber << " " << product.name << " " << product.price << endl;
}
}
(5)重构的软件的测试截图
(6)总结:难点、花时间比较久的、逆向软件工程的一些思考
- 难点
数据结构的切换与适配:从文件存储改为基于内存的 unordered_map 存储,需要重新设计数据的加载、保存和访问逻辑。这不仅涉及到代码的重构,还需要确保数据的完整性和一致性,尤其是在程序启动和退出时。
用户交互的统一性:原代码中用户交互提示信息格式不统一,改进时需要重新设计提示信息的风格和格式,同时确保其简洁性和易用性。这需要对用户交互设计有一定的理解。
性能优化与内存管理:将数据存储在内存中可以显著提升性能,但也增加了内存管理的复杂性。如何在内存和磁盘之间高效地同步数据,同时避免数据丢失,是一个关键问题。 - 花时间比较久的
代码重构:将原有的基于文件操作的代码逻辑重构为基于内存的数据结构,需要逐行分析原代码的功能,并重新设计新的实现方式。这一过程需要仔细测试,以确保功能的正确性。
数据持久化机制的设计:改进后的代码需要在程序启动时加载数据,并在退出时保存数据。设计高效且可靠的加载和保存机制(如 loadProducts() 和 saveProducts())花费了较多时间,尤其是处理文件格式和异常情况。
用户交互优化:统一用户交互提示信息看似简单,但需要考虑用户体验和国际化支持。重新设计提示信息并替换原有代码中的提示信息,需要对代码进行全局扫描和修改,这一过程较为繁琐。 - 逆向软件工程的思考
理解原代码的逻辑和意图:在改进代码之前,需要深入理解原代码的设计思路和功能实现。通过逆向分析,找出原代码的不足之处(如频繁的文件操作、不统一的用户交互等),并确定改进方向。
平衡功能与性能:改进过程中需要在功能完整性和性能优化之间找到平衡。例如,虽然内存存储提高了性能,但也需要考虑数据的持久化和内存占用问题。这种权衡需要根据实际需求进行设计。
模块化与可维护性:通过将商品信息的存储、查找和删除等功能分离到不同的方法中,并引入 unordered_map 数据结构,代码的模块化和可维护性得到了显著提升。这种改进思路体现了逆向软件工程中对代码结构优化的重视。