什么是尖叫建筑?

什么是尖叫建筑?

尖叫架构是由著名软件开发人员和思想领袖 robert c. martin(通常被称为“bob 叔叔”)提出的概念。这个术语可能听起来非常规,但它代表了软件设计中的一个强大原则,专注于使系统架构反映应用程序的主要关注点和用例。简而言之,您的软件架构应该“尖叫”其意图和目的。

在这份综合指南中,我们将探讨 screaming architecture 的基础知识、它与传统软件架构的对比、它在领域驱动设计中的重要性,以及如何在项目中实现此架构。我们还将介绍 screaming architecture 可以提高代码可读性、可维护性和长期可扩展性的实际示例和场景。

为什么要“尖叫”建筑?

尖叫架构背后的想法是代码库的主要结构应该立即传达其业务目的。这与传统架构形成鲜明对比,传统架构可能强调技术框架、工具或其他次要问题。在尖叫架构中,领域关注优先于实现细节。

鲍勃·马丁叔叔用一个类比来说明这一点:想象一下走到一座建筑物前,看看它的建筑。无需标志,您通常就能辨别出这是图书馆、学校还是办公室。这同样适用于软件架构。当您查看应用程序的文件夹结构和设计时,您应该立即了解它的用途。如果你正在构建一个会计系统,架构应该大喊“会计”,而不是“django”、“spring boot”或“react”。

以框架为中心的架构的问题

在许多项目中,对技术框架的关注掩盖了业务或领域逻辑。您会发现如下文件结构:

controllers/services/repositories/models/

登录后复制

虽然这些目录很有用,但它们描述了技术角色,而不是反映软件解决的核心问题。例如,此结构告诉您系统使用 mvc(模型-视图-控制器),但没有深入了解系统是否处理财务数据、用户管理或内容创建。

框架陷阱

过度强调框架会导致代码库中的业务逻辑被技术样板所掩盖。围绕框架约定构建的系统与这些框架紧密耦合。如果你想改变框架或技术栈,重构就成为一项主要工作。 screaming architecture 提倡保持领域逻辑干净且独立,因此框架的选择成为实现细节,而不是代码库的核心结构。

领域驱动设计 (ddd) 中令人惊叹的架构

领域驱动设计(ddd)和尖叫架构经常齐头并进。 ddd 是一种强调技术和领域专家之间协作的软件开发方法,它侧重于以与实际操作紧密结合的方式对核心业务逻辑进行建模。

在 screaming architecture 中,领域模型和业务逻辑位于应用程序的中心,而其他所有内容(框架、数据库、ui 和服务)都变成了外围。关键思想是代码结构应该反映领域模型而不是技术实现细节。

以下是如何使用领域驱动原则以“尖叫”其意图的方式构建项目:

/src    /accounting        ledger.cs        transaction.cs        account.cs        taxservice.cs    /sales        order.cs        invoice.cs        customer.cs        discountpolicy.cs

登录后复制

在此示例中,文件夹名称直接反映了业务问题:会计和销售。每个特定于域的类,如 ledger、transaction 和 order,都放置在其相关的域上下文中。这种结构可以立即清楚系统的含义以及每个组件的适用位置。

代码示例 1:简单的以领域为中心的结构

考虑一个处理订单和库存的电子商务应用程序。使用 screaming architecture,文件夹结构应该反映业务逻辑而不是技术角色:

/src    /orders        order.cs        orderservice.cs        orderrepository.cs    /inventory        inventoryitem.cs        inventoryservice.cs        inventoryrepository.cs

登录后复制

这是订单上下文中的基本代码示例:

public class order{    public guid id { get; set; }    public datetime orderdate { get; set; }    public list items { get; set; }    public decimal totalamount { get; set; }    public order(list items)    {        id = guid.newguid();        orderdate = datetime.now;        items = items;        totalamount = calculatetotal(items);    }    private decimal calculatetotal(list items)    {        return items.sum(item => item.price * item.quantity);    }}public class orderitem{    public string productname { get; set; }    public decimal price { get; set; }    public int quantity { get; set; }}

登录后复制

在此代码中,域概念(订单)位于前端和中心,orderservice 和 orderrepository 等支持逻辑保存在单独的文件中。业务逻辑 (calculatetotal) 是 order 实体的一部分,而不是隐藏在服务或控制器中。

避免技术干扰

框架和库对于软件开发至关重要,但它们不应该决定您的业务逻辑的结构。 screaming architecture 主张将 http 控制器、持久层和数据库框架等技术细节推向外围。

这是一个对比传统架构和尖叫架构的例子:

传统建筑:

/src    /controllers        ordercontroller.cs    /services        orderservice.cs    /repositories        orderrepository.cs    /models        order.cs        orderitem.cs

登录后复制

虽然这在技术上是正确的,但它并没有告诉您该系统的用途。文件夹结构没有透露任何有关域的信息。这是一个电子商务系统吗?金融应用程序?如果不深入代码,就不可能知道。

尖叫建筑:

/src    /orders        ordercontroller.cs        orderservice.cs        orderrepository.cs        order.cs        orderitem.cs    /inventory        inventorycontroller.cs        inventoryservice.cs        inventoryrepository.cs        inventoryitem.cs

登录后复制

这个结构立即阐明了系统处理订单和库存。如果您将来添加更多域(例如客户、付款),它们将在架构中拥有专用位置。

清洁架构的作用

尖叫架构通常与鲍勃叔叔更广泛的清洁架构原则保持一致。清洁架构提倡关注点分离,重点关注确保业务规则独立于框架、ui 和数据库。尖叫架构更进一步,建议项目的结构应该揭示核心业务逻辑。

这是清洁架构的快速回顾:

实体:核心业务对象和逻辑。

用例:特定于应用程序的业务规则。

接口:框架和外部系统的网关。

框架和驱动程序:ui、数据库和其他外部组件。

在清洁架构项目中,订单、客户和发票等领域概念是中心层的一部分。 asp.net core、django 或 rails 等框架被归入外层,充当提供核心功能的机制。

代码示例 2:在 screaming architecture 中应用清洁架构

在尖叫架构中,您将以反映业务领域的方式构建用例和实体。让我们扩展我们的电子商务示例:

/src    /orders        createorderusecase.cs        orderrepository.cs        order.cs        orderitem.cs    /inventory        addinventoryitemusecase.cs        inventoryrepository.cs        inventoryitem.cs

登录后复制

这是创建订单的示例用例:

public class CreateOrderUseCase{    private readonly IOrderRepository _orderRepository;    private readonly IInventoryService _inventoryService;    public CreateOrderUseCase(IOrderRepository orderRepository, IInventoryService inventoryService)    {        _orderRepository = orderRepository;        _inventoryService = inventoryService;    }    public Order Execute(List items)    {        // Ensure all items are available in inventory        foreach (var item in items)        {            _inventoryService.CheckInventory(item.ProductName, item.Quantity);        }        var order = new Order(items);        _orderRepository.Save(order);        return order;    }}

登录后复制

在此示例中,createorderusecase 是域逻辑的一部分,它与 orderrepository 和 inventoryservice 交互,以满足创建订单的业务需求。

尖叫建筑的好处

提高可读性:任何打开代码库的人都会立即了解系统的功能。

关注点分离:业务逻辑与技术细节保持隔离,使得以后更容易更改框架或技术。

可扩展性:随着系统的增长,域结构保持一致,允许轻松添加新功能和模块。

可维护性:当领域逻辑与外部依赖项和框架完全分离时,它更容易维护。

与框架无关:screaming architecture 允许业务逻辑在不同的技术堆栈之间保持可移植性,避免与任何特定框架的紧密耦合。

对尖叫建筑的批评

虽然尖叫建筑有很多好处,但它也并非没有批评:

感知的复杂性:不熟悉领域驱动设计的开发人员可能会发现,对于小型应用程序来说,将领域逻辑与技术细节分离是不必要的或过于复杂。
2

。开销:在小型项目或简单的 crud 应用程序中,实现 screaming architecture 可能看起来有点矫枉过正。

学习曲线:对于习惯框架优先方法的团队来说,采用 screaming 架构需要转变思维,这可能需要时间来内化。

何时使用尖叫架构

尖叫架构在以下场景中特别有用:

领域驱动系统:具有复杂业务规则和领域逻辑的应用程序。

长期项目:系统预计会随着时间的推移而发展,其中可扩展性和可维护性至关重要。

跨平台开发:可以切换框架或平台的系统,因此业务逻辑的清晰分离至关重要。

结论

尖叫建筑不仅仅是一个朗朗上口的名字;这是一种主张使核心业务逻辑成为代码库中最突出的部分的哲学。通过关注领域概念而不是技术框架,开发人员可以构建从长远来看更具可读性、可维护性和可扩展性的系统。无论您是在开发简单的 web 应用程序还是复杂的企业系统,采用 screaming architecture 都可以生成更清晰、更集中的代码,清楚地表达其目的。

要了解有关尖叫建筑的更多信息,您可以查看一些参考资料和附加读物:

罗伯特·c.马丁的干净建筑

eric evans 的领域驱动设计

鲍勃叔叔关于干净代码的博客

通过采用尖叫架构的原则,您可以创建不仅可以工作而且可以“尖叫”其意图的代码库。

以上就是什么是尖叫建筑?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2598064.html

(0)
上一篇 2025年3月6日 18:25:31
下一篇 2025年2月18日 04:04:38

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • FLASK利用 Flask 的灵活性和简单性:EazeAlliance 的观点

    在 Web 开发领域,选择正确的框架可以显着影响项目效率、可扩展性和定制能力。在 EazeAlliance,我们采用 Flask——一个轻量级、多功能的 Python Web 框架——作为我们开发战略的基石。 Flask 的简约设计和广泛的…

    2025年3月6日
    200
  • C语言与C++对比分析:你了解吗?

    c++++ 相较于 c 语言的优势在于:语法更灵活,支持面向对象编程,提供自动内存管理,拥有函数重载和模板等高级功能,提升代码可读性和可维护性。 C 语言与 C++ 对比分析:深入了解 前言C 语言和 C++ 都是广泛使用的编程语言,但在功…

    2025年3月6日
    200
  • C++ 函数的运算符重载有什么好处?

    c++++ 的运算符重载提供诸多优势,包括:1. 增强代码可读性,使用熟悉的运算符语法操作自定义类型;2. 简化代码,消除冗余函数调用;3. 改善可维护性,将运算符相关代码集中于一处,方便修改。 C++ 函数的运算符重载的好处 运算符重载是…

    2025年3月6日
    200
  • C++ 函数重载和函数模板的区别与应用

    函数重载和函数模板的主要区别在于参数类型:重载函数具有不同的参数类型,而函数模板具有参数化的类型。重载提高了代码的可读性和维护性,而模板提供了类型安全和代码复用。函数重载用于根据不同类型参数提供不同功能,而函数模板用于在不同类型上实现通用的…

    2025年3月6日
    200
  • C++ 函数与宏的区别和优缺点对比

    函数是运行时执行的代码块,可返回结果;宏是预处理时展开的常量或代码片段,不可返回结果。函数易读、可重用、代码可读性高,但效率低;宏编译开销小、性能优,但代码可读性差、难以调试。 C++ 函数与宏的区别和优缺点对比 函数与宏概述 函数:代码块…

    2025年3月6日
    200
  • C++ 函数的优势与传统编程方式有何比较?

    c++++ 函数相较于传统编程方式具有优势,包括:模块化和重用性:将代码分解为可重用的单元,便于理解和维护。信息隐藏:隐藏内部实现细节,只公开公开接口,提高代码可读性和可维护性。封装:数据和操作封装在一起,提高组织性和可读性。可测试性:可独…

    2025年3月6日
    200
  • C++ 函数的优缺点分析

    优点:模块化代码,提高可读性代码复用,避免重复封装数据和实现细节提供命名空间,避免冲突传递参数,方便信息传递缺点:性能开销,调用涉及堆栈帧创建和销毁过度嵌套影响可读性调试难度增加,错误可能发生在调用位置维护困难,函数可能在多处调用 C++ …

    2025年3月6日
    200
  • C++ 中函数内联的用途是什么?

    函数内联是一种优化技术,将函数体直接嵌入调用点,消除函数调用开销,提升程序执行效率。它适用于小函数,可减小代码大小和提高代码可读性。 C++ 中函数内联的用途 函数内联是一种将函数体直接嵌入到调用点,而不是像通常那样使用函数调用机制的优化技…

    2025年3月6日
    200
  • C++ 函数的默认参数和命名参数

    在 c++++ 中,函数参数可设置默认值,简化函数调用和提高代码可读性。此外,c++11 引入了命名参数,允许在函数调用时使用参数名称指定参数值,从而增强代码可读性和灵活性:默认参数:使用等号 (=) 指定参数默认值。命名参数:使用冒号 (…

    2025年3月6日
    200
  • C++ 函数重载的优势和劣势有哪些?

    函数重载的优势包括增强代码可读性、可重用性和安全性,而劣势则包括名称冲突、编译器混淆和代码复杂性的增加。例如,可以创建两个具有相同名称但参数数量不同的 sum 函数,分别计算两个和三个数字的总和,从而提供更简洁、更可重用的代码。 C++ 函…

    2025年3月6日
    200

发表回复

登录后才能评论