C++架构设计原则
博主介绍:程序喵大人
- 35 - 资深C/C++/Rust/Android/iOS客户端开发
- 10年大厂工作经验
- 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
- 《C++20高级编程》《C++23高级编程》等多本书籍著译者
- 更多原创精品文章,首发gzh,见文末
- 👇👇记得订阅专栏,以防走丢👇👇
😉C++基础系列专栏
😃C语言基础系列专栏
🤣C++大佬养成攻略专栏
🤓C++训练营
👉🏻个人网站
在编程和系统架构设计中,遵循一系列成熟的设计原则是比较重要的。本文主要整理了一些通用的原则以及C++中特有的原则和常用的设计模式,以指导设计出优秀的架构。
一、通用设计原则
1. 模块化设计
模块化设计原则强调将系统分解成独立、可交换的模块,每个模块负责系统中的一个特定功能。在C++中,更多地需要使用类和函数来封装数据和行为,以及利用命名空间来组织相关的类和函数。这可以使代码更易于理解和维护,同时也便于团队协作开发。
2. 高内聚低耦合
高内聚指的是模块内部元素之间紧密相关的程度,而低耦合则是指模块之间依赖关系的松散程度。在C++中,可以精心设计接口和使用抽象类或接口类(如纯虚函数类)来实现低耦合。同时,确保类和函数专注于单一职责,进而可以增强内聚性。
3. 抽象化
抽象化是指隐藏具体实现的细节,只暴露必要的操作和接口。在C++中,可以通过使用抽象基类和虚函数来实现抽象化。在不改变接口的情况下,更换具体的实现,也可以研究一下Pimpl模式,简言之就是对外暴露接口,而非细节。
4. 重用原则
重用现有的组件和库可以显著减少开发时间和成本。C++提供了丰富的标准库和第三方库,可以通过继承和组合现有的类,在不重复造轮子的情况下,快速构建复杂且稳定的系统。
5. 分层设计
将系统划分为多个层次(模块),每个层次负责不同的功能。分层有助于隔离系统的不同部分,使得修改和维护更加容易,同时也促进了低耦合和高内聚。
二、面向对象设计原则
1. 开闭原则
面向对象设计的核心原则之一,对扩展开放,对修改关闭。主要指的是在不修改现有代码的情况下,可以通过添加新代码来扩展软件的功能。在C++中,可以通过使用基类定义一个稳定的接口,然后通过派生类来扩展功能。例如,设计一个图形渲染系统时,可以定义一个抽象的Shape
基类,然后通过继承Shape
来创建Circle
、Rectangle
等具体图形类。当需要添加新的图形类型时,只需添加新的派生类,无需修改现有的代码。
2. 依赖倒置原则
强调高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。这个原则有助于减少类之间的直接依赖,提高系统的灵活性。比如在设计一个文件处理系统时,可以定义一个抽象的FileReader
接口,然后提供TextFileReader
和BinaryFileReader
等具体实现。系统的其他部分只依赖于FileReader
接口,而不是具体的实现类,这样就可以轻松地添加新的文件读取器,而不影响现有代码。
3. 接口隔离原则
不应该强迫用户依赖于它们不使用的接口。应该将大的接口拆分成更小且更具体的接口,让用户只需要关心它们真正使用的方法。比如有一个多功能打印机接口IMultiFunctionDevice
,包含打印、扫描和复印等方法。根据接口隔离原则,应该将其拆分为IPrinter
、IScanner
和ICopier
等更小的接口。这样,如果某个设备只支持打印功能,就只需要实现IPrinter
接口。
4. 组合优于继承
虽然继承是面向对象编程中的一个基本概念,但过度使用继承会导致代码的复杂性增加和灵活性降低。相比之下,组合提供了更大的灵活性,通过将对象组合在一起来构建复杂的功能。比如在设计游戏角色时,可以通过组合来实现不同的行为,而不是通过继承。例如,可以有WalkingBehavior
、AttackingBehavior
等类,然后通过将这些行为组合到Character
类中,来定义不同类型的角色。
三、常用设计模式
1. 状态模式
允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。可以理解为是状态机管理。在C++中,可以使用状态模式来管理游戏角色的状态,比如休息、行走、攻击等。每个状态都是一个派生自基状态类的类,实现了特定于状态的行为。角色类持有一个指向基状态类的指针,根据不同的游戏事件切换指针指向的状态对象。
2. 策略模式
策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的用户。在C++中,可以使用策略模式来实现不同的排序算法(如快速排序、归并排序等)。定义一个排序策略接口,然后为每种排序算法提供一个实现。一个排序客户端类可以根据需要动态选择使用哪种排序策略。
3. 工厂模式
工厂模式用于创建对象,而不将具体类的实例化逻辑暴露给客户。工厂可以是一个方法(简单工厂模式)、一个独立的类(工厂方法模式)或者一组方法(抽象工厂模式)。可以使用工厂模式来创建不同类型的图形对象,如圆形、矩形等。定义一个图形接口和多个实现该接口的具体图形类。然后创建一个工厂类,根据输入参数决定创建并返回哪种图形对象。
4. 观察者模式
观察者模式定义对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。可以使用观察者模式来实现事件监听和通知机制。例如,一个天气应用可以有一个天气数据对象和多个显示当前天气的视图对象(如当前温度视图、天气预报视图等)。当天气数据对象的状态改变时,所有的视图对象都会收到通知并更新显示内容。
5. 单例模式
单例模式确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在C++中,可以使用单例模式来实现日志记录器、配置管理器或数据库连接池等组件。通过确保这些组件在应用程序中只有一个实例,可以避免资源的浪费和潜在的冲突。
码字不易,欢迎大家点赞,关注,评论,谢谢!
👉 C++训练营
一个专为校招、社招3年工作经验的同学打造的 1v1 项目实战训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!