第三十章:课程总结与未来展望

好,终于到了最后一章。说实话,写到这里我有点感慨。三十章的内容,从最基础的设计模式原则,到现代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++ 的演进是渐进式的,不是革命式的。

知识体系总览

下面这张图,是我对整个课程知识体系的一个梳理。你可以把它当作一张「地图」,以后遇到问题,知道该往哪个方向查。

C++设计模式与架构 经典设计模式 创建型:工厂、单例、建造者 结构型:适配器、代理、装饰 行为型:策略、观察者、状态 架构设计原则 SOLID原则 依赖注入与解耦 接口隔离与组合优先 现代C++特性 C++20:Concept、Coroutine C++23:std::expected Ranges、智能指针 实践:反模式识别 + 代码评审 + 持续重构 三者相辅相成:设计模式提供解决方案,架构原则指导方向,现代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++项目,值得一看

写在最后

三十章,说长不长,说短不短。如果你能坚持看到这里,说明你是个愿意深入钻研的人。我个人觉得,设计模式也好,架构原则也好,最终目的只有一个:让代码更容易理解、更容易修改、更容易维护

别被那些花哨的名词吓到。你想想看,很多模式其实就是我们日常编程中「自然而然」的做法,只不过有人把它们总结出来了。学模式,不是为了套用,而是为了在遇到问题时,脑子里能多几个备选方案。

嗯,课程到这里就结束了。但你的实践才刚刚开始。去写代码吧,去踩坑吧,去重构吧。只有亲手写过、改过、痛过,那些模式才能真正变成你自己的东西。

祝你好运。


公众号:蓝海资料掘金营,微信 deep3321