根据自身对面向对象方法与系统设计的理解,参照《重构-改善既有代码的设计》书中关于不良设计(违反SOLID)、不良代码(代码坏味道bad smells)的判别标准,分点讨论现有代码中的问题。#pragma once #include<iostream> #include<xstring> #include"student.h" using namespace std; class book { public: void setbooks(string name, string isbn, string information, int page, int price, int ben); void setbook();//输入书的信息 void setname();//输入名字 string getname();//返回书名 void setisbn();//输入isbn码 string getisbn();//返回isbn码 void setinformation();//输入图书信息 string getinformation();//返回图书信息 void setpage();//输入图书页数 int getpage();//返回图书页数 void setprice();//输入图书价格 int getprice();//返回图书价格 void setben();//输入书的数量 int getben();//返回书的数量 void reduceben();//书的数量减少 void plusben();//书的数量增加 void showbook();//显示书的各种信息 bool judge(string isbn1);//判断ISBN合法性 ~book(); private: string name, isbn, information; int price, page, ben; };
时间: 2024-01-26 11:04:53 浏览: 29
现有代码中存在以下问题:
1. SRP(单一职责原则):book类承担了太多的职责,包括输入书的信息、展示书的各种信息、判断ISBN合法性等,违反了单一职责原则。
2. OCP(开放封闭原则):代码中没有考虑到未来需求的变化,如增加新的书籍类型或者增加不同的书籍属性,代码需要重新修改,违反了开放封闭原则。
3. LSP(里氏替换原则):代码中没有使用继承或多态等方式来统一管理不同类型的书籍,导致代码的扩展性和可维护性较差,违反了里氏替换原则。
4. DIP(依赖倒置原则):代码中依赖具体实现而非抽象,如使用了具体的string类型而非抽象的接口或基类,导致代码的耦合性较高,违反了依赖倒置原则。
5. 代码坏味道(bad smells):代码中存在重复代码、命名不规范、代码冗余等问题,需要进行重构来提高代码质量。
相关问题
重构-改善既有代码的设计 扫描版pdf
重构指的是通过优化和改善既有代码的设计来提高软件的可维护性、可扩展性及可重用性。扫描版pdf指的是通过扫描仪将纸质文档转换成电子文件的方式进行存储和传输。将二者结合起来,即是指通过扫描版pdf的方式对既有代码的设计进行修改和优化。
首先,扫描版pdf可能存在识别错误或乱码等问题,因此在进行代码重构时需要特别注意代码的准确性和完整性。其次,根据代码的实际情况,需要采取不同的重构方式,如提炼函数、合并函数、提取类等,以有效地改善代码质量和结构。
重构的目的是为了改善代码的设计,使其更易于理解和维护。通过重构,可以将冗长、复杂、重复的代码进行优化,提高代码的可读性和可维护性,减少出错的可能性,同时也可以使代码更加灵活、可扩展和可重用。
总的来说,采用扫描版pdf的方式对既有代码进行重构是可行的,但需要注意代码的准确性和完整性,并结合实际情况采取不同的重构方式,以达到改善代码设计的目的。
根据自身对面向对象方法与系统设计的理解,参照《重构-改善既有代码的设计》书中关于不良设计(违反SOLID)、不良代码(代码坏味道bad smells)的判别标准,进行重构void Library::filemanage() { fstream f; string s; f.open("books.txt", ios::out); addBook(); for (int i = 0; i < books.size(); i++) { f << books[i]->getName()
这段代码存在以下不良设计和不良代码:
1. 单一职责原则(SRP)违反:`Library` 类的 `filemanage()` 函数既要负责打开文件、写入数据,又要添加书籍,职责不够单一。
2. 开闭原则(OCP)违反:如果需要增加新的书籍类型,需要修改 `filemanage()` 函数,导致代码不够灵活。
3. 依赖倒置原则(DIP)违反:`Library` 类直接依赖于具体的 `fstream` 类和 `Book` 类,限制了代码的可扩展性和可维护性。
4. 代码坏味道:函数名不够明确,不符合命名规范。变量名 `f` 和 `s` 也不够明确。
为了重构这段代码,可以采取以下步骤:
1. 根据 SRP 原则,将 `filemanage()` 函数拆分成两个函数,一个负责打开文件和写入数据,一个负责添加书籍。
2. 根据 OCP 原则,将添加书籍的功能进行抽象,定义一个 `Book` 接口,不同类型的书籍实现该接口,然后在 `Library` 类中使用该接口。
3. 根据 DIP 原则,将具体的 `fstream` 类和 `Book` 类依赖抽象出来,使用依赖注入的方式传入 `Library` 类中。
4. 重命名函数和变量,使其更加清晰明了。
重构后的代码如下:
```cpp
class Book {
public:
virtual ~Book() {}
virtual string getName() const = 0;
};
class Novel : public Book {
public:
string getName() const override {
return "Novel";
}
};
class Library {
public:
Library(fstream& file, vector<unique_ptr<Book>>& books) : file(file), books(books) {}
void writeToFile() {
file.open("books.txt", ios::out);
for (const auto& book : books) {
file << book->getName() << endl;
}
file.close();
}
void addBook(unique_ptr<Book> book) {
books.push_back(move(book));
}
private:
fstream& file;
vector<unique_ptr<Book>>& books;
};
```
重构后的代码更符合 SOLID 原则,可扩展性和可维护性更好,并且避免了不良代码坏味道。