开发组织常常面临的一个标准问题是,代码实现往往需要与原始设计和架构更加一致。这个问题很常见,尤其是在大型项目中。
软件架构对于代码库的可理解性、可变性和遵循软件质量目标至关重要。就代码库而言,有三个重要的软件架构目标:可维护性、可替代性、可扩展性。
要使软件系统保持良好的状态,就必须确保它是模块化的,相互依赖关系尽可能小且正确,从而实现高内聚和低耦合。这些目标可以通过引入特定的模式和代码约定来实现,并且整个团队成员都愿意去遵守。
我们可以使用适应度函数来实现我们的架构目标。Neal Ford、Rebecca Parsons和Patrick Kua在《演进式架构》一书中提出了这种方法。通过适应度函数,我们可以编写测试来衡量系统与架构目标(如安全性、弹性或稳定性等属性)之间的一致性,类似于测试驱动开发的方式。这些函数应该在测试框架中编写,并接入适当的CI/CD流程。
在《演进式架构》中,架构适应度函数定义为:
对某些架构特征或架构特征组合,进行客观完整性评估的任何机制。
一个这样的函数的例子可以在Web应用程序的上下文中找到,其中我们的一个架构目标是我们的应用程序应该在200毫秒内响应用户请求(延迟和性能)。在这里,我们测量API端点的响应时间。如果我们想要自动化它,我们可以将这个函数放入您的CI/CD流程中,以便在每次推送新代码时自动运行。
此类功能的一个示例如下:在 Web 应用程序中,我们的架构目标之一是程序应在 200 毫秒内响应用户请求(考虑延迟和性能)。在这里,我们测量的是API 端点的响应时间。如果我们想自动化它,我们可以将此函数放入 CI/CD 流程中,以便在每次推送新代码时自动运行。
C# 的架构适应度函数示例
此外,一些工具还可以测试代码实现是否与定义的架构一致。ArchUnit是一个小型、简单、可扩展的开源Java测试库,用于验证预定义的应用程序架构特性和架构约束。同时,NetArchTest是一个针对.NET 标准的流畅API,可以在单元测试中强制执行架构规则。
下面是 NetArchTest 中的一个示例,说明我们如何执行分层架构和一些特定规则。您可以分别测试这些规则并断言结果(使用 Assert.True
)。
使用 NetArchTest 强制执行架构规则