第三十章:课程总结与未来展望
好,终于到了最后一章。说实话,写到这里我有点感慨。三十章的内容,从最基础的设计模式原则,到现代C++的架构实践,我们走了很长一段路。这一章我不打算讲太多新东西,而是想跟你聊聊——学完这些之后,该怎么用?未来又该往哪个方向走?
设计模式的选择策略:别为了用模式而用模式
我在项目中见过太多人,一上来就想着「我要用个工厂模式」、「这里应该搞个观察者」。嗯,这种想法其实挺危险的。设计模式不是勋章,不是用得越多越厉害。
我个人习惯的判断标准很简单:有没有让代码变得更简单?如果引入一个模式反而让逻辑更绕、调用链更长,那八成是选错了。
选择模式的三个核心问题:
- 变化点在哪里?——模式是为了封装变化。如果没变化,别硬套。
- 复杂度是否可接受?——团队里其他人能看懂吗?维护成本高不高?
- 有没有更简单的替代方案?——有时候一个回调函数就能解决的事,非要搞个策略模式,没必要。
举个例子。我曾经接手过一个项目,里面用抽象工厂模式创建了三种不同类型的日志器。代码写得挺漂亮,但实际业务里,日志类型在编译期就确定了,根本不需要运行时切换。说白了,一个简单的枚举加if-else就能搞定。那哥们花了三天写的工厂,最后被我二十行代码替换掉了。
我的建议:先写最直观的代码。等发现它确实在变化、确实在膨胀时,再考虑用模式重构。这叫「恰当时机的设计」,不是「预先设计」。
反模式识别:那些看起来很美实则很坑的做法
反模式是什么?就是那些表面上解决了问题,实际上埋下了更大隐患的做法。我踩过的坑不少,挑几个典型的说说。
1. 万能类(God Class)
一个类里塞了几千行代码,什么都能干。你想想看,这种类改起来多痛苦?我见过一个网络库的Session类,里面既有连接管理、又有协议解析、还有心跳检测、甚至日志记录。后来要加个新协议,改了一个地方崩了三处。
避坑指南:我曾经也写过这种类,后来学乖了——单一职责原则不是摆设。一个类只做一件事,做精做透。
2. 过度抽象(Abstraction Overload)
为了「可扩展性」,搞了五六层继承关系。结果呢?真正用到的只有两层,剩下的全是空壳。我记得有个项目,一个简单的消息处理功能,硬是抽象出了IHandler、BaseHandler、AbstractHandler、ConcreteHandler……最后新同事入职看了三天没看懂。
避坑指南:抽象是好的,但别为了抽象而抽象。等你真的需要那层抽象时再加,完全来得及。
3. 复制粘贴式复用(Copy-Paste Reuse)
这个不用我多说了吧?Ctrl+C、Ctrl+V一时爽,维护火葬场。我曾经在一个代码库里发现同一段排序逻辑出现了七次,每次略有不同。后来统一成一个函数,bug直接少了十几个。
警告:反模式往往不是一开始就出现的。它们是随着项目演进、赶工期、人员变动慢慢长出来的。定期做代码评审,能有效遏制反模式蔓延。
C++20/23 新趋势:我们正在进入一个新时代
C++20 和 C++23 带来的变化,说实话,比我预想的要大。很多以前需要设计模式才能解决的问题,现在语言本身就能搞定了。
| 特性 | 解决的问题 | 替代了哪些模式 |
|---|---|---|
| Concept(概念) | 编译期接口约束 | 部分替代了策略模式、模板元编程中的SFINAE |
| Coroutine(协程) | 异步流程控制 | 简化了状态模式、观察者模式的实现 |
| Ranges(范围) | 惰性求值、管道操作 | 替代了部分迭代器模式、策略模式 |
| std::optional / std::variant | 可空类型、多态容器 | 减少了工厂模式、访问者模式的使用场景 |
我个人最看好的是 Concept。以前写模板,编译错误能让你怀疑人生。现在有了 Concept,编译器能给出「你传入的类型不满足可迭代要求」这种清晰提示。说白了,它让模板编程变得更像「面向接口编程」,但又没有虚函数的运行时开销。
C++23 里还有 std::expected,这东西我期待很久了。它比异常更轻量,比错误码更安全。以后处理错误,可能真的不用再写那些繁琐的 if-else 了。
一个小建议:别急着把所有旧代码都改成新特性。先在新模块里试用,感受一下。C++ 的演进是渐进式的,不是革命式的。
知识体系总览
下面这张图,是我对整个课程知识体系的一个梳理。你可以把它当作一张「地图」,以后遇到问题,知道该往哪个方向查。
推荐书籍与资源
最后,分享几本我觉得真正值得读的书。不是那种「买来吃灰」的,而是我反复翻过、在项目里用过的。
| 书名 | 作者 | 适合阶段 | 我的评价 |
|---|---|---|---|
| 《设计模式:可复用面向对象软件的基础》 | GoF | 入门 | 经典中的经典,但别照着抄,要理解背后的思想 |
| 《C++ Templates: The Complete Guide》 | Vandevoorde | 进阶 | 模板编程的圣经,C++20 Concept 出来后依然有用 |
| 《Effective Modern C++》 | Scott Meyers | 中级 | 42条准则,条条都是实战经验。我每半年翻一次 |
| 《重构:改善既有代码的设计》 | Martin Fowler | 所有阶段 | 不光是C++,任何语言都适用。教你如何让代码越来越好 |
| 《A Philosophy of Software Design》 | John Ousterhout | 高级 | 讲的是「如何降低复杂度」,比设计模式更底层 |
额外资源:
- CppCon 演讲视频(YouTube上免费)——每年都有大量高质量内容
- cppreference.com —— 查语法、查标准库,比任何书都全
- GitHub 上搜索「awesome-cpp」—— 收集了各种现代C++项目,值得一看
写在最后
三十章,说长不长,说短不短。如果你能坚持看到这里,说明你是个愿意深入钻研的人。我个人觉得,设计模式也好,架构原则也好,最终目的只有一个:让代码更容易理解、更容易修改、更容易维护。
别被那些花哨的名词吓到。你想想看,很多模式其实就是我们日常编程中「自然而然」的做法,只不过有人把它们总结出来了。学模式,不是为了套用,而是为了在遇到问题时,脑子里能多几个备选方案。
嗯,课程到这里就结束了。但你的实践才刚刚开始。去写代码吧,去踩坑吧,去重构吧。只有亲手写过、改过、痛过,那些模式才能真正变成你自己的东西。
祝你好运。