0

0

C++类设计如何遵循SOLID原则 面向对象设计最佳实践

P粉602998670

P粉602998670

发布时间:2025-07-09 08:14:01

|

824人浏览过

|

来源于php中文网

原创

c++++类设计中,遵循solid原则能提升代码质量。1. 单一职责原则要求一个类只做一件事,通过拆分职责实现低耦合、易维护;2. 开闭原则强调对扩展开放、对修改关闭,通过接口抽象和多态支持新增功能而不改动已有逻辑;3. 里氏替换原则确保子类可替换父类而不破坏程序行为,避免违反契约的设计;4. 接口隔离原则提倡细粒度接口,避免不必要的依赖,提高模块独立性;5. 依赖倒置原则主张依赖抽象而非具体实现,通过接口编程实现解耦和灵活扩展。这些原则共同促进高内聚、低耦合的系统结构。

C++类设计如何遵循SOLID原则 面向对象设计最佳实践

在C++类设计中,遵循SOLID原则能显著提升代码的可维护性、扩展性和复用性。这些原则虽然抽象,但只要理解其核心思想,并结合实际场景合理应用,就能写出结构清晰、职责明确的类。

C++类设计如何遵循SOLID原则 面向对象设计最佳实践

1. 单一职责原则(SRP):一个类只做一件事

一个类应该只有一个引起它变化的原因。换句话说,类的职责要单一,避免“全能类”。

C++类设计如何遵循SOLID原则 面向对象设计最佳实践
  • 常见问题:很多初学者喜欢把所有相关操作都塞进一个类里,比如读写文件、解析数据、业务逻辑全都在一起。
  • 建议做法:将不同职责拆分成多个类。例如,一个User类负责数据存储,一个UserService类负责业务逻辑,一个UserRepository类负责持久化操作。
  • 好处:更容易测试、修改和理解;降低耦合度。

举个例子:

立即学习C++免费学习笔记(深入)”;

// 不推荐的做法
class User {
public:
    void loadFromFile(const std::string& filename);
    void validate();
    void process();
};

// 推荐做法
class UserRepository {
public:
    User loadFromFile(const std::string& filename);
};

class UserService {
public:
    bool validate(const User& user);
    void process(User& user);
};

2. 开闭原则(OCP):对扩展开放,对修改关闭

设计类时应允许通过继承或组合来扩展功能,而不是直接修改已有代码。

C++类设计如何遵循SOLID原则 面向对象设计最佳实践
  • 关键点:使用接口抽象和多态机制,让新增行为不影响原有逻辑。
  • 实现方式
    • 定义接口类(抽象类)
    • 使用虚函数或策略模式
  • 注意:不要过度设计。只有当确实需要扩展的时候再考虑开闭原则。

比如,如果你有一个图形渲染器,可以这样设计:

class Shape {
public:
    virtual double area() const = 0;
};

class Circle : public Shape { /* ... */ };
class Rectangle : public Shape { /* ... */ };

class Renderer {
public:
    void draw(const Shape& shape) {
        std::cout << "Area: " << shape.area() << std::endl;
    }
};

这样添加新图形时,不需要改Renderer类。


3. 里氏替换原则(LSP):子类应能替换父类而不破坏逻辑

任何基类出现的地方,子类都应该可以替换,而不会导致程序出错。

EduPro
EduPro

EduPro - 留学行业的AI工具箱

下载
  • 常见误区:子类重写父类方法时,改变了原意或抛异常。
  • 正确做法
    • 子类不应削弱父类的行为契约
    • 如果发现必须覆盖某些方法才能“正常工作”,说明继承关系可能设计错了

举个例子:如果有一个Bird类有fly()方法,那Penguin继承它并抛异常说不能飞,这就违反了LSP。更好的做法是拆分接口:

class Bird {
public:
    virtual void eat() = 0;
};

class Flyable {
public:
    virtual void fly() = 0;
};

class Sparrow : public Bird, public Flyable {
    // 实现 fly 和 eat
};

class Penguin : public Bird {
    // 只实现 eat
};

4. 接口隔离原则(ISP):定义细粒度的接口,避免大而全的接口

客户端不应该依赖它不需要的方法。也就是说,接口要小而专。

  • 反例:一个接口包含十几个方法,每个实现类都要强制实现全部。
  • 建议:按功能划分接口,如把print()scan()fax()分开为不同的接口。
  • 好处:减少冗余代码,提高模块间的独立性。

例如打印机的设计:

class Printer {
public:
    virtual void print(Document& d) = 0;
};

class Scanner {
public:
    virtual void scan(Document& d) = 0;
};

class FaxMachine {
public:
    virtual void fax(Document& d) = 0;
};

// 多功能设备可以继承多个接口
class MultiFunctionPrinter : public Printer, public Scanner, public FaxMachine {
    // 实现所有功能
};

5. 依赖倒置原则(DIP):依赖抽象,不依赖具体实现

高层模块不应该依赖低层模块,两者都应该依赖抽象。

  • 通俗理解:不要直接调用具体类,而是面向接口编程。
  • 实现技巧
    • 使用抽象类或接口作为参数类型
    • 通过构造函数注入依赖
  • 目的:解耦、提高可测试性和灵活性

示例:

class Database {
public:
    virtual void save(const std::string& data) = 0;
};

class MockDatabase : public Database {
    void save(const std::string& data) override {
        // 测试用实现
    }
};

class Logger {
    Database& db_;
public:
    Logger(Database& db) : db_(db) {}
    void log(const std::string& msg) {
        db_.save(msg);
    }
};

这样,Logger不关心具体用了哪种数据库,方便替换和测试。


总的来说,C++类设计中遵循SOLID原则并不是教条式的硬套,而是根据项目实际情况灵活运用。关键是理解每条原则背后的意图:高内聚、低耦合、易扩展、好维护。

基本上就这些。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.09.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

46

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

990

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

50

2025.10.17

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.8万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号