《大道至简》读后感
《构建之法》读后感
在软件开发的学习旅程中,我有幸阅读了《构建之法》这本书,它为我打开了一扇全新的窗户,让我对软件工程有了更深刻、更全面的认识。
过去,我在编写代码时,常常是想到什么就写什么,缺乏系统的规划和设计。比如在完成一个小型项目时,我直接就开始写代码,没有进行需求分析、模块划分等前期工作。结果在开发过程中,发现很多功能实现起来困难重重,代码也变得混乱不堪,最后不得不花费大量时间进行修改和重构。我也曾看到身边有些同学在团队开发中,不注重与他人的沟通协作,各自为政,导致项目进度缓慢,代码整合时出现各种冲突。
我将所有功能的代码都写在一个main函数里,没有进行任何的模块化设计。下面是我当时写的部分代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string names[100];
double grades[100];
int count = 0;
int choice;
while (true) {
cout << "1. 添加学生成绩" << endl;
cout << "2. 查找学生成绩" << endl;
cout << "3. 显示所有学生成绩" << endl;
cout << "4. 退出" << endl;
cout << "请选择操作:";
cin >> choice;
if (choice == 1) {
cout << "请输入学生姓名:";
cin >> names[count];
cout << "请输入学生成绩:";
cin >> grades[count];
count++;
}
else if (choice == 2) {
string searchName;
cout << "请输入要查找的学生姓名:";
cin >> searchName;
bool found = false;
for (int i = 0; i < count; i++) {
if (names[i] == searchName) {
cout << "学生 " << names[i] << " 的成绩是:" << grades[i] << endl;
found = true;
break;
}
}
if (!found) {
cout << "未找到该学生!" << endl;
}
}
else if (choice == 3) {
for (int i = 0; i < count; i++) {
cout << "学生 " << names[i] << " 的成绩是:" << grades[i] << endl;
}
}
else if (choice == 4) {
break;
}
else {
cout << "无效的选择,请重新输入!" << endl;
}
}
return 0;
}
结果在开发过程中,当需要添加计算平均分的功能时,我不得不在主函数中挤入新的代码,导致程序结构更加混乱。后来想修改存储方式,将数组改为vector时,几乎要重构整个程序,这让我深刻体会到缺乏设计的代码维护成本有多高。
结合《构建之法》中所讲,我意识到这种做法存在诸多弊端。首先,单一函数承担所有职责,违反了"单一职责原则",导致代码可读性差、可维护性低。其次,数据和操作混杂在一起,不符合面向对象的封装思想,当数据结构发生变化时,所有相关操作都需要修改。
为了避免再次掉入这些陷阱,我认为应该从以下几个方面改进。在项目开始前,要进行充分的需求分析和规划,明确项目的目标、功能和模块划分。可以采用 UML 等建模工具进行系统设计,为后续开发提供清晰的蓝图。在团队开发中,要建立有效的沟通机制,定期召开会议交流进展和问题。可以使用版本控制工具如 Git,确保代码的同步和整合。同时,要注重代码的规范和文档的编写,提高代码的可读性和可维护性,下面是改进后的代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 学生类 - 封装学生数据
class Student {
private:
string name;
double grade;
public:
Student(string n, double g) : name(n), grade(g) {}
string getName() const { return name; }
double getGrade() const { return grade; }
};
// 学生管理类 - 封装数据操作
class StudentManager {
private:
vector<Student> students; // 使用vector更灵活
public:
void addStudent(const Student& s) {
students.push_back(s);
}
const Student* findStudent(const string& name) const {
for (const auto& s : students) {
if (s.getName() == name) {
return &s;
}
}
return nullptr;
}
void displayAll() const {
for (const auto& s : students) {
cout << "学生 " << s.getName() << " 的成绩是:" << s.getGrade() << endl;
}
}
// 新增功能:计算平均分
double calculateAverage() const {
if (students.empty()) return 0;
double sum = 0;
for (const auto& s : students) {
sum += s.getGrade();
}
return sum / students.size();
}
};
// 界面交互类 - 处理用户交互
class UI {
private:
StudentManager manager;
void showMenu() const {
cout << "1. 添加学生成绩" << endl;
cout << "2. 查找学生成绩" << endl;
cout << "3. 显示所有学生成绩" << endl;
cout << "4. 计算平均分" << endl;
cout << "5. 退出" << endl;
cout << "请选择操作:";
}
public:
void run() {
int choice;
while (true) {
showMenu();
cin >> choice;
if (choice == 1) {
string name;
double grade;
cout << "请输入学生姓名:";
cin >> name;
cout << "请输入学生成绩:";
cin >> grade;
manager.addStudent(Student(name, grade));
}
else if (choice == 2) {
string name;
cout << "请输入要查找的学生姓名:";
cin >> name;
const Student* s = manager.findStudent(name);
if (s) {
cout << "学生 " << s->getName() << " 的成绩是:" << s->getGrade() << endl;
} else {
cout << "未找到该学生!" << endl;
}
}
else if (choice == 3) {
manager.displayAll();
}
else if (choice == 4) {
cout << "平均成绩是:" << manager.calculateAverage() << endl;
}
else if (choice == 5) {
break;
}
else {
cout << "无效的选择,请重新输入!" << endl;
}
}
}
};
int main() {
UI ui;
ui.run();
return 0;
}
改进后的代码通过类的封装实现了职责分离,每个类只负责自己的功能。当需要添加新功能如计算平均分,只需在StudentManager中添加相应方法,再在UI中增加调用即可,无需修改其他部分。这种模块化设计大大提高了代码的可维护性和可扩展性,这正是《构建之法》中强调的"分而治之"思想的体现。
《构建之法》让我明白,软件工程不仅仅是编写代码,更是一个系统工程,需要从多个方面进行科学的管理和实践。在今后的学习和实践中,我将努力将书中的理念和方法运用到实际项目中,不断提升自己的软件开发能力。我相信,只有不断学习和实践,才能在软件开发的道路上走得更远,取得更好的成绩。

浙公网安备 33010602011771号