2026/2/18 9:19:04
网站建设
项目流程
昆明专业网站建设的公司,怎么制作游戏辅助,网站建设设计要点,个人的网站建设目标从 ABP 到 CleanDDD#xff1a;关于软件长期演进的一些思考
最近在项目中接触到了 CleanDDD#xff0c;也重新审视了我们长期使用的 ABP 技术栈。
这并不是一篇“反 ABP”的文章#xff0c;而是一次站在时间维度上的技术反思。
如果你也在维护一个已经运行多年、并且还会继续…从 ABP 到 CleanDDD关于软件长期演进的一些思考最近在项目中接触到了CleanDDD也重新审视了我们长期使用的ABP 技术栈。这并不是一篇“反 ABP”的文章而是一次站在时间维度上的技术反思。如果你也在维护一个已经运行多年、并且还会继续演进的系统或许会对下面的内容产生共鸣。一、站在时间轴上看软件开发的变化如果把时间拨回十年前软件开发面临的核心问题其实很简单有没有系统能不能尽快上线能不能稳定跑起来在那个阶段交付本身就是最大的价值。但今天情况已经完全不同了。系统不再稀缺真正昂贵的反而变成了系统维护成本需求频繁变更的风险人员流动带来的不确定性业务规则不断叠加后的复杂度软件开发的核心矛盾已经从“能不能做出来”转变为“还能不能持续演进”二、CleanDDD 在解决什么问题很多人第一次看到 CleanDDD会觉得它结构清晰分层明确代码“看起来很干净”但真正让我开始认真看待它的并不是这些表象。CleanDDD 真正试图回答的是一个非常现实的问题这个系统在 35 年之后还能不能被安全地修改在大量项目中系统难以维护往往不是因为业务本身有多复杂而是因为业务规则分散在各个角落没有人能说清楚「改这个需求到底该动哪一层」CleanDDD 做的一件事其实很“笨”但非常有效强制把业务规则收敛到领域层这不是为了形式上的 DDD而是为了对抗系统复杂度的自然增长三、真正的风险系统没人敢改在实际工作中我越来越觉得一个系统最大的风险并不是开发速度慢而是关键人员离开后系统没人敢动很多系统不是不能改而是不知道会影响哪里不确定会不会引发连锁问题最终选择「能不动就不动」CleanDDD 的一个重要价值在于它试图把业务知识从“人的经验”转移到“模型和代码结构”中这本质上是在降低组织层面的风险而不仅仅是技术问题。四、交付速度 vs 长期成功率快速交付本身没有问题真正的问题在于很多系统只对第一次交付负责在后期需求中我们经常看到这样的情况一个看似很小的改动引发多个模块的连锁修改最终演变成一次高风险操作CleanDDD 关注的并不是“这个功能能不能尽快上线”而是“第 20 次、第 30 次需求调整时系统还能不能稳住”这是一次性交付成功与长期演进成功之间的差别。五、一些非常实际的工程收益从工程角度看CleanDDD 带来的变化是非常具体的业务逻辑只存在于领域层每个聚合都有清晰的职责边界行为具备明确的输入与输出当需求变化时你大致知道该从哪个领域模型入手也能明确哪些地方不应该被修改而这恰恰是很多 ABP 项目在后期最容易失控的地方。六、为什么 CleanDDD 更适合长期演进的系统CleanDDD 从一开始的设计目标就不是“这个功能能不能快点上线”而是“五年之后这个系统还能不能继续加新规则”一个非常直观的对比如下场景常见 ABP 项目CleanDDD新增规则AppService 中不断加 if新的领域行为行为复用复制业务逻辑复用聚合能力业务重构高风险局部替换新人接手需要较长熟悉期更快理解业务七、CleanDDD 与 AI 编码的一点关系这是一个相对新的视角但我认为非常重要。AI 编码本质上依赖几件事清晰的上下文稳定的边界可预测的结构而这些恰好都是 CleanDDD 所强调的。领域模型、统一语言、明确的行为边界使得代码空间本身是低熵的、可组合的相比之下典型的 ABP 项目中ApplicationServiceRepositoryUnitOfWork各种框架约定往往混杂在一起。这种结构对人尚且吃力对 AI 来说更容易误判上下文。这不是未来的假设而是已经在发生的现实。八、关于框架老化的问题有一句话我越来越认同所有框架都会老但业务不会CleanDDD 的一个隐性优势在于框架升级主要影响基础设施层领域层可以长期保持稳定而在 ABP 中领域模型往往继承框架基类生命周期与框架深度绑定在 510 年周期的系统中这种差异会被不断放大。九、关于 ABP不是对错而是取舍需要强调的是这并不是一篇否定 ABP 的文章。ABP 的设计目标非常明确快速交付 CRUD 系统提供完善的权限、多租户、审计能力降低团队协作成本为了实现这些目标它必然做出一些取舍ApplicationService 权力较大Repository 支持灵活查询实体继承框架基类这些设计天然更接近事务脚本模型而不是严格的 DDD。十、为什么 ABP 天然不追求“纯 DDD”这更多是由历史背景决定的。ABP 诞生于 20132016 年当时.NET 企业开发以 N 层架构为主系统多为 ERP / OA / 管理后台企业最关心的是交付速度和通用能力DDD 在国内更多停留在理论层面并非主流实践。因此ABP 的定位从来都是企业级应用框架DDD 只是它兼容的一种思想而不是第一性原则。十一、一个更工程化的总结如果把话说得更直白一些ABP 解决的是如何规模化交付软件CleanDDD 解决的是如何长期演进业务系统这并不是谁对谁错而是面对的问题不同。十二、一个更现实的建议与其“反 ABP”不如“驯服 ABP”。在 ABP 技术栈下完全可以用 CleanDDD 构建领域层用 ABP 提供基础设施能力显式使用领域事件避免在 AppService 中堆积业务规则这可能不是最快的路但很可能是未来几年风险最低的路写在最后CleanDDD 本质上并不是一种“更高级的写法”而是一种为未来不确定性预留空间的工程选择在系统复杂度还可控的时候为未来 35 年留一条安全的演进路径本身就是一件非常值得投入的事情。项目地址https://github.com/netcorepal/netcorepal-cloud-framework