当前位置:主页 > 查看内容

DDD系列第五讲:聊聊如何避免写流水账代码

发布时间:2021-08-16 00:00| 位朋友查看

简介:向读者们道歉由于工作太忙又对文章质量有追求所以这篇文章产出速度较慢但可以向大家保证文章中的内容都经过了反复实践和踩坑。DDD系列的前几篇文章可以点击文字下方阅读~ DDD系列第一讲 DDD系列第二讲 DDD系列第三讲 DDD系列第四讲 在过去一年里我们团队做了……

向读者们道歉,由于工作太忙,又对文章质量有追求,所以这篇文章产出速度较慢,但可以向大家保证:文章中的内容都经过了反复实践和踩坑。DDD系列的前几篇文章可以点击文字下方阅读~

DDD系列第一讲

DDD系列第二讲

DDD系列第三讲

DDD系列第四讲

在过去一年里我们团队做了大量的老系统重构和迁移,其中有大量的代码属于流水账代码,通常能看到是开发在对外的API接口里直接写业务逻辑代码,或者在一个服务里大量的堆接口,导致业务逻辑实际无法收敛,接口复用性比较差。所以这讲主要想系统性的解释一下如何通过DDD的重构,将原有的流水账代码改造为逻辑清晰、职责分明的模块。

案例简介

这里举一个简单的常见案例:下单链路。假设我们在做一个checkout接口,需要做各种校验、查询商品信息、调用库存服务扣库存、然后生成订单:

一个比较典型的代码如下:

@RestController
@RequestMapping("/")
public class CheckoutController {


    @Resource
    private ItemService itemService;


    @Resource
    private InventoryService inventoryService;


    @Resource
    private OrderRepository orderRepository;


    @PostMapping("checkout")
    public Result<OrderDO> checkout(Long itemId, Integer quantity) {
        // 1) Session管理
        Long userId = SessionUtils.getLoggedInUserId();
        if (userId <= 0) {
            return Result.fail("Not Logged In");
        }
        
        // 2)参数校验
        if (itemId <= 0 || quantity <= 0 || quantity >= 1000) {
            return Result.fail("Invalid Args");
        }


        // 3)外部数据补全
        ItemDO item = itemService.getItem(itemId);
        if (item == null) {
            return Result.fail("Item Not Found");
        }


        // 4)调用外部服务
        boolean withholdSuccess = inventoryService.withhold(itemId, quantity);
        if (!withholdSuccess) {
            return Result.fail("Inventory not enough");
        }
      
        // 5)领域计算
        Long cost = item.getPriceInCents() * quantity;


        // 6)领域对象操作
        OrderDO order = new OrderDO();
        order.setItemId(itemId);
        order.setBuyerId(userId);
        order.setSellerId(item.getSellerId());
        order.setCount(quantity);
        order.setTotalCost(cost);


        // 7)数据持久化
        orderRepository.createOrder(order);


        // 8)返回
        return Result.success(order);
    }
}
;原文链接:https://blog.csdn.net/Taobaojishu/article/details/115911833
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:Kafka -- 从基础到高级 下一篇:没有了

推荐图文


随机推荐