《架构整洁之道》读书笔记
SOLID原则
架构是系统设计的一部分,它突出了某些细节,并通过抽象省略掉另一些细节。
架构关注的是组件之间的关系和系统组件外部可见的属性,设计还要关注这些组件的内部结构。
设计软件架构的目的是为了在工作中更好地对这些组件进行研发、部署、运行以及维护。
软件架构设计的主要目标是支撑软件系统的全生命周期,设计良好的架构可以让系统便于理解、易于修改、方便维护,并且能轻松部署。软件架构的终极目标就是最大化程序员的生产力,同时最小化系统的总运营成本。
对于一个只有五个开发人员的小团队来说,他们完全可以非常高效地共同开发一个没有明确定义组件和接口的单体系统(monolithic system)。
设计良好的系统架构应该可以使开发人员对系统的运行过程一目了然。
所有的软件系统都可以降解为策略与细节这两种主要元素。策略体现的是软件中所有的业务规则与操作过程。
软件架构师的目标是创建一种系统形态,该形态会以策略为最基本的元素,并让细节与策略脱离关系,以允许在具体决策过程中推迟或延迟与细节相关的内容。
软件架构设计本身就是一门划分边界的艺术。边界的作用是将软件分割成各种元素,以便约束边界两侧之间的依赖关系。
本质上,所有的软件系统都是一组策略语句的集合。
软件架构设计的工作重点之一就是,将这些策略彼此分离,然后将它们按照变更的方式软件架构设计的工作重点之一就是,将这些策略彼此分离,然后将它们按照变更的方式进行重新分组。其中变更原因、时间和层次相同的策略应该被分到同一个组件中。反之,变更原因、时间和层次不同的策略则应该分属于不同的组件。
我们对“层次”是严格按照“输入与输出之间的距离”来定义的。一条策略距离系统的输入/输出越远,它所属的层次就越高。而直接管理输入/输出的策略在系统中的层次是最低的。
我们希望源码中的依赖关系与其数据流向脱钩,而与组件所在的层次挂钩。
离输入/输出最远的策略——高层策略——一般变更没有那么频繁。即使发生变更,其原因也比低层策略所在的组件更重大。反之,低层策略则很有可能会频繁地进行一些小变更。
如果我们要将自己的应用程序划分为业务逻辑和插件两部分,就必须更仔细地了解业务逻辑究竟是什么,它到底有几种类型。
业务逻辑就是程序中那些真正用于赚钱或省钱的业务逻辑与过程。更严格地讲,无论这些业务逻辑是在计算机上实现的,还是人工执行的,它们在省钱/赚钱上的作用都是一样的。
“关键业务逻辑”通常会需要处理一些数据,我们将这些数据称为“关键业务数据”,关键业务逻辑和关键业务数据是紧密相关的,所以它们很适合被放在同一个对象中处理。我们将这种对象称为“业务实体(Entity)”。
架构设计不是(或者说不应该是)与框架相关的,框架只是一个可用的工具和手段。
软件的系统架构应该为该系统的用例提供支持。
DDD领域驱动设计作为一个针对大型复杂业务系统的领域建模方法体系,它通过面向领域的思维方式,将要解决的业务概念和业务规则等内容提炼为领域知识,然后借由不同的建模范式将这些领域知识抽象为能够反映真实世界的领域模型。
领域驱动设计包括战略设计和战术设计两个阶段。
领域驱动设计关注的是如何在明确的限界上下文中创建通用语言的模型。
限界上下文是语义和语境上的边界,边界内每个代表软件模型的组件都有着特定的含义并处理特定的事务。
限界上下文是问题空间Problem Space的一部分。随着软件模型开始呈现出更深层次以及更清晰的含义是,限界上下文将会被迅速转换到解决方案空间Solution Space中。
子域Sub Domain是整个业务领域的一部分,代表的是一个单一的、有逻辑的领域模型。
子域主要有三种类型:
Core DomainSupporting SubdomainGeneric Subdomain