正交性原则(Orthogonality Principle)是一份关于模块、API 与系统架构设计的技能指南,主题是构建组件相互独立、互不重叠、修改一处不会意外波及他处的系统。
【用途】 资料指出,正交(源自数学)指两条线成直角,改变一条不影响另一条;在软件中,当修改一个组件不需要修改其他组件时,这些组件就是正交的,即独立且不重叠。该技能用于在设计模块、API 和系统架构时,帮助实现这种独立、非重叠的组件结构。
【主要能力与内容】 资料列出正交带来的好处:变更局部化(减少调试)、易于隔离测试、组件可复用、耦合更少因而复杂度更低、更易理解与维护。
资料给出非正交的警示信号(red flags):变更放大(改一处需改多处)、霰弹式修改(一个功能散落在多个文件)、紧耦合(组件彼此知道太多)、重复逻辑(同一概念有多种实现)、级联变更(A 的改动意外破坏 B、C、D)。
【实现方式】 资料提供五条实现路径,并配有 Elixir 与 TypeScript 代码示例:
- 关注点分离:将不相关的职责分开,示例对比了把校验、数据库、外部 API、通知、日志、响应混在一个控制器中,与拆分为 UserService、BillingService、NotificationService 的做法。
- 接口隔离:创建聚焦、最小的接口,示例将庞大的 DataStore 回调拆分为 KeyValueStore、Searchable、BulkOperations、Exportable。
- 依赖注入:不硬编码依赖,示例通过传入 deps 映射以便测试时替换为 Mock。
- 事件驱动架构:通过事件而非直接调用解耦,示例中 UserService 只发布 {:user_created, user} 事件,由各订阅者处理计费、分析等。
- 数据正交:不重复数据,保持单一事实来源,示例中 total_amount 由 hourly_rate 与 total_hours 按需计算,而非存储;状态标志由 status 派生而非重复存储。
【使用方式与准则】 资料给出设计准则:设计模块时每个模块有单一清晰目的、不共享内部数据结构、改一个模块很少需要改其他模块、可独立测试;设计 API 时每个端点/函数只做一件事、参数相互独立、返回值最小、调用之间无隐藏耦合;设计数据时每份数据只有一个事实来源、计算值应计算而非存储、无重复信息、模式变更局部化;设计系统时组件通过明确定义的接口通信、用事件实现松耦合、依赖注入而非硬编码、可替换组件而不影响其他组件。
【测试与示例】 资料说明测试正交性的方法:好的测试应能在不搭建无关组件的情况下测试单个组件,并对比了纯逻辑测试与需要创建 requester、worker、gig、engagement、shift 的测试。资料还列举了正交模式示例:CQRS(命令/查询正交)、Atomic Design(原子/分子/组织正交)、GraphQL Schema(类型正交)、微服务(限界上下文正交),以及应避免的非正交反模式:共享可变状态(全局变量)、深层继承、循环依赖、上帝对象、特性依恋。
【与其他技能的关系】 资料指出该技能可与 solid-principles(单一职责→正交)、structural-design-principles(封装→正交)、simplicity-principles(KISS→更少依赖→更正交)、cqrs-pattern、atomic-design-pattern 配合使用。
【限制】 资料未提供该技能的安装命令、收费方式、平台支持或具体使用步骤,这些信息暂未提供。