番茄架构-Tomato Architecture

番茄架构是一种遵循Common Sense Manifesto的软件架构方法,强调不要过度设计,而是根据功能进行打包,保持代码简单。核心原则是关注点分离,包括应用核心独立于交付机制、业务逻辑与输入源分离、避免外部服务集成对核心影响过大,以及将领域逻辑置于领域对象中。提倡使用框架的强大功能,同时注重单元测试和集成测试的重要性。
摘要由CSDN通过智能技术生成

番茄架构是遵循Common Sense Manifesto的软件架构的一种方法

Common Sense Manifesto

  • 选择适合你的软件的架构而不是流行的的架构: 在盲目追随流行人物的建议之前,要考虑软件最佳实践。
  • 不要过度设计: 努力保持简单,而不是过度工程化,试图猜测未来十年的需求。
  • 进行研究与开发,选择一项技术并拥抱它,而不是为了可替代性而创建抽象层。
  • 确保你的解决方案作为整体工作正常,而不仅仅是单个组件。

架构图

tomato-architecture.png

实施指南(架构核心:关注点分离):

  1. 按功能进行打包

    将代码按照功能分成不同的包是一种常见的模式,通常会根据技术层次(如 controllers, services, repositories等)进行划分。如果你正在构建一个专注于特定模块或业务能力的微服务,那么这种方法可能是可行的。

    如果你正在构建一个单体应用或者模块化单体应用,强烈建议首先按照功能而非技术层进行划分。

    详细信息请阅读链接: https://phauer.com/2020/package-by-feature/

  2. “应用核心”独立于交付机制(Web, Scheduler Jobs, CLI)

    应用核心应该公开可以从主方法调用的API。为了实现这一点,“应用核心”不应该依赖于其调用上下文。这意味着“应用核心”不应依赖于任何HTTP/Web层的库。同样,如果你的应用核心被用于定时任务或命令行接口,任何调度逻辑或命令行执行逻辑都不应泄露到应用核心中。

  3. 将业务逻辑执行与输入源(Web Controllers, Message Listeners, Scheduled Jobs等)分离

    输入源,如Web Controllers, Message Listeners, Scheduled Jobs等,应该是很薄的一层,在提取请求数据后将实际的业务逻辑执行委托给“应用核心”。

比如:

坏味道:

@RestController
class CustomerController {
   
    private final CustomerService customerService;
    
    @PostMapping("/api/customers")
    void createCustomer(@RequestBody Customer customer) {
   
       if(customerService.existsByEmail(customer.getEmail())) {
   
           throw new EmailAlreadyInUseException(customer.getEmail());
       }
       customer.setCreateAt(Instant.now());
       customerService.save(customer);
    }
}

纠正:

@RestController
class CustomerController {
   
    private final CustomerService customerService;
    
    @PostMapping("/api/customers")
    void createCustomer(@RequestBody Customer customer) {
   
       customerService.save
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值